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控制多进程与多线程并发数总结
Oct 26 Python
python通过cookie模拟已登录状态的初步研究
Nov 09 Python
Python中使用支持向量机(SVM)算法
Dec 26 Python
python使用itchat实现手机控制电脑
Feb 22 Python
python实践项目之监控当前联网状态详情
May 23 Python
django中forms组件的使用与注意
Jul 08 Python
python3实现mysql导出excel的方法
Jul 31 Python
python基于property()函数定义属性
Jan 22 Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
Feb 25 Python
python logging通过json文件配置的步骤
Apr 27 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
Jun 11 Python
python能做哪些生活有趣的事情
Sep 09 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 页面跳转到另一个页面的多种方法方法总结
2009/07/07 PHP
php数据库配置文件一般做法分享
2012/07/07 PHP
PHP jQuery表单,带验证具体实现方法
2014/02/15 PHP
Yii2 assets清除缓存的方法
2016/05/16 PHP
jquery 全局AJAX事件使用代码
2010/11/05 Javascript
JavaScript中valueOf函数与toString方法深入理解
2012/12/02 Javascript
详解JavaScript中循环控制语句的用法
2015/06/03 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
2015/08/06 Javascript
javascript HTML5 canvas实现打砖块游戏
2020/06/18 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
jQuery  ready方法实现原理详解
2016/10/19 Javascript
EditPlus中的正则表达式 实战(4)
2016/12/15 Javascript
Vue2学习笔记之请求数据交互vue-resource
2017/02/23 Javascript
详解微信小程序缓存--缓存时效性
2019/05/02 Javascript
监控Nodejs的性能实例代码
2019/07/02 NodeJs
vue实现移动端省市区选择
2019/09/27 Javascript
Bootstrap实现模态框效果
2019/09/30 Javascript
vue路由切换之淡入淡出的简单实现
2019/10/31 Javascript
JS实现前端路由功能示例【原生路由】
2020/05/29 Javascript
微信小程序调用后台service教程详解
2020/11/06 Javascript
通过滑动翻页效果实现和移动端click事件问题
2021/01/26 Javascript
[02:30]DOTA2放量测试专访海涛:呼吁保护新手玩家
2013/08/26 DOTA
Linux下为不同版本python安装第三方库
2016/08/31 Python
Django使用httpresponse返回用户头像实例代码
2018/01/26 Python
flask-restful使用总结
2018/12/04 Python
Python+PyQt5实现美剧爬虫可视工具的方法
2019/04/25 Python
利用PyQt中的QThread类实现多线程
2020/02/18 Python
解决Django no such table: django_session的问题
2020/04/07 Python
纯CSS实现预加载动画效果
2017/09/06 HTML / CSS
什么是触发器(trigger)? 触发器有什么作用?
2013/09/18 面试题
怎么样写好简历中的自我评价
2013/10/25 职场文书
毕业生自我推荐
2013/11/04 职场文书
环境日宣传活动总结
2014/07/09 职场文书
事业单位年度考核个人总结
2015/02/12 职场文书
拾金不昧表扬稿大全
2015/05/05 职场文书
科学家测试在太空中培育人造肉,用于未来太空旅行
2022/04/29 数码科技