python井字棋游戏实现人机对战


Posted in Python onApril 28, 2022

游戏简介:在九宫格内进行,如果一方抢先于另一方向(横、竖、斜)连成3子,则获得胜利。游戏中输入方格位置代号的形式如下:

python井字棋游戏实现人机对战

设计前的思路:

游戏中,board棋盘存储玩家、计算机的落子信息,未落子处未EMPTY。由于人机对战,需要实现计算机智能性,下面是为这个计算机机器人设计的简单策略:
如果有一步棋可以让计算机机器人在本轮获胜,那就选那一步走。
否则,如果有一步棋可以让玩家在本轮获胜,那就选那一步走。
否则,计算机机器人应该选择最佳位置来走。
最佳位置就是中间,其次是四个角
定义第一个元组best_weizhi存储最佳方格位置:
按优劣顺序排序的下棋位置
best_weizhi= (4, 0, 2, 6, 8, 1, 3, 5, 7)
井字棋盘输赢判断规则只有8种方式。每种获胜方式都被写成一个元组,利用嵌套元组表达:
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))

代码:

#全局常量
best_weizhi= (4, 0, 2, 6, 8, 1, 3, 5, 7)
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)) 
X = "X"
O = "O"
EMPTY = " "
#定义函数产生一个新的棋盘
def new_board():
    board = []
    for square in range(9):
        board.append(EMPTY)
    return board
#询问该谁下棋
def ask_yes_no(question):
    response = None
    #如果输入不是"y", "n",继续重新输入
    while response not in ("y", "n"):    
           response = input(question).lower()
    return response
#询问谁先走,先走方为X,后走方为O
#函数返回电脑方、玩家的角色代号
def pieces():
    go_first = ask_yes_no("玩家你是否先走 (y/n): ")
    if go_first == "y":
        print("\n玩家你先走.")
        human = X
        computer = O
    else:
        print("\n电脑先走.")
        computer = X
        human = O
    return computer, human
#显示棋盘
def display_board(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], "\n")
#输入你想下的位置数字
def ask_number(question, low, high):
    response = None
    while response not in range(low, high):
        response = int(input(question))
    return response
#产生可以合法走棋位置序列(也就是还未下过子位置)
def legal_moves(board):
    moves = []
    for i in range(9):
        if board[i] == EMPTY:
            moves.append(i)
    return moves
#判断输赢
def winner(board):
    for row in win:
        if board[row[0]] == board[row[1]] == board[row[2]] != EMPTY:
            winner = board[row[0]]
            return winner       #返回赢方
    #棋盘没有空位置
    if EMPTY not in board:
        return "True"            #"平局和棋,游戏结束"
    return False
#人走棋
def human_move(board, human):
    legal = legal_moves(board)
    move = None
    while move not in legal:
        move = ask_number("你走那个位置? (0 - 9):", 0, 9)
        if move not in legal:
            print("\n此位置已经落过子了")
    return move
#电脑走棋
def computer_move(board, computer, human):
    # make a copy to work with since function will be changing list
    board = board[:]     #创建副本,修改不影响原来列表board
    #按优劣顺序排序的下棋位置best_weizhi
    # 如果电脑能赢,就走那个位置
    for move in legal_moves(board):
        board[move] = computer
        if winner(board) == computer:
            print("电脑下棋位置是" ,move)
            return move
        # 取消走棋方案
        board[move] = EMPTY
    # 如果玩家能赢,就堵住那个位置
    for move in legal_moves(board):
        board[move] = human
        if winner(board) == human:
            print("电脑下棋位置是" ,move)
            return move
        #取消走棋方案
        board[move] = EMPTY
    #不是上面情况则,也就是这一轮时都赢不了则
    #从最佳下棋位置表中挑出第一个合法位置
    for move in best_weizhi:
        if move in legal_moves(board):
            print("电脑下棋位置是" ,move)
            return move
#转换角色
def next_turn(turn):
    if turn == X:
        return O
    else:
        return X
#主方法:
def main():
    computer, human = pieces()
    turn = X
    board = new_board()
    display_board(board)
    
    while not winner(board):
        if turn == human:
            move = human_move(board, human)
            board[move] = human
        else:
            move = computer_move(board, computer, human)
            board[move] = computer
        display_board(board)
        turn = next_turn(turn)
        the_winner = winner(board)
    #游戏结束输出输赢信息
    if the_winner == computer:
        print("电脑赢!\n")    
    elif the_winner == human:         
        print("玩家赢!\n")
    elif the_winner == "True":    #"平局"        
        print("平局,和棋,游戏结束\n")

# start the program
main()
input("按任意键退出游戏.")

在最后附上结果图:

python井字棋游戏实现人机对战

python井字棋游戏实现人机对战

python井字棋游戏实现人机对战

python井字棋游戏实现人机对战

python井字棋游戏实现人机对战

python井字棋游戏实现人机对战

python井字棋游戏实现人机对战

至此一个简单的井字棋就完成了。


Tags in this post...

Python 相关文章推荐
一个小示例告诉你Python语言的优雅之处
Jul 04 Python
python进阶教程之模块(module)介绍
Aug 30 Python
Python爬虫:通过关键字爬取百度图片
Feb 17 Python
Python 对输入的数字进行排序的方法
Jun 23 Python
Python使用pyodbc访问数据库操作方法详解
Jul 05 Python
Opencv+Python 色彩通道拆分及合并的示例
Dec 08 Python
python内置函数sorted()用法深入分析
Oct 08 Python
在python中做正态性检验示例
Dec 09 Python
Python3直接爬取图片URL并保存示例
Dec 18 Python
Python3 读取Word文件方式
Feb 13 Python
Django restful framework生成API文档过程详解
Nov 12 Python
Python利用Turtle绘制哆啦A梦和小猪佩奇
Apr 04 Python
Python开发五子棋小游戏
Python简易开发之制作计算器
Apr 28 #Python
Python实现对齐打印 format函数的用法
Apr 28 #Python
python实现简单的三子棋游戏
Apr 28 #Python
Python内置类型集合set和frozenset的使用详解
使用Python获取字典键对应值的方法
Apr 26 #Python
PyTorch中permute的使用方法
Apr 26 #Python
You might like
php使用fgetcsv读取csv文件出现乱码的解决方法
2014/11/08 PHP
浅析php设计模式之数据对象映射模式
2016/03/03 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
php 处理png图片白色背景色改为透明色的实例代码
2018/12/10 PHP
Mac下快速搭建PHP开发环境步骤详解
2019/05/05 PHP
用jscript实现新建和保存一个word文档
2007/06/15 Javascript
兼容IE和FF的图片上传前预览js代码
2013/05/28 Javascript
JQ获取动态加载的图片大小的正确方法分享
2013/11/08 Javascript
js 上下左右键控制焦点(示例代码)
2013/12/14 Javascript
使用JavaScript进行进制转换将字符串转换为十进制
2014/09/21 Javascript
基于jquery的文字向上跑动类似跑马灯的效果
2014/09/22 Javascript
使用jQuery实现验证上传图片的格式与大小
2014/12/03 Javascript
js实现点击图片改变页面背景图的方法
2015/02/28 Javascript
jQuery+Ajax+PHP+Mysql实现分页显示数据实例讲解
2015/09/27 Javascript
js 判断附件后缀的简单实现方法
2016/10/11 Javascript
原生js实现弹出层效果
2017/01/20 Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
2017/07/20 Javascript
使用nodejs+express实现简单的文件上传功能
2017/12/27 NodeJs
Node解决简单重复问题系列之Excel内容的获取
2018/01/02 Javascript
vue-router之nuxt动态路由设置的两种方法小结
2018/09/26 Javascript
vue 插槽简介及使用示例
2020/11/19 Vue.js
Python实现爬虫从网络上下载文档的实例代码
2018/06/13 Python
Python中函数参数匹配模型详解
2019/06/09 Python
Python使用lambda表达式对字典排序操作示例
2019/07/25 Python
详解python statistics模块及函数用法
2019/10/27 Python
python super用法及原理详解
2020/01/20 Python
Tensorflow 使用pb文件保存(恢复)模型计算图和参数实例详解
2020/02/11 Python
python如何安装下载后的模块
2020/07/03 Python
python的数学算法函数及公式用法
2020/11/18 Python
Python创建简单的神经网络实例讲解
2021/01/04 Python
2014流动人口计划生育工作总结
2014/12/20 职场文书
工厂清洁工岗位职责
2015/02/14 职场文书
2015年超市工作总结范文
2015/05/26 职场文书
政审证明材料
2015/06/19 职场文书
高一军训感想
2015/08/07 职场文书
Python机器学习三大件之一numpy
2021/05/10 Python