项目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 ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一…

两数组根据数组中每条数据对象中的某个值合并去重

假设有两个数组:arr1 和 arr2,并且每个数组中的元素是对象,你希望根据对象中的某个属性(比如 id),判断 arr2 中是否已经存在具有相同 id 值的对象。如果没有重复,就将 arr1 中的该对象新增到 ar…

16008.行为树(五)-自定义数据指针在黑板中的传递

文章目录 1.1 背景1.2 xml文件定义1.3 代码实现1.3 执行结果1.1 背景 自定义数据结构指针,通过黑板的形式,在树的节点中进行指针的传递。 1.2 xml文件定义 xhome@ubuntu:~/opt/groot_pro$ cat unit_t1.xml<?xml version="1.0" encoding="UTF-8"?&…

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

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

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

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

FOFA使用教程之从零到精通

FOFA使用教程之从零到精通 前言一、关于网络资产测绘的概念1、啥是网络空间资产测绘2、啥是互联网资产二、FOFA的简要介绍1、FOFA地址是啥?2、关于FOFA的简要介绍三、FOFA精讲1、运算符规则详解① 关于 = 号的使用说明② 关于 == 号的使用说明③ 关于 && 号的使用说明…

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

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

【人工智能】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的核心…

Webpack 中无法解析别名路径的原因及解决方案

Webpack 中无法解析别名路径的原因及解决方案 文章目录 Webpack 中无法解析别名路径的原因及解决方案1. 引言2. 理解别名路径&#xff08;Alias&#xff09;2.1 什么是别名路径&#xff1f;2.2 别名路径的优势 3. 如何在Webpack中配置别名路径3.1 基本配置3.2 使用别名路径 4. …

最全最简单理解迭代器

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

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

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

CC1链学习记录

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

Android 配置默认输入法

1.背景 最近有个国内的项目&#xff0c;预制了输入法apk&#xff0c;但是无法调出软键盘。原因是没有配置默认输入法&#xff0c;本文主要记录下如何配置默认输入法。 2.代码设置 设置默认输入法需要配置Settings.Secure.ENABLED_INPUT_METHODS和Settings.Secure.DEFAULT_IN…

【juc】ConcurrentHashMap

目录 1.说明2.基本结构3.线程安全机制3.1 分段锁3.2 CAS操作3.3 volatile关键字 4.扩容机制5.其他特性 1.说明 1.ConcurrentHashMap是Java中的一个线程安全的哈希表实现。 2.ConcurrentHashMap的底层结构主要由数组、链表和红黑树组成。 3.在JDK 1.8及之后的版本中&#xff0c;…

数据湖与数据仓库的区别

数据湖与数据仓库是两种不同的数据存储和管理方式&#xff0c;它们在多个方面存在显著的区别。以下是对数据湖与数据仓库区别的详细阐述&#xff1a; 一、数据存储方式 数据仓库 通常采用预定义的模式和结构来存储数据。数据在存储前通常经过清洗、转换和整合等处理&#xff0…

数据结构PTA

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

有哪些机器学习实战?——AI实战指南

机器学习已经从理论走向实际应用&#xff0c;各行业的公司和个人都希望通过机器学习来解决现实问题&#xff0c;提升效率。那么&#xff0c;有哪些值得学习和实践的机器学习项目呢&#xff1f;以下将介绍几类热门的机器学习实战项目&#xff0c;涵盖了推荐系统、图像识别、自然…

go语言中的通道(channel)详解

在 Go 语言中&#xff0c;通道&#xff08;channel&#xff09; 是一种用于在 goroutine&#xff08;协程&#xff09;之间传递数据的管道。通道具有类型安全性&#xff0c;即它只能传递一种指定类型的数据。通道是 Go 并发编程的重要特性&#xff0c;能够让多个 goroutine 之间…

Flutter-Padding组件

1. 说明 在html中常见的布局标签都有padding属性&#xff0c;但是Flutter中很多Widget是没有padding属性。这个时候 我们可以用Padding组件处理容器与子元素之间的间距 2. 属性 padding&#xff1a;padding值, EdgeInsetss设置填充的值 child&#xff1a;子组件 3. …