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
No comments:
Post a Comment