# 全局常量
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 = Xcomputer = Oelse:print("\n电脑先走.")computer = Xhuman = Oreturn computer, human# 显示棋盘
def display_board(board):board2 = board[:]  # 创建副本,修改不影响原来列表boardfor i in range(len(board)):if board[i] == EMPTY:board2[i] = iprint("\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 = Nonewhile 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 = Nonewhile 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 listboard = board[:]  # 创建副本,修改不影响原来列表board# 按优劣顺序排序的下棋位置best_weizhi# 如果电脑能赢,就走那个位置for move in legal_moves(board):board[move] = computerif winner(board) == computer:print("电脑下棋位置是", move)return move# 取消走棋方案board[move] = EMPTY# 如果玩家能赢,就堵住那个位置for move in legal_moves(board):board[move] = humanif 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 Oelse:return X# 主方法:
def main():computer, human = pieces()turn = Xboard = new_board()display_board(board)while not winner(board):if turn == human:move = human_move(board, human)board[move] = humanelse:move = computer_move(board, computer, human)board[move] = computerdisplay_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("按任意键退出游戏.")
# 全局常量
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 = Xcomputer = Oelse:print("\n电脑先走.")computer = Xhuman = Oreturn computer, human# 显示棋盘
def display_board(board):board2 = board[:]  # 创建副本,修改不影响原来列表boardfor i in range(len(board)):if board[i] == EMPTY:board2[i] = iprint("\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 = Nonewhile 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 = Nonewhile 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 listboard = board[:]  # 创建副本,修改不影响原来列表board# 按优劣顺序排序的下棋位置best_weizhi# 如果电脑能赢,就走那个位置for move in legal_moves(board):board[move] = computerif winner(board) == computer:print("电脑下棋位置是", move)return move# 取消走棋方案board[move] = EMPTY# 如果玩家能赢,就堵住那个位置for move in legal_moves(board):board[move] = humanif 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 Oelse:return X# 主方法:
def main():computer, human = pieces()turn = Xboard = new_board()display_board(board)while not winner(board):if turn == human:move = human_move(board, human)board[move] = humanelse:move = computer_move(board, computer, human)board[move] = computerdisplay_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("按任意键退出游戏.")

需求分析

能实现人机交替落子,当行,列或对角有连续三个相同一方棋时,则判定一方胜利,若无此情形为和局。

系统设计

游戏中,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))

Python井字棋游戏开发带实验报告相关推荐

  1. python井字棋游戏大作业实验报告_Part 1.2 - 实现一个井字棋游戏的gym环境

    上文已经描述了怎么创建和注册一个自定义的gym环境.但是环境类中的4个函数都是空的,本文将描述怎么实现那4个函数,实现一个完整的井字棋游戏的环境. 游戏规则:两个玩家在3x3的棋盘上,一方执X,一方执 ...

  2. python井字棋游戏代码_python实现井字棋游戏

    python实现井字棋游戏 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  python实现井字棋游戏.txt ] (友情提示:右键点上行txt文档名->目标 ...

  3. python井字棋游戏开发(人人对战,人机对战,包含源码,逻辑思维流程图)

    需求分析 井字棋是比较便捷休闲娱乐的一种迷你棋,玩法比较简单,只需要一个九宫格棋盘就可以实现两人对战,规则为谁先连成三个棋子的一条线即可获胜.本游戏,需要满足两个主要功能:1.能实现玩家对战:2.能实 ...

  4. python井字棋游戏人机对战_用Python做一个井字棋小游戏

    井字棋是一个经典的小游戏,在九宫格上玩家轮流画OXO,当每列或每行或是两个对角成一线时便是获胜. 今天就用Python编写一个井字棋小游戏,与电脑对战. 程序执行画面如下图所示: 程序提供了两种人工智 ...

  5. python井字棋游戏代码_Python实现的井字棋(Tic Tac Toe)游戏示例

    Python实现的井字棋(Tic Tac Toe)游戏示例 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  Python实现的井字棋(Tic Tac Toe)游戏示 ...

  6. Python基础编程案例:简单的井字棋游戏设计与制作

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 前言 python井字棋游戏虽然看上去非常简陋,但是却非常值得学习. 先看怎么玩 ...

  7. python井字棋ai_[Python100行系列]-井字棋游戏

    博客:Hzy的博客 | Hzy Blog​hzeyuan.cn一些学习python的小项目,小游戏.python小项目​github.com 话不多说,今天尝试用turtle库来写一个井字棋游戏.1. ...

  8. c语言井字棋程序设计报告,井字棋游戏(课程设计)总结报告.doc

    井字棋游戏(课程设计)总结报告 C语言贪吃蛇游戏设计总结报告 PAGE PAGE 5 丽水学院 计算机信息学院 <C语言课程设计(短一)> 指 导 书 二 ○ 一一 年 三 附件二 封面格 ...

  9. python井字棋_[Python100行系列]-井字棋游戏

    博客:Hzy的博客 | Hzy Blog​hzeyuan.cn一些学习python的小项目,小游戏.python小项目​github.com 话不多说,今天尝试用turtle库来写一个井字棋游戏.1. ...

  10. php井字游戏,python实现井字棋游戏

    #本游戏python3.4.0下编写调试,只能在windows下运行. import random import subprocess import time #定义函数 def draw_board ...

最新文章

  1. NSwagStudio for Swagger Api
  2. 腾讯云 短信服务 【学习记录 】
  3. pandas使用replace函数和正则表达式移除dataframe字符串数据列中头部指定模式字符串(Removing leading substring in dataframe)
  4. OAuth2.0认证和授权原理
  5. Python中read()、readline()和readlines()三者间的区别和用法
  6. 时间序列预测之一:指数平滑法(二)R语言——代码实现
  7. string字符串详解
  8. 中国工业自动化行业需求现状及投资风险评估报告2022-2027年版
  9. oracle adf_Oracle ADF和Oracle Jet一起工作。 建筑模式
  10. UVA1584 ​​​​​​​Circular Sequence【字符串】
  11. 【TI-ONE系列教程(一)】如何使用TI-ONE平台
  12. Solr 中 Schema 结构说明
  13. 【vue开发问题-解决方法】(一)在style中设置background-image时路径问题
  14. Ubuntu 18.04 Server必须使用netplan命令配置IP地址
  15. golang连接mysql操作示例增删改查
  16. 目标检测算法YOLO3论文解读
  17. SV宏定义中反斜杠(\),反引号(`),双反引号(``)的作用
  18. 焦作机器人编程比赛_2018 焦作icpc现场赛总结
  19. cas:1580547-45-0 ; (ir[p-fppy]2(bpy))pf6 (2,2‘-联吡啶)双[2-(4-氟苯基)吡啶]铱(III) 六氟磷酸盐
  20. Vue项目中的自定义指令

热门文章

  1. 一个宝爸对孩子幼儿园成长的思考,我写了6000字的总结
  2. 魔方基础公式--三阶四阶
  3. 三阶魔方复原操作方法
  4. OpenSSL密码库算法笔记——第2.2.5章 利用Barrett约化做除法
  5. 【springmvc】SpringMVC启动流程及源码分析
  6. 800个小炒,一天吃一个叫你吃三年
  7. 请问手机有没有简单好用图片去水印app?这4款手机软件可以实现去水印
  8. 常用 EPSG 编号对应的投影信息
  9. whatsapp协议分析
  10. 基因定相(Phasing) 与 SHAPEIT 原理简介