python小游戏开发——井字棋

article/2025/8/26 14:46:28

一家懂得用细节留住客户的3年潮牌老店我必须支持!➕🛰:luyao1931

在这里插入图片描述

案例介绍

本案例采用 python 实现了一个简单的井字棋游戏。该游戏在控制台界面中进行,有游戏提示。游戏棋盘为 3 X 3 的九宫格样式,每个棋格与数字键盘上的 1 - 9 数字键一一对应,可通过输入数字来选择落棋位置和落子。游戏的规则是两个玩家轮流下棋,首先实现横线、竖线、斜线连续三个格棋子一样的获胜。

学习目标

本案例主要是对 python 基础知识的运用,包括语法、列表型数据结构、元组、类、函数、循环、条件判断、控制台输入与输出、引入模块等基础知识。通过本案例的学习,将强化对这些知识的理解和运用。

需要的引入的模块

本案例以 python 3.5.3 版本为基础,需要引入三个模块 random 、 sys 、 copy .

模块 random :主要用于生成随机数;
模块 sys :该模块包含了与 Python 解释器和它的环境有关的函数。
模块 copy :主要用于拷贝对象。
案例结构和主要算法
该案例是个游戏,其主要算法为:

初始化棋盘,确定玩家执什么棋子,并随机确定谁执先手;
玩家和计算机轮换下棋。
计算机依据玩家落棋的位置,先依次做五个检测:自己下一步棋是否会赢、玩家下一步棋是否会赢、检测四个角是否为空、检测中心是否为空、检测边是否有空位,然后根据检测结果将棋子下在相应的位置,直到游戏结束。
该案例包含的功能模块
该案例只有一个程序文件: tictactoe.py ,其包含的功能模块为:

starGame( ) 函数:定义了本游戏的主要流程和逻辑——初始化棋盘、输出帮助信息、取得玩家姓名和希望执的棋子、随机选择谁执先手、进入游戏循环。
drawBoard( ) 函数:绘制或更新棋盘。如果没有棋盘,就绘制棋盘;如果棋盘已经存在,就更新棋盘。
help( ) 函数:输出帮助信息。
inputPlayerLetter( ) 函数:确定游戏双方选择的代表棋子的字符。
startGameLoop( ) 函数:定义了游戏的主循环。玩家和计算机轮换下棋,直到某一方获胜或达成平局。
getPlayerMove( ) 函数:玩家下棋,返回输入的位置数字。
makeMove( ) 函数:下棋,将字符配给相应的棋盘网格。
isWin( ) 函数:判断获胜的标准。
isBoardFull( ) 函数:检测棋盘是否下满棋。
isSpaceFree( ) 函数:检测哪个位置为空的,可以下棋。
getComputerMove( ) 函数:依次做五个检测,确定计算机要下棋的位置。
chooseRandomMove( ) 函数:随机下棋。
endGame( ) 函数:游戏结束时给出选择,再来一次,还是退出。
exitGame( ) 函数:退出游戏。
‘’’

代码实现

# -*- coding: utf-8 -*-import random
import sys
import copyclass TicTacToe:# 初始化信息def __init__(self):self.board = [' '] * 10self.playerName = ''self.playerLetter = ''self.computerName = 'Leo'self.computerLetter = ''self.corners = [1,3,7,9]self.sides = [2,4,6,8]self.middle = 5self.form = '''\t        |   |\t      %s | %s | %s\t        |   |\t    -------------\t        |   |\t      %s | %s | %s\t        |   |\t    -------------\t        |   |\t      %s | %s | %s\t        |   |'''# 开始游戏def startGame(self):# 欢迎信息print('''\n\t------------------------------------\n\t             TIC-TAC-TOE\n\t------------------------------------''')# 画棋盘,调用 drawBoard()self.drawBoard(board = None)# 显示帮助信息,调用 help()self.help()# 获取玩家姓名self.playerName = input("您好,我是 %s" % self.computerName + ". 请问您的名字是? ")# 获取代表棋子的字符,调用 inputPlayerLetter()self.playerLetter, self.computerLetter = self.inputPlayerLetter()print("您的选择是 " + self.playerLetter)# 随机选择谁执先手,并开始游戏。调用 startGameLoop()if random.randint(0,1) == 0:print(self.computerName + "为执先手方!")self.startGameLoop(self.computerName)else:print(self.playerName + "为执先手方!")self.startGameLoop(self.playerName)# 画棋盘,如果游戏新开始,没有棋盘,就初始化棋盘,棋盘格都为空。如果在游戏中,就在网格中显示字符。def drawBoard(self,board = None):if board is None:print(self.form % tuple(self.board[7:10] + self.board[4:7] + self.board[1:4]))else:print(self.form % tuple(board[7:10] + board[4:7] + board[1:4]))# 帮助信息def help(self):print('''\n\t 游戏说明:\n\t 1、游戏棋盘是以 3 X 3 的九宫格形式。每格坐标与键盘上的小键盘 1 - 9 数字键一一对应。\n\t 2、游戏中,两个玩家轮流下棋,输入数字,将棋下在九宫格的相应格里。\n\t 3、首先实现横线、竖线、斜线连续三个格棋子一样的获胜。''')# 玩家输入选择的代表棋子的字符def inputPlayerLetter(self):letter = ''while not (letter == 'X' or letter == 'O'):print('您希望选择 X 还是 O ?')letter = input().upper()# 设置第一个字符为玩家,第二个为计算机if letter == 'X':return ['X', 'O']else:return ['O', 'X']# 游戏主循环def startGameLoop(self,turn):gameIsRunning = Trueplayer = turnwhile gameIsRunning:# 如果是玩家下棋if player == self.playerName:playerInput = self.getPlayerMove()self.makeMove(self.board, self.playerLetter, playerInput)if(self.isWin(self.board, self.playerLetter)):self.drawBoard()print("\n\t恭喜您获胜,%s!!! \t\n" % self.playerName)gameIsRunning = Falseelse:if self.isBoardFull():self.drawBoard()print("\n\t 您和%s战成平局!!! \n\t" % self.computerName)gameIsRunning = Falseelse:self.drawBoard()player = self.computerName# 转为计算机下棋else:computerMove =  self.getComputerMove()self.makeMove(self.board, self.computerLetter, computerMove)if (self.isWin(self.board, self.computerLetter)):self.drawBoard()print("\n\t很遗憾,计算机%s获得了胜利 \t\n" % self.computerName)gameIsRunning = Falsebreakelse:if self.isBoardFull():self.drawBoard()print("\n\t 您和%s战成平局!!! \n\t" % self.computerName)gameIsRunning = Falseelse:self.drawBoard()player = self.playerName# 当跳出游戏循环,及获胜、平局、失败后结束游戏。self.endGame()# 玩家下棋,返回输入的位置数字def getPlayerMove(self):move = int(input("请选择棋子位置: (1-9) "))while move not in range(1,10) or not self.isSpaceFree(self.board, move):move = int(input("无效操作,请重新选择: (1-9) "))return move# 下棋,将字符配给相应的棋盘网格def makeMove(self,board, letter, move):board[move] = letter# 判断获胜的标准def isWin(self, board, letter):if ((board[1] == letter and board[2] == letter and board[3] == letter) or      # 下横线(board[4] == letter and board[5] == letter and board[6] == letter) or  # 中横线(board[7] == letter and board[8] == letter and board[9] == letter) or  # 上横线(board[1] == letter and board[4] == letter and board[7] == letter) or  # 左竖线(board[2] == letter and board[5] == letter and board[8] == letter) or  # 中竖线(board[3] == letter and board[6] == letter and board[9] == letter) or  # 右竖线(board[1] == letter and board[5] == letter and board[9] == letter) or  # 一条对角线(board[3] == letter and board[5] == letter and board[7] == letter)):   # 又一条对角线return Trueelse:return False# 检测棋盘是否下满def isBoardFull(self):for i in range(1,10):if self.isSpaceFree(self.board, i):return Falsereturn True# 检测哪个位置为空的,可以下棋def isSpaceFree(self, board, move):return board[move] == ' '# 计算机下棋,得到要下的位置# 依次做五个检测: 1、自己下一步棋是否会赢; 2、玩家下一步棋是否会赢; 3、检测四个角是否为空; 4、检测中心是否为空; 5、检测边是否有空位。def getComputerMove(self):for i in range(1, 10):boardCopy = copy.deepcopy(self.board)if self.isSpaceFree(boardCopy, i):self.makeMove(boardCopy, self.computerLetter, i)if self.isWin(boardCopy, self.computerLetter):return ifor i in range(1, 10):boardCopy = copy.deepcopy(self.board)if self.isSpaceFree(boardCopy, i):self.makeMove(boardCopy, self.playerLetter, i)if self.isWin(boardCopy, self.playerLetter):return imove = self.chooseRandomMove(self.corners)if move != None:return moveif self.isSpaceFree(self.board, self.middle):return self.middlereturn self.chooseRandomMove(self.sides)# 随机下棋def chooseRandomMove(self, moveList):possibleWinningMoves = []for move in moveList:if self.isSpaceFree(self.board, move):possibleWinningMoves.append(move)if len(possibleWinningMoves) != 0:return random.choice(possibleWinningMoves)else:return None# 游戏结束def endGame(self):playAgain = input("您希望再战一局吗? (y/n): ").lower()if playAgain == 'y':self.__init__()self.startGame()else:print("\n\t-- 游戏结束!!!--\n\t")self.exitGame()# 退出游戏def exitGame(self):print("\n\t 感谢您的参与 ? \n\t 欢迎下次再玩!\n")sys.exit()if __name__ == "__main__":TTT = TicTacToe()TTT.startGame()

http://chatgpt.dhexx.cn/article/3DfW9ZB3.shtml

相关文章

使用Vue框架开发的贪吃蛇小游戏

注意&#xff1a;尽量不要用谷歌浏览器运行&#xff0c;因为谷歌浏览器会把GameValue翻译成中文&#xff0c;使游戏掉帧卡顿 解决办法&#xff1a;1.使用Edge浏览器&#xff0c;2.把谷歌浏览器的自动中文翻译关闭即可 游戏截图&#xff1a; 源码如下&#xff1a; <!DOCTY…

QT大作业——自制小游戏

The RPGgame with QT 一、 系统架构 该项目有4个ui组成&#xff0c;其中mainwindow作为项目程序入口&#xff0c;窗口跳转流程为&#xff1a;mainwindow->gamegraph->area_prairrie->playerstastus。 主要游戏功能装载在gamegraph和area_prairrie两个ui中&#xff0…

webpack + typescript 开发微信小游戏实践

源码地址 微信小游戏版本技术选型使用typescript开发 但是微信小游戏原生不支持 typescript 开发&#xff0c;于是探索一下使用ts开发微信小游戏 1. 创建小游戏 使用测试号&#xff0c;创建一个使用官方示例的小游戏 会生成一个可以直接运行的打飞机小游戏 2. 准备工作 …

小游戏开发引擎CocosCreator

小游戏 六彩跳棋 已经通过审核并且发布了好几天了&#xff0c;对跳棋感兴趣的朋友可以去看看&#xff0c;在微信游戏里搜索 六彩跳棋 &#xff0c;点击 立即玩 吧&#xff01;进去游戏后&#xff0c;需要点击 获取头像昵称 才能得到玩家数据&#xff0c;然后 划动屏幕 选择游戏…

unity开发微信小游戏1

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、准备工作二、官方文档三、WX开发者工具四、获得Appid五、获得AppidError: app.json: app.json六、资源下载失败404总结 前言 最开使用unity3d开发微信小游…

【微信小游戏】微信小游戏开发设置竖屏

微信小游戏开发环境默认横屏&#xff0c;对竖屏游戏非常不方便。 设置竖屏的入口十分隐蔽&#xff0c;以至于一度令我以为不能设置竖屏。 网上也根本搜不到解决方法&#xff0c;经过我的不懈努力&#xff0c;最终还是找到了设置方法。 原本是横屏的 按下面路径设置竖屏 开发…

使用pygame开发一个小游戏

学习了pygame&#xff0c;身为一个IKUN所以&#xff0c;做了一个简单的小游戏。游戏规则是&#xff0c;使用键盘的方向键控制坤坤&#xff0c;当坤坤触碰到篮球&#xff0c;就会爆发出音乐”只因你太美“。代码如下&#xff1a; import random import sys import pygame pygam…

微信小游戏开发教程

微信小游戏开发教程-前言 自18年年初对开发者开放小游戏接口以后小游戏越来越火热&#xff0c;本文就是对小游戏开发的入门教程&#xff0c;希望这篇文章能够帮到想要入门开发游戏的你。 哈哈哈&#xff0c;看到有人说我故意分成好几篇刷PV&#xff0c;改了一下删了两篇&…

支持小游戏开发的“引擎四剑客”

2017年12月28日&#xff0c;微信发布了一款叫“跳一跳”的微信小程序的一个小游戏&#xff0c;无需下载安装&#xff0c;即点即玩&#xff0c;只需要在微信客户端的小程序界面搜索“跳一跳”&#xff0c;点击即可加载进入该游戏玩。游戏小而精&#xff0c;借助于微信巨大的社交…

小程序开发小游戏注意事项

今天研究小游戏开发&#xff0c;总结了一些自己遇到的问题 : 一. 注册appId 用小程序开发的小游戏跟用小程序开发其他项目不是公用的一个appId 如果你现在的小程序账号已经选了别的类目&#xff08;非游戏&#xff09;&#xff0c;那你就需要另外注册一个账号来单独申请小游戏…

【小程序】快来开发你的第一个微信小游戏(详细流程)

&#x1f973; 作者&#xff1a;伯子南 &#x1f60e; 坚信&#xff1a; 好记性不如乱笔头&#xff0c;独乐乐不如众乐乐 &#x1f4aa; 个人主页&#xff1a;https://blog.csdn.net/qq_34577234?spm1010.2135.3001.5421 &#x1f46c;&#x1f3fb; 觉得博主文章不错的话&…

小游戏开发

小游戏开发 1、游戏发展历史 广义&#xff1a;一种有组织的玩耍&#xff0c;一般是以娱乐为目的&#xff0c;有时也有教育目的。在英语中&#xff0c;体育比赛(Game)也是游戏&#xff0c;只要其活动本质带有目的、规则、挑战和互动&#xff0c;我们都可以把其归为游戏。 狭义…

小游戏开发指南及过程中的难点问题

如果仅仅针对个人开发者来讲&#xff0c;要独立开发一款大型游戏几乎无可能&#xff0c;更大成功的可能还是开发一款类似《羊了个羊》这样洗脑的小程序游戏。 所以这里主要论述小游戏开发的情况&#xff0c;也就是小程序游戏&#xff0c;首先从小游戏的开发流程来看&#xff1…

oracle数据库中的注释

oracle数据库中的注释 单行注释-- --这是oracle中的单行注释 SELECT SYSDATE FROM dual; 多行注释/**/ /*这是oracle中的多行注释*/ SELECT 6 6 AS "计算结果" FROM dual;

MYSQL数据库如何写注释

方式一 注意&#xff1a;在写注释时&#xff0c;–与注释之间必须要一个空格 select * from stu -- 注释方式二 注意&#xff1a;这种方式比较随意&#xff0c;加不加空格不影响 select * from t_info #注释select * from t_info#注释select * from t_info # 注释方式三 s…

Idea连接数据库,显示表注释

idea设置显示数据库表名注释 操作步骤&#xff1a; View Apperarance Details in Tree View选上

达梦数据库中的注释的使用

在管理规模较大的数据库时&#xff0c;我们往往需要面对大量的表与视图&#xff0c;与此同时在表与视图中可能会存在着许多的字段&#xff0c;让人难以迅速分辨&#xff0c;不利于对于数据库对象的管理。除了在命名时&#xff0c;对于有意义的表、视图及列&#xff0c;应尽量赋…

Jpa 自动建表的时候在数据库中添加注释。

github地址 本项目可以让 Jpa 自动建表的时候在数据库中添加注释。 为什么做这件事 过去想要让 Jpa 在建表的时候自动添加注释一般需要使用 Column#columnDefinition 属性。示例如下&#xff1a; Column(columnDefinition "INT COMMENT ...") private int unitI…

达梦数据库中迁移过来的数据,在Mysql中批量添加注释,修改注释

一、原因 数据是从达梦数据库中迁移过来的&#xff0c;迁移完成注释丢失 二、方法 利用 information_schema.COLUMNS 这个表 三、执行步骤 1.这是达梦数据库导出的注释2.达梦的数数据库数据导出时是和创建表和索引都在一起&#xff0c;因此需要单独把注释这一块的给提取出…

2021.3.17丨致病菌毒力因子(VFDB)数据库注释

摘要 接到一个常规细菌的组装注释项目&#xff0c;不过客户提出想要获取关于组装结果与病毒之间的联系/按之前的操作&#xff0c;dfast没有病毒相关的数据库&#xff0c;无法满足客户需求。一番查阅&#xff0c;发现大家用这个VFDB数据库进行常规的病毒注释&#xff0c;下面将介…