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使用正则表达式检测密码强度源码分享
Jun 11 Python
Python统计文件中去重后uuid个数的方法
Jul 30 Python
Python 3实战爬虫之爬取京东图书的图片详解
Oct 09 Python
Python:Scrapy框架中Item Pipeline组件使用详解
Dec 27 Python
django 通过url实现简单的权限控制的例子
Aug 16 Python
Python 静态方法和类方法实例分析
Nov 21 Python
python中数字是否为可变类型
Jul 08 Python
解析python 类方法、对象方法、静态方法
Aug 15 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
Oct 12 Python
python接口自动化框架实战
Dec 23 Python
pandas 操作 Excel操作总结
Mar 31 Python
python实现MD5进行文件去重的示例代码
Jul 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/09/30 PHP
非常精妙的PHP递归调用与静态变量使用
2012/12/16 PHP
PHP中mb_convert_encoding与iconv函数的深入解析
2013/06/21 PHP
PHP基础知识介绍
2013/09/17 PHP
php中使用base HTTP验证的方法
2015/04/20 PHP
php常用字符串查找函数strstr()与strpos()实例分析
2019/06/21 PHP
ThinkPHP 5.x远程命令执行漏洞复现
2019/09/23 PHP
JavaScript 基础篇之运算符、语句(二)
2012/04/07 Javascript
基于Bootstrap使用jQuery实现简单可编辑表格
2016/05/04 Javascript
AngularJS基础 ng-focus 指令简单示例
2016/08/01 Javascript
JS判断form内所有表单是否为空的简单实例
2016/09/09 Javascript
vue做移动端适配最佳解决方案(亲测有效)
2018/09/04 Javascript
js删除对象/数组中null、undefined、空对象及空数组方法示例
2018/11/14 Javascript
浅谈vue 锚点指令v-anchor的使用
2019/11/13 Javascript
分享8个JavaScript库可更好地处理本地存储
2020/10/12 Javascript
[48:02]Ti4循环赛第三日 VG vs Liquid和NEWBEE vs DK
2014/07/12 DOTA
[01:59]翻天覆地,因你而变,7.20版本地图更新速览
2018/11/24 DOTA
Python+matplotlib+numpy实现在不同平面的二维条形图
2018/01/02 Python
python3爬取数据至mysql的方法
2018/06/26 Python
解决python写入带有中文的字符到文件错误的问题
2019/01/31 Python
Django框架orM与自定义SQL语句混合事务控制操作
2019/06/27 Python
用python求一个数组的和与平均值的实现方法
2019/06/29 Python
python 生成正态分布数据,并绘图和解析
2020/12/21 Python
HTML5 embed标签定义和用法详解
2014/05/09 HTML / CSS
请描述一下”is a”关系和”has a”关系
2015/02/03 面试题
六查六看自查报告
2014/10/14 职场文书
成都人事代理协议书
2014/10/25 职场文书
2014年项目工作总结
2014/11/24 职场文书
2014年合同管理工作总结
2014/12/02 职场文书
美丽人生观后感
2015/06/03 职场文书
生死抉择观后感
2015/06/09 职场文书
新郎父亲婚礼致辞
2015/07/27 职场文书
2016春季运动会前导词
2015/11/25 职场文书
JavaScript实现淘宝商品图切换效果
2021/04/29 Javascript
使用canvas对video视频某一刻截图功能
2021/09/25 HTML / CSS
Windows环境下实现批量执行Sql文件
2021/10/05 SQL Server