项目1:井字棋 --- 《跟着小王学Python》

项目1:井字棋 — 《跟着小王学Python·新手》

文章目录

  • 项目1:井字棋 --- 《跟着小王学Python·新手》
    • 目标
    • 功能
    • 设计
      • 1. 数据结构
      • 2. 功能模块
      • 3. 用户界面
    • 实现步骤
    • 代码实现
    • 测试
    • 注意事项
    • 小结

在这里插入图片描述

目标

本技术文章旨在指导读者如何使用 Python 编程语言来实现一个简单的井字棋(Tic-Tac-Toe)游戏。井字棋是一种两人对弈的策略型游戏,玩家轮流在3x3的网格上标记自己的符号(通常是“X”和“O”),目标是将自己的符号排列成一条直线。

功能

  • 玩家输入:允许两名玩家输入他们的符号(“X”或“O”)。
  • 游戏逻辑:实现游戏的基本逻辑,包括轮流下棋、检查获胜条件等。
  • 胜负判断:判断游戏的胜负情况,包括横线、竖线和对角线。
  • 界面显示:在控制台显示游戏棋盘,以及当前游戏状态。
  • 重新开始:游戏结束后,提供重新开始游戏的选项。

设计

1. 数据结构

  • 使用一个3x3的二维列表来表示棋盘,每个元素可以是 ‘X’、‘O’ 或 None(表示空位)。

2. 功能模块

  • 初始化棋盘:创建一个空棋盘。
  • 玩家输入:获取玩家的符号,并允许玩家在棋盘上选择位置。
  • 检查获胜条件:检查是否有玩家获胜。
  • 显示棋盘:在控制台打印当前棋盘状态。
  • 游戏循环:控制游戏的流程,直到游戏结束。

3. 用户界面

  • 简单的文本界面,使用控制台输入和输出。

实现步骤

  1. 初始化棋盘:创建一个3x3的列表,所有元素初始化为 None。
  2. 获取玩家符号:询问两名玩家他们选择的符号。
  3. 游戏主循环
    • 显示当前棋盘。
    • 轮流让玩家选择位置。
    • 检查玩家输入的位置是否有效。
    • 将玩家的符号放置在棋盘上。
    • 检查是否有玩家获胜。
    • 如果没有玩家获胜且棋盘未满,继续游戏。
  4. 检查获胜条件:检查所有行、列和对角线是否有连续的三个相同符号。
  5. 显示结果:宣布获胜者或平局。
  6. 重新开始:询问玩家是否重新开始游戏。

代码实现

def initialize_board():return [[None for _ in range(3)] for _ in range(3)]def print_board(board):for row in board:print(" | ".join(row))print("-" * 5)def is_winner(board, player):for i in range(3):if all(board[i][j] == player for j in range(3)):return Trueif all(board[j][i] == player for j in range(3)):return Trueif all(board[i][i] == player for i in range(3)):return Trueif all(board[i][2-i] == player for i in range(3)):return Truereturn Falsedef is_full(board):return all(all(cell is not None for cell in row) for row in board)def get_move(board, player):while True:try:row = int(input(f"Player {player}, enter your row (1-3): ")) - 1col = int(input(f"Player {player}, enter your column (1-3): ")) - 1if board[row][col] is None:return row, colelse:print("The cell is already taken. Try again.")except (ValueError, IndexError):print("Invalid input. Please enter a number between 1 and 3.")def tic_tac_toe():board = initialize_board()players = ['X', 'O']current_player = 0while True:print_board(board)row, col = get_move(board, players[current_player])board[row][col] = players[current_player]if is_winner(board, players[current_player]):print_board(board)print(f"Player {players[current_player]} wins!")breakif is_full(board):print_board(board)print("It's a draw!")breakcurrent_player = 1 - current_playerif input("Play again? (yes/no): ").lower().startswith('y'):tic_tac_toe()if __name__ == "__main__":tic_tac_toe()

测试

  • 单元测试:对每个函数进行单独测试,确保它们按预期工作。
  • 集成测试:测试整个游戏流程,包括游戏开始、玩家轮流、胜负判断和结束。
  • 用户测试:让真实用户试玩游戏,收集反馈并根据反馈进行调整。

注意事项

  • 确保用户输入有效,处理非法输入。
  • 游戏逻辑应清晰,易于理解和维护。
  • 代码应具有良好的可读性和注释,方便他人阅读和修改。

小结

通过本技术文章,我们学习了如何使用 Python 创建一个简单的井字棋游戏。这个游戏不仅锻炼了编程技能,还提供了一个有趣的项目来实践基本的算法和逻辑。希望读者能够通过这个项目获得乐趣,并在此基础上进一步探索和扩展游戏功能。

《跟着小王学Python》

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 的 Pygame 库,编写简单的 Flappy Bird 游戏

Pygame 是一个用 Python 编写的开源游戏开发框架,专门用于编写 2D 游戏。它提供了丰富的工具和功能,使得开发者能够快速实现游戏中的图形渲染、声音播放、输入处理和动画效果等功能。Pygame 非常适合初学者和想要快速创建游戏原型的开发者。 Pygame 的主…

LeetCode-222.完全二叉树的节点个数

. - 力扣(LeetCode) 给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一…

【MongoDB】MongoDB的核心-索引原理及索引优化、及查询聚合优化实战案例(超详细)

文章目录 一、数据库查询效率问题引出索引需求二、索引的基本原理及作用(一)索引的创建及数据组织(二)不同类型的索引(三)索引的额外属性 三、索引的优化与查询计划分析(一)通过prof…

企业如何实现无缝数据中心进行大数据迁移呢?

数据中心迁移是企业面临的一个复杂而关键的挑战,涉及到大量的数据移动和系统的重新部署。随着业务的扩展和技术的进步,企业可能需要将数据中心迁移到新的位置或升级到更先进的设备。在进行数据迁移时,必须精心规划和执行,以确保数…

初始JavaEE篇 —— 网络编程(2):了解套接字,从0到1实现回显服务器

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏:JavaEE 目录 TCP 与 UDP Socket套接字 UDP TCP 网络基础知识 在一篇文章中,我们了解了基础的网络知识,网络的出…

【人工智能】10分钟解读-深入浅出大语言模型(LLM)——从ChatGPT到未来AI的演进

文章目录 一、前言二、GPT模型的发展历程2.1 自然语言处理的局限2.2 机器学习的崛起2.3 深度学习的兴起2.3.1 神经网络的训练2.3.2 神经网络面临的挑战 2.4 Transformer的革命性突破2.4.1 Transformer的核心组成2.4.2 Transformer的优势 2.5 GPT模型的诞生与发展2.5.1 GPT的核心…

最全最简单理解迭代器

1. 迭代器的基础概念(iterator) 1.1 本质 迭代器能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针。 1.2 作用: 能够让迭代器与算法不干扰的相互发展,最后又能无间隙的粘合起来。重载了*,++,==,!=,=运算符。用以操作复杂的数据结构。容器提供迭代…

MTSET可溶于DMSO、DMF、THF等有机溶剂,并在水中有轻微的溶解性,91774-25-3

一、基本信息 中文名称:[2-(三甲基铵)乙基]甲硫基磺酸溴;MTSET巯基反应染料 英文名称:MTSET;[2-(Trimethylammonium)ethyl]methanethiosulfonate Bromide CAS号:91774-25-3 分子式:C6H16BrNO2S2 分子量…

CC1链学习记录

🌸 前言 上篇文章学习记录了URLDNS链,接下来学习一下Common-Colections利用链。 🌸 相关介绍 Common-Colections是Apache软件基金会的项目,对Java标准的Collections API提供了很好的补充,在其基础上对常用的数据结构…

数据结构PTA

20:C 22:B 27:D 填空 4-2:19 4-4:66 4-5:8 5-x:不加分号 ⬇:top p->next 编程 单链表 每个节点除了存放数据元素外,还要存储指向下一节点的指针…

【学术会议介绍,SPIE 出版】第四届计算机图形学、人工智能与数据处理国际学术会议 (ICCAID 2024,12月13-15日)

第四届计算机图形学、人工智能与数据处理国际学术会议 2024 4th International Conference on Computer Graphics, Artificial Intelligence and Data Processing (ICCAID 2024) 重要信息 大会官网:www.iccaid.net 大会时间:2024年12月13-15日 大会地…

【go从零单排】Command-Line Flags、Command-Line Subcommands命令行和子命令

🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 在 Go 语言中,命令行标志(Command-Line Flags&#xff09…

WEB攻防-通用漏洞SQL读写注入MYSQLMSSQLPostgraSQL

知识点: 1、SQL注入-MYSQL数据库; 2、SQL注入-MSSQL数据库; 3、SQL注入-PostgreSQL数据库; 首先要找到注入点 详细点: Access无高权限注入点-只能猜解,还是暴力猜解 MYSQL,PostgreSQL&am…

自定义springCloudLoadbalancer简述

概述 目前后端用的基本都是springCloud体系; 平时在dev环境开发时,会把自己的本地服务也注册上去,但是这样的话,在客户端调用时请求可能会打到自己本地,对客户端测试不太友好. 思路大致就是前端在请求头传入指定ip&a…

腾讯云11.11云服务器活动--上云拼团GO

目录 云服务器活动介绍: 轻量服务器 上GO拼团领券 云服务器购买 HAI现金券 学生专享GPU 活动总结 云服务器活动介绍: 双十一临近,这是您一年中最期待的购物狂欢时刻。作为国内领先的云计算服务商,腾讯云诚挚为您呈献前所未有的优惠福利,助您在这…

防脱生发最有效的产品,测评总结早看少踩雷

别人脱单、脱贫你脱发,就问你心酸不心酸?探索防脱之路确实不易,到底怎么才能有效防脱养发呢,很有必要分享一下我多年的防脱心得,这几款一直在用的防脱育发好物,秃头朋友们可以看看~ **露卡菲娅防脱精华液**…

c++:string(一)

文章目录 一string类1C语言中的字符串2C中的string二遍历1[ ]2迭代器3const迭代器4范围for5auto6总结三String的尾插1size和length2max_size,capacity和clear3访问接口4尾插字符和字符串5 append的重载三string的扩容问题(1)怎么扩容(2&#…

【2048】我的创作纪念日

机缘 2048天,不知不觉来csdn博客已经有2048天了,其实用csdn平台很久了,实际上写博客还是从2019年开始。 还记得最初成为创作者初心是什么吗? 最开始,主要是用来做笔记。平时工作中、学习中遇到的技术相关问题都会在cs…

壁仞科技上市前最后一波 校招 社招 内推

随着美国大选结束,国内GPU 产业得到空前的的发展空间,国内芯片相关股票一片飘红。 国内大型 GPU厂商壁仞科技,摩尔线程等正紧锣密鼓地加紧上市。 GPGPU 芯片赛道来到了史无前例的红利点,抓住机会💪 壁仞科技正在火热…

sql server 自动kill 查询超过20分钟的语句

起源于同事的烂sql 容易拖垮 数据服务器, 周末没有人监控数据库,好几次导致主从数据库同步失败 ,不得不自动kill 烂sql 语句如下 : -- 声明变量来存储超过20分钟的查询的会话ID DECLARE kill_sessions TABLE (session_id INT); …