井字棋游戏

1 问题

如何用python完成井字棋游戏。

2 方法

  1. 打印棋盘;

  2. 让玩家选择棋子;

  3. 随机决定谁先走;

  4. 玩家选择落子位置;

  5. 判断输赢;

  6. 是否再来一次

通过实验、实践等证明提出的方法是有效的,是能够解决开头提出的问题。

代码清单 1

import random
def drawBoard(board):
   # "board"是长度为10的列表,为了方便输入,忽略第一个元素board[0]
   print('\n\n\n\n')
   print('\t\t\t┌─┬─┬─┐')
   print('\t\t\t│'+board[7]+' │'+board[8]+' │'+board[9]+' │')
   print('\t\t\t├─┼─┼─┤')
   print('\t\t\t│'+board[4]+' │'+board[5]+' │'+board[6]+' │')
   print('\t\t\t├─┼─┼─┤')
   print('\t\t\t│'+board[1]+' │'+board[2]+' │'+board[3]+' │')
   print('\t\t\t└─┴─┴─┘')
def inputPlayerLetter():
   letter = ''
   while not (letter == 'X' or letter == 'O'):
       print('Do you want to be X or O?')
       letter = input().upper()
   if letter == 'X':
       return ['X', 'O']
   else:
       return ['O', 'X']
def whoGoesFirst():
   if random.randint(0, 1) == 0:
       return 'computer'
   else:
       return 'player'
def playAgain():
   print('Do you want to play again? (yes or no)')
   return input().lower().startswith('y')
def makeMove(board, letter, move):
   board[move] = letter
def isWinner(bo, le):
   return ((bo[7] == le and bo[8] == le and bo[9] == le) or
   (bo[4] == le and bo[5] == le and bo[6] == le) or
   (bo[1] == le and bo[2] == le and bo[3] == le) or
   (bo[7] == le and bo[4] == le and bo[1] == le) or
   (bo[8] == le and bo[5] == le and bo[2] == le) or
   (bo[9] == le and bo[6] == le and bo[3] == le) or
   (bo[7] == le and bo[5] == le and bo[3] == le) or
   (bo[9] == le and bo[5] == le and bo[1] == le))
def getBoardCopy(board):
   dupeBoard = []
   for i in board:
       dupeBoard.append(i)
   return dupeBoard
def isSpaceFree(board, move):
   return board[move] == ' '
def getPlayerMove(board):
   move = ' '
   while move not in '1 2 3 4 5 6 7 8 9'.split() or not isSpaceFree(board, int(move)):
       print('What is your next move? (1-9)')
       move = input()
   return int(move)
def chooseRandomMoveFromList(board, movesList):
   possibleMoves = []
   for i in movesList:
       if isSpaceFree(board, i):
           possibleMoves.append(i)
   if len(possibleMoves) != 0:
       return random.choice(possibleMoves)
   else:
       return None
def getComputerMove(board, computerLetter):
   if computerLetter == 'X':
       playerLetter = 'O'
   else:
       playerLetter = 'X'
   for i in range(1, 10):
       copy = getBoardCopy(board)
       if isSpaceFree(copy, i):
           makeMove(copy, computerLetter, i)
           if isWinner(copy, computerLetter):
               return i
   for i in range(1, 10):
       copy = getBoardCopy(board)
       if isSpaceFree(copy, i):
           makeMove(copy, playerLetter, i)
           if isWinner(copy, playerLetter):
               return i
   move = chooseRandomMoveFromList(board, [1, 3, 7, 9])
   if move != None:
       return move
   if isSpaceFree(board, 5):
       return 5
   return chooseRandomMoveFromList(board, [2, 4, 6, 8])
def isBoardFull(board):
   for i in range(1, 10):
       if isSpaceFree(board, i):
           return False
   return True
print('Welcome to Tic Tac Toe!')
while True:
   theBoard = [' '] * 10
   playerLetter, computerLetter = inputPlayerLetter()
   turn = whoGoesFirst()
   print('The ' + turn + ' will go first.')
   gameIsPlaying = True
   while gameIsPlaying:
       if turn == 'player':
           drawBoard(theBoard)
           move = getPlayerMove(theBoard)
           makeMove(theBoard, playerLetter, move)
   if isWinner(theBoard, playerLetter):
               drawBoard(theBoard)
               print('Hooray! You have won the game!')
               gameIsPlaying = False
           else:
               if isBoardFull(theBoard):
                   drawBoard(theBoard)
                   print('The game is a tie!')
                   break
               else:
                   turn = 'computer'
       else:
           move = getComputerMove(theBoard, computerLetter)
           makeMove(theBoard, computerLetter, move)
           if isWinner(theBoard, computerLetter):
               drawBoard(theBoard)
               print('The computer has beaten you! You lose.')
               gameIsPlaying = False
           else:
               if isBoardFull(theBoard):
                   drawBoard(theBoard)
                   print('The game is a tie!')
                   break
               else:
                   turn = 'player'
   if not playAgain():
       break

3 结语

针对如何使用python完成井字棋游戏的问题,提出该方法,通过本次实验,证明该方法是有效的,该程序设计的井字棋游戏具有一定的挑战性,无法满足所有阶段玩家的游戏需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149540.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

C++stackqueue

目录 一、stack 1.1 简要介绍 1.2 小试身手 1.3 模拟实现 二、queue 2.1 简要介绍 2.2 小试身手 2.3 模拟实现 三、deque 3.1 简要介绍 3.2 分析底层 四、priority_queue 4.1 简要介绍 4.2 小试身手 4.3 模拟实现 五、仿函数/函数对象 5.1 简要介绍 一…

优化方法的应用(optimtool.example)

import optimtool as oo from optimtool.base import np, sp, pltpip install optimtool>2.4.2优化方法的应用(optimtool.example) import optimtool.example as oeLasso问题(Lasso) oe.Lasso.[函数名]([矩阵A], [矩阵b], [因…

模型训练环境相关(CUDA、PyTorch)

模型训练环境相关(CUDA、PyTorch) 1. 查看当前 GPU 所能支持的最高版本的 CUDA2. 如何判断是否安装了 CUDA3. 安装 PyTorch3.1 创建虚拟环境3.2 激活并进入虚拟环境3.3 安装 PyTorch 1. 查看当前 GPU 所能支持的最高版本的 CUDA 打开 NVIDIA 控制面板&a…

Android学习之路(20) 进程间通信

IPC IPC为 (Inter-Process Communication) 缩写,称为进程间通信或跨进程通信,指两个进程间进行数据交换的过程。安卓中主要采用 Binder 进行进程间通信,当然也支持其他 IPC 方式,如:管道,Socket&#xff0…

后端面经学习自测(二)

文章目录 1、Http1.1和2.0的区别大概是什么?HTTP & HTTPS 2、HTTP,用户后续的操作,服务端如何知道属于同一个用户cookie & session & token手机验证码登录流程SSO单点登录 3、如果服务端是一个集群机器?4、hashmap是线…

华为云云耀云服务器L实例评测|基于canal缓存自动更新流程 SpringBoot项目应用案例和源码

前言 最近华为云云耀云服务器L实例上新,也搞了一台来玩,期间遇到各种问题,在解决问题的过程中学到不少和运维相关的知识。 在之前的博客中,介绍过canal的安装和配置,参考博客 拉取创建canal镜像配置相关参数 & …

《Jetpack Compose从入门到实战》第一章 全新的 Android UI 框架

书籍源码 Compose官方文档 《Jetpack Compose从入门到实战》第一章 全新的 Android UI 框架 《Jetpack Compose从入门到实战》 第二章 了解常用UI组件 《Jetpack Compose从入门到实战》第三章 定制 UI 视图 《Jetpack Compose从入门到实战》第八章 Compose页面 导航 《Jet…

【Overload游戏引擎分析】画场景网格的Shader

Overload引擎地址: GitHub - adriengivry/Overload: 3D Game engine with editor 一、栅格绘制基本原理 Overload Editor启动之后,场景视图中有栅格线,这个在很多软件中都有。刚开始我猜测它应该是通过绘制线实现的。阅读代码发现&#xff0…

JAVA面经整理(8)

一)为什么要有区,段,页? 1)页是内存和磁盘之间交互的基本单位内存中的值修改之后刷到磁盘的时候还是以页为单位的索引结构给程序员提供了高效的索引实现方式,不过索引信息以及数据记录都是记录在文件上面的,确切来说是…

矩阵的c++实现(2)

上一次我们了解了矩阵的运算和如何使用矩阵解决斐波那契数列&#xff0c;这一次我们多看看例题&#xff0c;了解什么情况下用矩阵比较合适。 先看例题 1.洛谷P1939 【模板】矩阵加速&#xff08;数列&#xff09; 模板题应该很简单。 补&#xff1a;1<n<10^9 10^9肯定…

给列起别名(关键字:as)

MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 语法格式: select 列名1 as 别名1, 列名2 as 别名2, 列名n as 别名n from 表名; 说明&#xff1a;可以省略as&#xff0c;列名和别名之间使用空格…

MySQL——使用mysqldump备份与恢复数据

目录 1.mysqldump简介 2.mysqldump备份数据 2.1 备份所有数据库 2.2 备份一个/多个数据库 2.3 备份指定库中的指定表 3.mysqldump恢复数据 3.1 恢复数据库 3.2 恢复数据表 1.mysqldump简介 mysqldump命令可以将数据库中指定或所有的库、表导出为SQL脚本。表的结构和表中…

并网逆变器+VSG控制+预同步控制+电流电流双环控制(Simulink仿真实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

火山引擎 ByteHouse:TB 级数据下,如何实现高效、稳定的数据导入

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 近期&#xff0c;火山引擎开发者社区、火山引擎数智平台&#xff08;VeDI&#xff09;联合举办以《数智化转型背景下的火山引擎大数据技术揭秘》为主题的线下 Meeup…

做好微信CRM,这些功能你不可不知!

在当前的数字化时代&#xff0c;微信已成为我们日常生活中的重要元素&#xff0c;无论是社交交流、信息传递还是商务合作&#xff0c;微信都扮演着不可或缺的角色。为了更有效地管理微信资源并提高工作效率&#xff0c;很多组织和公司都选择引入微信CRM系统。那么&#xff0c;怎…

【算法学习】-【双指针】-【盛水最多的容器】

LeetCode原题链接&#xff1a;盛水最多的容器 下面是题目描述&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。…

sheng的学习笔记-【中文】【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第三周测验

课程1_第3周_测验题 目录&#xff1a;目录 第一题 1.以下哪一项是正确的&#xff1f; A. 【  】 a [ 2 ] ( 12 ) a^{[2](12)} a[2](12)是第12层&#xff0c;第2个训练数据的激活向量。 B. 【  】X是一个矩阵&#xff0c;其中每个列都是一个训练示例。 C. 【  】 a 4 […

如果在 Mac 上的 Safari 浏览器中无法打开网站

使用网络管理员提供的信息更改代理设置。个人建议DNS解析&#xff0c;设置多个例如114.114.114.114 8.8.8.8 8.8.4.4 如果打不开网站&#xff0c;请尝试这些建议。 在 Mac 上的 Safari 浏览器 App 中&#xff0c;检查页面无法打开时出现的信息。 这可能会建议解决问题的…

pandas read_json时ValueError: Expected object or value的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

坦克世界WOT知识图谱三部曲之爬虫篇

文章目录 关于坦克世界1. 爬虫任务2. 获取坦克列表3. 获取坦克具体信息结束语 关于坦克世界 《坦克世界》(World of Tanks, WOT)是我在本科期间玩过的一款战争网游&#xff0c;由Wargaming公司研发。2010年10月30日在俄罗斯首发&#xff0c;2011年4月12日在北美和欧洲推出&…