python 井字棋-文字版(下)
时间:2022-07-27
本文章向大家介绍python 井字棋-文字版(下),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
上篇文章 python 井字棋-文字版(上)电脑端下棋策略是随机的,有哪些位置可下棋,就随机选择一个位置;
实际中是不存这么傻的对手的,赋予电脑一个正常的智商还是很有必要的:
- 至少当对手下一步要赢了,我们应该马上堵住哪个位置;
- 如果电脑自己能赢了,那就应该下能够赢的位置;
- 如果双方都赢不了,那就找一个比较好的位置下棋,占据有利的局势;
这样简单的几个策略,就让电脑具备一点AI效果了,
在非常明显情况下,电脑是不会输的;绝大数情况下能保持不败。
完整代码
想要做的更好,可以自己修改提示说明,玩法说明等等
import random
def display_instruct():
print("游戏规则")
def new_board():
return [" "]*9
def display_board(board):
print(
f"""
|{board[0]}|{board[1]}|{board[2]}|
|{board[3]}|{board[4]}|{board[5]}|
|{board[6]}|{board[7]}|{board[8]}|
"""
)
def pieces():
is_go_first = input("你想要先走吗? (y/n): ").lower()
if is_go_first == "y":
human,computer = "X","O"
else:
human, computer = "O", "X"
return human, computer
def legal_moves(board):
moves = []
for move in range(9):
if board[move] ==" ":
moves.append(move)
return moves
def human_move(board):
legal =legal_moves(board)
move = int(input("你要走哪个位置? (0 - 8):"))
while move not in legal:
move = int(input("你要走哪个位置? (0 - 8):"))
return move
def computer_move(board, computer, human):
# 复制棋盘
board = board[:]
# 最优的位置
best_moves = (4, 0, 2, 6, 8, 1, 3, 5, 7)
# 如果电脑可以赢,就下该位置
for move in legal_moves(board):
board[move] = computer
if winner(board) == computer:
return move
# 测试不行,取消重来
board[move] = " "
# 如果玩家可以赢,就下该位置
for move in legal_moves(board):
board[move] = human
if winner(board) == human:
return move
# 测试不行,取消重来
board[move] = " "
# 如果双方都不行,选择最优位置下棋
for move in best_moves:
if move in legal_moves(board):
return move
def next_turn(turn):
if turn == "X":
return "O"
else:
return "X"
def winner(board):
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 board[row[0]] == board[row[1]] == board[row[2]] != " ":
winner = board[row[0]]
return winner
if " " not in board:
return "平局"
return None
def congrat_winner(winner,human,computer):
if winner!="平局":
print(winner, "won!n")
else:
print("这是一场平局")
if winner == human:
print("恭喜你获得胜利!!")
elif winner == computer:
print("你输了!")
display_instruct()
human,computer = pieces()
turn = "X"
board = new_board()
display_board(board)
while not winner(board):
if turn ==human:
move = human_move(board)
board[move] =human
else:
move = computer_move(board, computer, human)
board[move] = computer
display_board(board)
turn = next_turn(turn)
the_winner = winner(board)
congrat_winner(the_winner,human,computer)
当然这只是针对井字棋这种步骤比较有限的棋;
要是五子棋,那么电脑需要计算的步骤就会比较多了,判断赢的情况也会更复杂了,感兴趣的可以思考一下五子棋游戏的实现;
- 棋盘采取那种数据结构?
- 如何判断输赢?
- 电脑下棋策略?
下篇-python五子棋(上)
我的代码运行效果如下:
x赢了
具体棋盘实现和输赢判断实现下篇文章讲解。
(全文完)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux下通过sed命令对kv方式的配置文件进行修改
- laravel5.6框架操作数据curd写法(查询构建器)实例分析
- PHP基于timestamp和nonce实现的防止重放攻击方案分析
- 怎么在 Linux 中查找一个命令或进程的执行时间
- laravel5.6 框架邮件队列database驱动简单demo示例
- php layui实现前端多图上传实例
- 解决Centos7下crontab+shell脚本定期自动删除文件问题
- PHP使用ajax的post方式下载excel文件简单示例
- laravel邮件发送的实现代码示例
- php curl发送请求实例方法
- ubuntn备份办法总结(四种)
- PHP中散列密码的安全性分析
- php的RSA加密解密算法原理与用法分析
- PHP实现微信提现(企业付款到零钱)
- centos7下rsync+crontab定期同步备份