Following is an example of a simple game which could be used to train agents.
import pygame as pg
from pygame.locals import *
import sys
import random
def new_rect_after_action(newrct, act):
if act == 'right':
if newrct.right + newrct.width > windowWidth:
return newrct
else:
return pg.Rect(newrct.left + newrct.width, newrct.top, newrct.width,
newrct.height) # Rect(left, top, width, height)
else: # action is left
if newrct.left - newrct.width < 0:
return newrct
else:
return pg.Rect(newrct.left - newrct.width, newrct.top, newrct.width,
newrct.height) # Rect(left, top, width, height)
def circle_falling(crclradius):
newx = random.randint(0 + crclradius, 200 - crclradius)
multiplier = random.randint(1, 4)
newx *= multiplier
return newx
windowWidth = 800
windowHeight = 400
FPS = 3 # frames per second setting
fpsClock = pg.time.Clock()
pg.init()
window = pg.display.set_mode((windowWidth, windowHeight)) # width, height
pg.display.set_caption('Catch the ball!')
# setup colors
RED = (255, 0, 0)
GREEN = (0, 255, 0)
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
# specify circle properties
crclCentreX = 50
crclCentreY = 50
crclRadius = 20
# specify rectangle properties
rctLeft = 400
rctTop = 350
rctWidth = 200
rctHeight = 50
rct = pg.Rect(rctLeft, rctTop, rctWidth, rctHeight) # Rect(left, top, width, height)
action = 'left'
score = 0
font = pg.font.Font(None, 30)
while True:
for event in pg.event.get():
if event.type == QUIT:
pg.quit()
sys.exit()
elif event.type == pg.KEYDOWN:
if event.key == pg.K_LEFT:
action = 'left'
rct = new_rect_after_action(rct, action)
elif event.key == pg.K_RIGHT:
action = 'right'
rct = new_rect_after_action(rct, action)
window.fill(BLACK)
# at this position, the rectangle should be here. else loses
if crclCentreY >= windowHeight - rctHeight - crclRadius:
if rct.left <= crclCentreX <= rct.right:
score += 1
else:
score -= 1
crclCentreX = circle_falling(crclRadius)
crclCentreY = 50
else:
crclCentreY += 20
pg.draw.circle(window, RED, (crclCentreX, crclCentreY),
crclRadius) # circle(Surface, color, pos(x, y), radius, width=0)
pg.draw.rect(window, GREEN, rct) # rect(Surface, color, Rect, width=0)
text = font.render('score: ' + str(score), True, (238, 58, 140))
window.blit(text, (windowWidth - 100, 10))
pg.display.update()
fpsClock.tick(FPS)
This will create a game window that looks like the following screenshot.
The green rectangle can be moved with left and right arrow of the keyboard. If the player can place it under the falling red circle, he gets a point, else loses one. That's all there is in this game.
In the second part of this tutorial, we will add intelligence and train an agent to play this game.
Update: Second part is now available:
http://anixtech.blogspot.com/2016/12/reinforcement-learning-with-pygame.html