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

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识别验证码的思路及解决方案

    Python识别验证码的思路及解决方案 验证码是一种常见的防止机器人恶意攻击的手段,但是对于需要自动化处理的任务来说,验证码也是一个难题。本攻略将介绍Python识别验证码的思路及解决方案,并提供两个示例。 步骤1:了解验证码的类型 在使用Python识别验证码之前,我们需要了解验证码的类型。常见的验证码类型包括数字验证码、字母验证码、数字字母混合验证码、滑…

    python 2023年5月15日
    00
  • python爬不同图片分别保存在不同文件夹中的实现

    下面针对该话题给出完整的攻略,包括流程和示例说明。 流程说明 要实现python爬不同图片分别保存在不同文件夹中,大致的流程可以概括为以下几个步骤: 定位需要爬取的目标页面,了解其URL及HTML结构; 使用Python爬虫库(比如requests、BeautifulSoup等),获取目标页面的HTML代码; 从HTML代码中获取所需的图像URL、标题或标签…

    python 2023年5月19日
    00
  • 基于QT制作一个简易的传输文件小工具

    下面是基于QT制作一个简易的传输文件小工具的完整攻略。 1. 准备工作 首先,你需要安装QT开发环境。可以到官网(https://www.qt.io/download)下载安装包并安装。 2. 创建工程 打开QT Creator,选择”File” -> “New File or Project”,在弹出的窗口中选择”QT Widgets Applica…

    python 2023年6月5日
    00
  • Python自动化办公之图片转PDF的实现

    下面我会详细讲解如何实现“Python自动化办公之图片转PDF”的功能。 1. 安装必要的Python库 在使用Python进行图片转PDF操作前,需要预先安装Pillow和reportlab两个库,可以使用pip命令进行安装。 pip install Pillow reportlab 2. 编写Python代码 导入必要的Python库 from PIL …

    python 2023年6月5日
    00
  • python3实现从kafka获取数据,并解析为json格式,写入到mysql中

    在这里我将为您提供一个完整的攻略,讲解如何用Python3从Kafka中获取数据,并将其解析为JSON格式,在将数据写入MySQL中的过程。 准备工作 在开始之前,需要先确保以下环境已经安装: Python3: 用于编写和执行Python代码 pip: 用于安装Python第三方包 kafka-python: 用于连接到Kafka并获取数据 pymysql:…

    python 2023年6月3日
    00
  • Python列表排序 list.sort方法和内置函数sorted用法

    以下是详细讲解“Python列表排序list.sort方法和内置函数sorted用法”的完整攻略。 在Python中,列表是一种常用的数据类型,可以来存储一组有序的数据。为了更好地处理列表数据,Python提供了两种排序方法:list.sort()方法和内置函数sorted。本文将介绍这两种方法的用法,并提供两个示例说明。 list.sort()方法 lis…

    python 2023年5月13日
    00
  • python实现三壶谜题的示例详解

    Python实现三壶谜题的示例详解 三壶谜题是一种经典的逻辑谜题,它涉及到三个水壶和一些水的问题。在这个问题中,我们需要找到一种方法,使得其中一个水壶恰好装有一定的水。在Python中,我们可以使用深度优先搜索算法来解决这个问题。本文将详细讲解Python中三壶谜题实现过程,包括状态表示、搜索算法和结果输出等。 状态表示 在解决三壶谜题之前,我们需要定义状态…

    python 2023年5月14日
    00
  • python字符串连接的N种方式总结

    Python字符串连接的N种方式总结 在Python中,字符串连接是一种常见的操作。本攻略将总结Python字符串连接的N种方式,包括使用+运算符、join()方法、f-string、format方法、%运算符等。 使用+运算符 我们可以使用+运算符将两个字符串连接成一个新的字符串。以下是示例代码,演示如何使用+运算符进行字符串连接: s1 = ‘Hello…

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