1、第第9章章 人机对战井字棋游戏人机对战井字棋游戏主讲主讲 夏敏捷夏敏捷计算机学院副教授计算机学院副教授9.1 人机对战井字棋游戏功能人机对战井字棋游戏。在九宫方格内进行,如果一方首先某方向(横、竖、斜)连成3子,则获取胜利。游戏中输入方格位置代号,形式如下:游戏中,board棋盘存储玩家、电脑落子信息,未落子处为EMPTY。由于人机对战,需要实现电脑智能性,下面是为这个电脑机器人设计的简单策略:(1)如果有一步棋可以让电脑机器人在本轮获胜,就选那一步走。(2)否则,如果有一步棋可以让玩家在本轮获胜,就选那一步走。(3)否则,电脑机器人应该选择最佳空位置来走。最佳位置就是中间那个,第二好位置是四
2、个角,剩下的就都算第三好的了。9.2 人机对战井字棋游戏设计思想9.3 对战井字棋游戏设计步骤1 1确定谁先走确定谁先走#询问玩家你是否先走def ask_yes_no(question):response=None while response not in(y,n):#如果输入不是y,n,继续重新输入 response=input(question).lower()return response#询问谁先走,先走方为X,后走方为O#函数返回电脑方、玩家的角色代号def pieces():go_first=ask_yes_no(玩家你是否先走(y/n):)if go_first=y:prin
3、t(n玩家你先走.)human=X computer=O else:print(n电脑先走.)computer=X human=O return computer,human9.3 对战井字棋游戏设计步骤2 2产生新的保存走棋信息列表和显示棋盘产生新的保存走棋信息列表和显示棋盘#产生保存走棋信息列表boarddef new_board():board=for square in range(9):board.append(EMPTY)return board#显示棋盘def display_board(board):board2=board:#创建副本,修改不影响原来列表board for i
4、 in range(len(board):if boardi=EMPTY:board2i=i print(t,board20,|,board21,|,board22)print(t,-)print(t,board23,|,board24,|,board25)print(t,-)print(t,board26,|,board27,|,board28,n)9.3 对战井字棋游戏设计步骤3 3产生可以合法走棋位置序列产生可以合法走棋位置序列#产生可以合法走棋位置序列(也就是还未下过子位置)def legal_moves(board):moves=for square in range(9):if b
5、oardsquare=EMPTY:moves.append(square)return moves9.3 对战井字棋游戏设计步骤4 4玩家走棋玩家走棋def human_move(board,human):#人走棋 legal=legal_moves(board)move=None while move not in legal:move=ask_number(你走那个位置?(0-8):,0,9)if move not in legal:print(n此位置已经落过子了)#print(Fine.)return move#输入位置数字def ask_number(question,low,hig
6、h):response=None while response not in range(low,high):response=int(input(question)return response9.3 对战井字棋游戏设计步骤5 5电脑电脑AIAI人工智能走棋人工智能走棋#电脑走棋def computer_move(board,computer,human):#make a copy to work with since function will be changing list board=board:#创建副本,修改不影响原来列表board#按优劣顺序排序的下棋位置 BEST_MOVES
7、=(4,0,2,6,8,1,3,5,7)#最佳下棋位置顺序表#如果电脑能赢,就走那个位置 for move in legal_moves(board):boardmove=computer if winner(board)=computer:print(电脑下棋位置.,move)return move#取消走棋方案 boardmove=EMPTY 9.3 对战井字棋游戏设计步骤5 5电脑电脑AIAI人工智能走棋人工智能走棋#如果玩家能赢,就堵住那个位置 for move in legal_moves(board):boardmove=human if winner(board)=human:p
8、rint(电脑下棋位置.,move)return move#取消走棋方案 boardmove=EMPTY#不是上面情况则,也就是这一轮时都赢不了则#从最佳下棋位置表中挑出第一个合法位置 for move in BEST_MOVES:if move in legal_moves(board):print(电脑下棋位置.,move)return move9.3 对战井字棋游戏设计步骤6 6判断输赢判断输赢如果满足某种赢的情况,则返回赢方代号X,O。如果棋盘没有空位置则返回TIE代表和局。不是前面情况则返回False,表示游戏可以继续。def winner(board):#所有赢的可能情况,例如(0
9、,1,2)就是第一行,(0,4,8),(2,4,6)就是对角线 WAYS_TO_WIN=(0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6)for row in WAYS_TO_WIN:if boardrow0=boardrow1=boardrow2!=EMPTY:winner=boardrow0 return winner#返回赢方#棋盘没有空位置 if EMPTY not in board:return TIE#平局和棋,游戏结束 return False7 7主函数主函数主函数是一个循环实现玩家和电脑的轮流下棋。当
10、判断winner(board)False继续游戏,否则结束循环。游戏结束后输出输赢或和棋信息。def main():computer,human=pieces()turn=X board=new_board()display_board(board)while not winner(board):#当返回False继续,否则结束循环 if turn=human:move=human_move(board,human)boardmove=human else:move=computer_move(board,computer,human)boardmove=computer display_bo
11、ard(board)turn=next_turn(turn)#转换角色#游戏结束后输出输赢或和棋信息 the_winner=winner(board)if the_winner=computer:print(电脑赢!n)elif the_winner=human:print(玩家赢!n)elif the_winner=TIE:#平局和棋 print(平局和棋,游戏结束n)#转换角色def next_turn(turn):if turn=X:return O else:return X9.3 对战井字棋游戏设计步骤8 8主程序主程序#主程序,很简单就是调用main()函数#start the programmain()input(按任意键退出游戏.)
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。