引言:近几年来人工智能的发展很火热,尤其是AI游戏决策方面。像王者荣耀的高级人机等等都得益于人工智能的发展。今天我们就将把一个游戏改成AI自动玩取得。
本文就将利用DQN算法玩转小时候经典的游戏-俄罗斯方块游戏。
其中代码分为下面几个步骤:
1、预准备:
import cv2
import numpy as np
2、 定义初始函数奖励机制:
def __init__(self):
self.screen = np.ones((100, 100), np.float32) * 255
self.screen = cv2.cvtColor(self.screen, cv2.COLOR_GRAY2BGR)
self.steps = 0
def frame_step(self, input_vec):
reward = -1
if self.screen[0,0,0] == 255:
if input_vec[1] == 1:
reward = 1
self.screen *= (1./255.)
elif input_vec[0] == 1:
reward = 0
else:
if input_vec[2] == 1:
reward = 1
self.screen *= 255
elif input_vec[0] == 1:
reward = 0
self.steps += 1
terminal = False
if self.steps >= 10:
self.steps = 0
terminal = True
return self.screen, reward, terminal
3、 游戏部分代码:
import random, time, pygame, sys
from pygame.locals import *
FPS = 25
WINDOWWIDTH = 640
WINDOWHEIGHT = 480
BOXSIZE = 20
BOARDWIDTH = 10
BOARDHEIGHT = 20
BLANK = '.'
MOVESIDEWAYSFREQ = 0.15
MOVEDOWNFREQ = 0.1
XMARGIN = int((WINDOWWIDTH - BOARDWIDTH * BOXSIZE) / 2)
TOPMARGIN = WINDOWHEIGHT - (BOARDHEIGHT * BOXSIZE) - 5
gamma = 4
# R G B
WHITE = (255, 255, 255)
GRAY = (185, 185, 185)
BLACK = ( 0, 0, 0)
RED = (155, 0, 0)
LIGHTRED = (175, 20, 20)
GREEN = ( 0, 155, 0)
LIGHTGREEN = ( 20, 175, 20)
BLUE = ( 0, 0, 155)
LIGHTBLUE = ( 20, 20, 175)
YELLOW = (155, 155, 0)
LIGHTYELLOW = (175, 175, 20)
BORDERCOLOR = BLUE
BGCOLOR = BLACK
TEXTCOLOR = WHITE
TEXTSHADOWCOLOR = GRAY
COLORS = ( BLUE, GREEN, RED, YELLOW)
LIGHTCOLORS = (LIGHTBLUE, LIGHTGREEN, LIGHTRED, LIGHTYELLOW)
assert len(COLORS) == len(LIGHTCOLORS) # each color must have light color
TEMPLATEWIDTH = 5
TEMPLATEHEIGHT = 5
S_SHAPE_TEMPLATE = [['..OO.',
'.OO..',
'.....',
'.....',
'.....'],
['..O..',
'..OO.',
'...O.',
'.....',
'.....']]
Z_SHAPE_TEMPLATE = [['.OO..',
'..OO.',
'.....',
'.....',
'.....'],
['..O..',
'.OO..',
'.O...',
'.....',
'.....']]
I_SHAPE_TEMPLATE = [['..O..',
'..O..',
'..O..',
'..O..',
'.....'],
['OOOO.',
'.....',
'.....',
'.....',
'.....']]
O_SHAPE_TEMPLATE = [['.OO..',
'.OO..',
'.....',
'.....',
'.....']]
J_SHAPE_TEMPLATE = [['.O...',
'.OOO.',
'.....',
'.....',
'.....'],
['..OO.',
'..O..',
'..O..',
'.....',
'.....'],
['.OOO.',
'...O.',
'.....',
'.....',
'.....'],
['..O..',
'..O..',
'.OO..',
'.....',
'.....']]
L_SHAPE_TEMPLATE = [['...O.',
'.OOO.',
'.....',
'.....',
'.....'],
['..O..',
'..O..',
'..OO.',
'.....',
'.....'],
['.OOO.',
'.O...',
'.....',
'.....',
'.....'],
['.OO..',
'..O..',
'..O..',
'.....',
'.....']]
T_SHAPE_TEMPLATE = [['..O..',
'.OOO.',
'.....',
'.....',
'.....'],
['..O..',
'..OO.',
'..O..',
'.....',
'.....'],
['.OOO.',
'..O..',
'.....',
'.....',
'.....'],
['..O..',
'.OO..',
'..O..',
'.....',
'.....']]
PIECES = {'S': S_SHAPE_TEMPLATE,
'Z': Z_SHAPE_TEMPLATE,
'J': J_SHAPE_TEMPLATE,
'L': L_SHAPE_TEMPLATE,
'I': I_SHAPE_TEMPLATE,
'O': O_SHAPE_TEMPLATE,
'T': T_SHAPE_TEMPLATE}