暂无分类
暂无标签
发布于2020-09-30 20:07 阅读(874) 评论(0) 点赞(9) 收藏(1)
0
1
2
3
4
5
6
7
游戏介绍:游戏在九块方格中进行,如果一方抢先在某个方向上(横、竖、斜)连出了3个棋子,就取得胜利。
游戏进行方法是输入方格的位置代号(从0~8)。
游戏效果:
游戏实现:序列board代表棋盘,存储玩家、电脑的落子信息,未落棋子的地方是EMPTY。
对于电脑简单的人工智能操作:
1.如果一步棋可以让电脑在本轮次获胜,就走那一步。
2.如果有一步棋可以让玩家在本轮次获胜,电脑就走那一步,堵住那个位置。
3.否则,就选择走最佳位置。最佳位置(空的)是最中间的格子,第二好的是四个棋盘角落,剩下都是一样的等级。
想实现电脑智能,就要对于井字棋做出输赢判断。这里井字棋只有8种情况表示获胜,即3颗相同棋子连成一条线。可以定义一个元组存储获胜的8种情况。
代码实现:
X = 'X' # 定义全局常量
O = '#'
EMPTY = ' '
def new_board(): # 创建新的空棋盘的函数
board = []
for i in range(9): # 9个格子
board.append(EMPTY) # 先把格子都初始化为空
return board # 返回新棋盘
def display(board): # 打印棋盘的函数
board2 = board[:] # 创建副本,对副本修改不影响原来的列表board
for i in range(len(board)):
if board[i] == EMPTY:
board2[i] = i
print('\t', board2[0], '|', board2[1], '|', board2[2])
print('\t', '---------')
print('\t', board2[3], '|', board2[4], '|', board2[5])
print('\t', '---------')
print('\t', board2[6], '|', board2[7], '|', board2[8])
print('\t', '---------')
def result(board): # 判断游戏结果的函数
WINNER = ((3, 4, 5), (0, 1, 2), (6, 7, 8), (0, 3, 6), (1, 4, 7), (2, 5, 8), (0, 4, 8), (2, 4, 6)) # 存储所有可能获胜的情况
for win in WINNER:
if board[win[0]] == board[win[1]] == board[win[2]] != EMPTY: # 判断不能为空
winner = board[win[0]] # 全局常量区分电脑和玩家
return winner
if EMPTY not in board: # 棋盘满了
return '平局'
return False
def move(board): # 判断位置是否为空(即是否可以落棋)的函数
move = []
for tep in range(9):
if board[tep] == EMPTY:
move.append(tep)
return move
def computer_move(board, computer, human): # 电脑走棋函数
board2 = board[:] # 创建副本,不影响原来的board
BEST = (4, 0, 2, 6, 8, 1, 3, 5, 7) # 定义一个最佳下棋位置表
for tep in move(board):
board[tep] = computer
if result(board) == computer: # 如果电脑能赢,就走那个位置
print('电脑下棋:', tep)
return tep
board[tep] = EMPTY # 取消走棋
for tep in move(board):
board[tep] = human
if result(board) == human: # 如果玩家能赢,就堵住那个位置
print('电脑下棋:', tep)
return tep
board[tep] = EMPTY # 取消走棋
for i in range(len(BEST)):
for tep in move(board):
if tep == BEST[i]: # 如果电脑能赢,就走那个位置
board[tep] = computer
print('电脑下棋:', board[i])
return tep
board[tep] = EMPTY
def human_move(board, human): # 玩家走棋函数
legal = move(board)
tep = None
while tep not in legal:
tep = int(input('棋子落在哪里?(0~8)'))
if tep not in legal:
print('\n这个位置已经有棋子了!')
return tep
def go(): # 询问谁先出发的函数
first = input('玩家你是否先落棋?(y/n):')
if first == 'y':
print('\n玩家先落棋')
human = X
computer = O # 先落棋的一方计作X
else:
print('\n电脑先落棋')
computer = X
human = O
return computer, human
board = new_board() # 初始化一个空棋盘
display(board) # 打印棋盘界面
computer, human = go() # 决定谁先走
turn = X # 先走的一方计作X
while not result(board): # 没有人获胜的时候就继续
if turn == human:
tep = human_move(board, human)
board[tep] = human # 更改棋盘
turn = computer # 交换顺序
else:
tep = computer_move(board, computer, human)
board[tep] = computer
turn = human
display(board) # 落一次棋就打印一次棋盘
winner = result(board)
if winner == computer:
print('电脑获胜了!\n')
elif winner == human:
print('玩家获胜了!\n')
elif winner == '平局':
print('平局了!\n')
原文链接:https://blog.csdn.net/weixin_45832571/article/details/108859675
0
1
2
3
4
作者:你太美丽
链接: https://www.pythonheidong.com/blog/article/555287/59e9db65d219e3860477/
来源: python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
Copyright © 2018-2019 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系z452as@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!