python实现简单的井字棋小游戏

yizhihongxing

Python实现简单的井字棋小游戏

井字棋是一种非常经典的小游戏,下面将详细讲解怎样使用 Python 实现一个简单的井字棋小游戏。

游戏规则

井字棋是由两个玩家轮流在一个3x3网格上放置棋子(通常是X和O),先将三个棋子排列成横线、竖线或斜线的玩家获胜。

实现步骤

  1. 定义游戏棋盘
  2. 定义棋手 (player)
  3. 输出棋盘并让玩家输入下棋位置
  4. 检查胜利和平局

定义游戏棋盘

我们可以使用一个二维列表来表示棋盘,每个元素代表一个棋子。

board = [
    [" ", " ", " "],
    [" ", " ", " "],
    [" ", " ", " "]
]

定义棋手

在定义棋手时,我们可以使用一个简单的类来表示。棋手具有下棋行为并且可以设置棋子的形状。

class Player:
    def __init__(self, name, symbol):
        self.name = name
        self.symbol = symbol

    def move(self, board):
        print(f"{self.name}, it's your turn!")
        x = int(input("Enter the row(1-3): "))
        y = int(input("Enter the column(1-3): "))
        if x < 1 or x > 3 or y < 1 or y > 3:
            print("Invalid move! Please enter the row and column between 1 and 3.")
            return self.move(board)
        if board[x-1][y-1] != " ":
            print("Invalid move! The spot is already taken.")
            return self.move(board)
        board[x-1][y-1] = self.symbol

输出棋盘并让玩家输入下棋位置

在每个轮次下棋前,我们需要输出当前棋盘以便玩家选择下棋位置。

def print_board(board):
    for i in range(3):
        for j in range(3):
            if j != 2:
                print(f" {board[i][j]} ", end="|")
            else:
                print(f" {board[i][j]} ")
        if i != 2:
            print("-----------")

检查胜利和平局

我们需要在每个轮次下棋后检查是否有一个玩家获得胜利或者所有的位置已经被占据。我们可以使用一个函数来判断游戏是否结束。

def is_win(board, symbol):
    for i in range(3):
        if board[i][0] == board[i][1] == board[i][2] == symbol: # 横向匹配
            return True
        if board[0][i] == board[1][i] == board[2][i] == symbol: # 纵向匹配
            return True
    if board[0][0] == board[1][1] == board[2][2] == symbol: # / 对角线匹配
        return True
    if board[0][2] == board[1][1] == board[2][0] == symbol: # \ 对角线匹配
        return True
    return False

def game_over(board):
    if is_win(board, "X"):
        print_board(board)
        print("Congratulations! The winner is X")
        return True
    elif is_win(board, "O"):
        print_board(board)
        print("Congratulations! The winner is O")
        return True
    elif all(board[i][j] != " " for i in range(3) for j in range(3)):
        print_board(board)
        print("It's a tie!")
        return True
    return False

游戏流程

将以上功能结合起来,就能够实现一个简单的井字棋小游戏了。

def tic_tac_toe():
    board = [
        [" ", " ", " "],
        [" ", " ", " "],
        [" ", " ", " "]
    ]
    players = [Player("Player X", "X"), Player("Player O", "O")]
    current_player = players[0]

    while True:
        print_board(board)
        current_player.move(board)
        if game_over(board):
            break
        # 切换玩家
        current_player = players[1] if current_player == players[0] else players[0]

if __name__ == "__main__":
    tic_tac_toe()

示例说明

示例一

下面是一局井字棋游戏的示例输出:

   |   |   
-----------
   |   |   
-----------
   |   |   
Player X, it's your turn! # X玩家的输入
Enter the row(1-3): 2
Enter the column(1-3): 2
   |   |   
-----------
   | X |   
-----------
   |   |   
Player O, it's your turn! # O玩家的输入
Enter the row(1-3): 1
Enter the column(1-3): 2
   | O |   
-----------
   | X |   
-----------
   |   |   
Player X, it's your turn! # X玩家的输入
Enter the row(1-3): 3
Enter the column(1-3): 3
   | O |   
-----------
   | X |   
-----------
   |   | X 
Player O, it's your turn! # O玩家的输入
Enter the row(1-3): 1
Enter the column(1-3): 1
 O | O |   
-----------
   | X |   
-----------
   |   | X 
Player X, it's your turn! # X玩家的输入
Enter the row(1-3): 1
Enter the column(1-3): 3
 O | O | X 
-----------
   | X |   
-----------
   |   | X 
Player O, it's your turn! # O玩家的输入
Enter the row(1-3): 3
Enter the column(1-3): 1
 O | O | X 
-----------
   | X |   
-----------
 O |   | X 
Player X, it's your turn! # X玩家的输入
Enter the row(1-3): 2
Enter the column(1-3): 1
 O | O | X 
-----------
 X | X |   
-----------
 O |   | X 
Congratulations! The winner is X # X玩家胜利

示例二

下面的示例说明了当一个玩家尝试占据已经被另一个玩家占据的位置时,程序会提示玩家重新输入:

   |   |   
-----------
   |   |   
-----------
   |   |   
Player X, it's your turn! 
Enter the row(1-3): 2 # X玩家选择(2, 2)
Enter the column(1-3): 2
   |   |   
-----------
   | X |   
-----------
   |   |   
Player O, it's your turn!
Enter the row(1-3): 2 # O玩家选择(2, 2),但是该位置已被占据
Enter the column(1-3): 2
Invalid move! The spot is already taken.
Enter the row(1-3): 1 # O玩家选择另外一个位置(1, 3)
Enter the column(1-3): 3
   |   |   
-----------
 O | X |   
-----------
   |   |   
Player X, it's your turn!
Enter the row(1-3): 1
Enter the column(1-3): 3
 X |   | X 
-----------
 O | X |   
-----------
   |   |   
Player O, it's your turn!
Enter the row(1-3): 4
Enter the column(1-3): 4 # 输入超出范围(1-3)
Invalid move! Please enter the row and column between 1 and 3.
Enter the row(1-3): 1
Enter the column(1-3): 1
 O |   | X 
-----------
 O | X |   
-----------
   |   |   
Player X, it's your turn!
Enter the row(1-3): 2
Enter the column(1-3): 1
 O |   | X 
-----------
 O | X |   
-----------
 X |   |   
Player O, it's your turn!
Enter the row(1-3): 2
Enter the column(1-3): 3
 O |   | X 
-----------
 O | X | O 
-----------
 X |   |   
Player X, it's your turn!
Enter the row(1-3): 3
Enter the column(1-3): 3
 O |   | X 
-----------
 O | X | O 
-----------
 X |   | X 
It's a tie!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现简单的井字棋小游戏 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • 用python监控服务器的cpu,磁盘空间,内存,超过邮件报警

    下面是使用Python监控服务器的CPU、磁盘空间、内存,并超过邮件报警的完整攻略: 1. 安装必要的Python库 我们需要安装以下Python库来监控服务器的CPU、磁盘空间和内存: psutil:用于获取系统CPU、内存和磁盘等信息。 smtplib:用于发送邮件。 可以使用pip安装这些库: pip install psutil smtplib 2.…

    python 2023年6月2日
    00
  • 基于Python实现从头搭建一个在线聊天室框架

    下面是详细讲解“基于Python实现从头搭建一个在线聊天室框架”的完整攻略: 1. 确定聊天室框架的基本要素和功能 在开始搭建聊天室框架之前,需要先确定聊天室框架的基本要素和功能,例如: 聊天室的名称和描述; 用户登录机制; 聊天室的房间和房间内的聊天内容; 用户之间的私聊和群聊功能; 在线用户列表和用户的状态(在线/离线)显示; 聊天记录的保存和载入功能。…

    python 2023年6月3日
    00
  • python暴力解压rar加密文件过程详解

    Python暴力解压RAR加密文件过程详解 前言 RAR文件格式是一种常见的压缩文件格式,可以在Windows中的WinRAR等软件中打开和解压。但是,如果RAR文件被加密了,我们就需要密码才能解压。如果你忘记了密码,或者想通过程序暴力破解,那么这篇文章就是为你准备的。 解压RAR加密文件的原理 RAR文件加密采用的是经典的AES加密算法,密码通常为ASCI…

    python 2023年6月3日
    00
  • Redis 如何实现分布式计数器?

    以下是 Redis 如何实现分布式计数器的完整使用攻略。 Redis 分布式计数器简介 在分布式系统中,为了保证数据的一致性和正确性,需要使用分布式计数器控制并发访问。Redis 作为一种高性能的存储数据库,可以很好地实现分布式计数器。 Redis 分布式计数器的实现原理是利用 Redis 的 INCRBY 命令,该命令可以在 Redis 中对一个键值进行原…

    python 2023年5月12日
    00
  • Java代码精简之道(推荐)

    Java代码精简之道 背景 在实际的应用开发中,我们编写的代码通常十分冗长,不仅影响了代码的可读性,也增加了项目的维护成本。本文致力于介绍代码精简的一些实现方法,以便优化代码,提高代码质量。 1. 提高代码重用性 代码可重用性是指同样的一段代码能够在不同的场景下重复使用。实现代码重用性最常见的方法是使用函数或方法。关于函数或方法的使用,可以从以下角度进行考虑…

    python 2023年5月14日
    00
  • python制作企业邮箱的爆破脚本

    下面是Python制作企业邮箱的爆破脚本的完整攻略: 目标 目标是通过Python编写脚本,实现对企业邮箱系统的爆破测试。 收集信息 在进行爆破之前,需要先收集相关信息。收集的信息包括: 邮箱服务器域名或IP地址 邮箱账户的用户名列表 邮箱账户中的常见密码列表 这些信息可以通过一些常见的信息收集工具和技术来获得,例如搜索引擎、whois查询、网络枚举工具等。…

    python 2023年6月3日
    00
  • python 用递归实现通用爬虫解析器

    Python用递归实现通用爬虫解析器 在爬虫编写过程中,解析器的编写是一个必不可少的环节。不同的网站页面结构可能会不一样,因此编写通用爬虫解析器可以提高代码的复用性。本文将介绍如何使用Python中的递归算法实现通用爬虫解析器的功能。 具体步骤 分析网页结构,确定爬取的目标元素的标签和类名。 使用Python中的Requests库获取网页的源代码。 使用Py…

    python 2023年5月14日
    00
  • From CSV to SQLite3 by python 导入csv到sqlite实例

    下面是从CSV导入SQLite3数据库的完整攻略: 1. 准备工作 在使用Python导入CSV文件之前,需要先安装Python的csv和sqlite3模块,具体的方法为: pip install csv pip install sqlite3 2. 读取CSV文件 首先,需要使用Python内置的csv模块读取CSV文件,然后将文件中的数据存储到列表中。下…

    python 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部