## ~ Pygame and Python - creating a game with various features

Game set up in pygame - create main character with movement

### Create an enemy stickman (blue) and track his random movement by printing coordinates to the screen

In this section, we simply add an additional stick man (this time an enemy - bigger and blue!) to the screen. The movement for the enemy stickman is random. We print both the coordinates for the main player stickman to the screen along with the random enemy movement coordinates. This will help you see the "behind the scenes" functionality of the game, and what is actually happening mathematically, in terms of the x,y positions of the players.

### Code

```import pygame
import random

# Define some colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)

#Set the max speed the player can move - changing this value can increase/decrease difficulty
PLAYER_SPEED = 5

#set the max speed the AI can move - changing this value can increase/decrease difficulty
AI_SPEED = 5

#This function draws the smaller user-controllable stick figure on the screen
#Colour and scale paramaters have been added to the stick figure so that different varieties of stick figure
#Can be produced whilst using the same function, with the scale being used
#to adjust the size of the stick figure, and the colour being used to set the colour of the stick figures body.
def draw_stick_figure(screen, x, y, colour, scale):
#Each value is adjusted by the scale paramater to adjust the size of the stick figure
#We have to convert this value to an int as scale may be a float, a type that is not
#accepted by pygame.draw.ellipse
pygame.draw.ellipse(screen, BLACK, [int(1 * scale) + x, y, int(10 * scale), int(10 * scale)], 0)
print(x,y)

# Legs
#Right leg (colour, length of leg....)
pygame.draw.line(screen, BLACK, [int(5 * scale) + x, int(17 * scale) + y], [int(10 * scale) + x, int(27 * scale) + y], int(2 * scale))
#Left Leg
pygame.draw.line(screen, BLACK, [int(5 * scale) + x, int(17 * scale) + y], [x, int(27 * scale) + y], int(2 * scale))

# Body
pygame.draw.line(screen, colour, [int(5 * scale) + x, int(17 * scale) + y], [int(5 * scale) + x, int(7 * scale) + y], int(2 * scale))

# Arms
pygame.draw.line(screen, colour, [int(5 * scale) + x, int(7 * scale) + y], [int(9 * scale) + x, int(17 * scale) + y], int(2 * scale))
pygame.draw.line(screen, colour, [int(5 * scale) + x, int(7 * scale) + y], [int(1 * scale) + x, int(17 * scale) + y], int(2 * scale))

#This function ensures that the number entered is between the range of the min and max values (inclusive).
#If the number is outside of this range, we return the closest allowed value. I.e. if the max was 10 and the number
#entered was 12, 10 would be returned as this is the maximum value allowed
def keep_in_range(number, min_no, max_no):
if (number < min_no):
return min_no
elif (number > max_no):
return max_no
else:
return number

# Setup
pygame.init()

# Set the width and height of the screen [width,height]

screen_size = [700, 500]
screen = pygame.display.set_mode(screen_size)

pygame.display.set_caption("My Game")

# Loop until the user clicks the close button.
done = False

# Used to manage how fast the screen updates
clock = pygame.time.Clock()

#Counts the number of times the screen has been redrawn, incremented for every pygame.display.flip()
step = 0

# Hide the mouse cursor
pygame.mouse.set_visible(0)

# Speed in pixels per frame
x_speed = 0
y_speed = 0

# Current position
x_coord = 300
y_coord = 1

#AI Players current position
ai_x_coord = 300
ai_y_coord = 300

#The AI players last position
old_ai_x_coord = 300
old_ai_y_coord = 300

ai_moves = (-AI_SPEED, 0, AI_SPEED) #A list of moves that the ai player can make each turn

#stores the current direction the ai character is moving
ai_x_direction = 0
ai_y_direction = 0

# -------- Main Program Loop -----------
while not done:
# --- Event Processing
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
# User pressed down on a key

elif event.type == pygame.KEYDOWN:
# Figure out if it was an arrow key. If so
if event.key == pygame.K_LEFT:
x_speed = -PLAYER_SPEED
elif event.key == pygame.K_RIGHT:
x_speed = PLAYER_SPEED
elif event.key == pygame.K_UP:
y_speed = -PLAYER_SPEED
elif event.key == pygame.K_DOWN:
y_speed = PLAYER_SPEED

# User let up on a key
elif event.type == pygame.KEYUP:
# If it is an arrow key, reset vector back to zero
if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
x_speed = 0
elif event.key == pygame.K_UP or event.key == pygame.K_DOWN:
y_speed = 0

# --- Game Logic

# Move the object according to the speed vector.
x_coord = x_coord + x_speed
y_coord = y_coord + y_speed

if (x_coord < 0):
x_coord = 0

if (y_coord < 0):
y_coord = 0

#Adjust the x and y co-ordinates to ensure that the stick figure is kept on the screen and can't
#travel off of it
x_coord = keep_in_range(x_coord, 0, screen_size[0] - 10) #We adjust the upper limit of our allowed range to match the stick figures width
y_coord = keep_in_range(y_coord, 0, screen_size[1] - 27) #We adjust the upper limit of our allowed range to match the stick figures height

#Every 30 steps (screen draws) we change the direction the ai player is moving in
#This makes the movement of the ai player look more realistic. This works because
#step % 30 is gives the remained when the value step is divided by 30, which will only
#occur every 30 steps. You can experiment with changing this value and seeing how the ai
#character moves
if (step % 30 == 0):
ai_x_direction = random.choice(ai_moves)
ai_y_direction = random.choice(ai_moves)

#Update the old ai co-ordinate values
old_ai_x_coord = ai_x_coord
old_ai_y_coord = ai_y_coord

#move the ai player in the chosen direction
ai_x_coord = ai_x_coord + ai_x_direction
ai_y_coord = ai_y_coord + ai_y_direction

#Limit the ai character to ensure it stays on the screen
ai_x_coord = keep_in_range(ai_x_coord, 0, screen_size[0] - 20)
ai_y_coord = keep_in_range(ai_y_coord, 0, screen_size[1] - 54)

#If our x co-ordinate has not changed, then we could have collided with a screen edge so we reverse the direction
#This helps to keep the movement looking natural by preventing the ai player from repeatedly
#moving along the edge of the screen
if (ai_x_coord == old_ai_x_coord):
ai_x_direction *= -1;
#the same is true for the y co-ordinate
if (ai_y_coord == old_ai_y_coord):
ai_y_direction *= -1;

# --- Drawing Code

# First, clear the screen to WHITE. Don't put other drawing commands
# above this, or they will be erased with this command.
screen.fill(WHITE)

draw_stick_figure(screen, x_coord, y_coord, RED, 1) #draw the user controlled stick figure on the screen
draw_stick_figure(screen, ai_x_coord, ai_y_coord, BLUE, 2) #draw the ai controlled stick figure on the screen

# Go ahead and update the screen with what we've drawn.
pygame.display.flip()
step += 1#increment step

# Limit frames per second
clock.tick(60)

# Close the window and quit.
pygame.quit()

```