为了更好的在主函数中规划和控制整个游戏的代码,编写类Game,在里面调用之前写好的功能函数,然后分别绘制棋盘、按钮和判断获胜的一方。
Game的具体实现流程:
初始化函数处理
主要是设置按钮的内容和可用性
class Game: #pagame类,以下所有功能都是根据需要重写
def __int__(self,caption):
pygame.init()
self.screen=pygame.display.set_mode([screen_w,screen_h])
pygame.display.set_caption(caption)
self.clock=pygame.time.Clock()
self.buttons=[]
self.buttons.append(WhiteStartButton(self.screen,'选择白棋',20,map_h))
self.buttons.append(BlackStartButton(self.screen,'选择黑棋',190,map_h))
self.buttons.append(GiveupButton(self.screen,'放弃',360,map_h))
self.buttons.append(MultiStartButton(self.screen,'Multiple',530,map_h))
self.is_play=False
self.map=Map(web_broad,web_broad)
self.player=map_enum.player1
self.action=None
self.AI=MyChessAI(web_broad)
self.useAI=False
self.winner=None
self.multiple=False
“开始游戏”的功能实现
def start(self):
self.is_play=True
self.player=map_enum.player1 #白棋先手
self.map.get_init()
绘制出棋盘和按钮
def play(self):
#画底板
self.clock.tick(60)
wood_color=(210,180,140)
pygame.draw.rect(self.screen,wood_color,pygame.Rect(0,0,map_w,screen_h))
pygame.draw.rect(self.screen,(255,255,255),pygame.Rect(map_w,0,info_w,screen_h))
#画按钮
for button in self.buttons:
button.draw()
if self.is_play and not self.isOver():
if self.useAI and not self.multiple:
x,y=self.AI.findBestChess(self.map.map,self.player)
self.checkClick(x,y,True)
self.useAI=False
if self.action is not None:
self.checkClick(self.action[0],self.action[1])
self.action=None
if not self.isOver():
self.changeMouseShow()
if self.isOver():
self.showWinner()
self.map.drawBoard(self.screen)
self.map.printChessPiece(self.screen)
把鼠标指针切换成棋子的样子
def changeMouseShow(self):
map_x,map_y=pygame.mouse.get_pos()
x,y=self.map.getIndex(map_x,map_y)
if self.map.isInside(map_x,map_y) and self.map.isEmpty(x,y):
#在棋盘内且当前没有棋子
pygame.mouse.set_visible(False)
smoke_blue=(176,224,230)
pos,radius=(map_x,map_y),chess_size
pygame.draw.circle(self.screen,smoke_blue,pos,radius)
else:
pygame.mouse.set_visible(True)
def checkClick(self,x,y,isAI=False):
self.map.click(x,y,self.player)
if self.AI.isWin(self.map.map,self.player):
self.winner=self.player
self.click_button(self.buttons[2])
else:
self.player=self.map.intoNextTurn(self.player)
if not isAI:
self.useAI=True
处理下棋的动作
def mouseClick(self,map_x,map_y):
if self.is_play and self.map.isInside(map_x,map_y) and not self.isOver():
x,y=self.map.getIndex(map_x,map_y)
if self.map.isEmpty(x,y):
self.action=(x,y)
实现获胜时中断游戏的功能
def isOver(self):
return self.winner is not None
打印输出胜者
def showWinner(self):
def showFont(screen,text,location_x,location_y,height):
font=pygame.font.SysFont(None,height)
font_image=font.render(text,True,(255,215,0),(255,255,255))
font_image_rect=font_image.get_rect()
font_image_rect.x=location_x
font_image_rect.y=location_y
screen.blit(font_image,font_image_rect)
if self.winner==map_enum.player1:
set='白棋胜出'
else:
str='黑棋胜出'
showFont(self.screen,str,map_w/5,screen_h/8,100)