【Python】Reversi(黑白棋)小游戏游戏介绍Reversi(黑白棋或黑白棋)在西方和日本非常流行。游戏是通过互相翻转棋子来进行的,获胜者是根据谁在棋盘上的棋子较多来判断的。每一块黑白棋都是由黑白两色组成,一面是白色,另一面是黑色。每下一个棋子,将自己颜色的棋子放在棋盘上的空位上。如果横、竖、斜八个方向中的任何一个方向都有己方的棋子,夹在中间的对方棋子全部翻为己方的棋子。颜色;只有可以翻转的地方才能播放。如果一名棋手至少有一个合法的棋步可走,他必须在不弃权的情况下走棋。当棋盘满或双方无棋子可下时,游戏结束。以棋子数计算胜负,棋子多的一方获胜。当棋盘未满时,如果一方的棋子已被对方吃掉,则游戏结束,吃掉对方棋子的一方获胜。胜负由两名棋手轮流下棋,直到一方没有符合规则的棋局为止。在这种情况下,剩下的一方继续比赛,直到对方有可以放置的位置为止。至此,恢复两人轮流下棋的顺序。如果一方落在非法位置,则视为放弃比赛,另一方获胜。对局结束条件:整个棋盘已满,一方棋子被对方吃掉,且双方棋盘均无棋盘可下棋子。一方的棋子放置在非法位置。前三种情况,以棋子数计算胜负,棋子多的一方获胜;在第四种情况下,确定对方获胜。人机对弈流程首先,程序询问用户棋盘的大小。接下来,程序询问用户“计算机持有黑色或白色”。在这个程序中,我们使用字母“X”代表黑色,使用字母“O”代表白色,并假设总是黑色玩家先走。所以,如果电脑拿着黑色,电脑先走;否则,程序会提示人类玩家先走。在每一步,程序都会输出棋盘。黑白棋选手轮流下棋,直到一名选手按照规则没有位置为止。这时,程序输出信息“Oplayerhasnovalidmove”。(假设白方没有棋子可走),并提示黑方继续下棋。对于每一步,程序不仅会输出棋盘,还会检查游戏是否结束。如果程序检查到游戏结束,则输出输赢信息并终止程序。输赢信息可以是:“O玩家赢了。”,“X玩家赢了。”或“画!”。如果用户非法移动,程序应检测并输出“Invalidmove.”,结束程序,并宣布获胜者。计算机选择棋子位置的策略是尝试每一个可能的棋子位置,并计算该位置的“分数”(可以翻转对手的棋子数量)。分数越高,位置越有利。计算每个可能位置的分数,并选择移动的最大位置。注意:可能有2个或更多个具有相同分值的棋盘格。在这种情况下,选择行字母最小的棋盘格。如果两个棋盘的分数相同且在同一行,则选择列字母较小的棋盘。程序执行代码的完整代码见代码仓库中的棋盘代码#!/usr/bin/python#-*-coding:utf-8-*-classBoard():def__init__(self,n):self.n=n自我。board=self.generateBoard()self.chess={0:'.',1:'O',2:'X'}defgenerateBoard(self):#0空1白2黑i=int(self.n/2)board=[[0]*self.nfor_inrange(self.n)]board[i][i]=board[i-1][i-1]=1board[i][i-1]=board[i-1][i]=2返回板defdraw(self):index='abcdefghijklmnopqrstuvwxyz'print('',*index[:self.n])forh,rowinzip(index,self.board):print(h,*map('.OX'.__getitem__,row))print()游戏逻辑#!/usr/bin/python#-*-coding:utf-8-*-fromboardimportBoardimportitertoolsimportoperatorimportcollectionsfromfunctoolsimportreducefromconstantimportStatusclassReversi():_DIRECTIONS=[(1,0),(1,1),(1,-1),(-1,0),(-1,1),(-1,-1),(0,1),(0,-1)]def__init__(self,n,turn):self.n=n#棋盘维度self.b=Board(n)#棋盘self.turn=0ifturn=='X'orturn=='x'else1#playerturnself.step=1#gamestepself.status=Status.WAIT#游戏状态defisValidPosition(self,x,y):return0<=x
