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 enumerate函数的使用方法总结

    下面是“Python enumerate函数的使用方法总结”的完整攻略: 概述 enumerate()是Python内置函数,可同时返回数据对象的索引及其对应值。 当需要对数据进行循环迭代,且需要知道当前处理数据的位置时,使用enumerate()函数能够非常方便地完成此任务。 语法 enumerate(sequence, [start=0]) sequen…

    python 2023年6月3日
    00
  • Python读取实时数据流示例

    下面是详细讲解 “Python读取实时数据流示例” 的完整攻略。 概述 实时数据流是指按时间顺序产生的数据流。为了从实时数据流中获取数据,需要使用流处理技术和实时流数据处理框架,例如 Apache Storm、Kafka、Spark Streaming 等。Python 也提供了很多用于实时数据流处理的库和框架,例如pandas、numpy、pyspark、…

    python 2023年6月2日
    00
  • python3.6 tkinter实现屏保小程序

    Python3.6 Tkinter实现屏保小程序的完整攻略如下: 1. 简介 Python3.6是一门面向对象的编程语言,其标准库中自带有GUI工具包Tkinter,以便开发人员可以轻松地创建用户界面。屏保是一种用于显示屏幕的程序,目的是防止屏幕过度使用而导致的损坏。在本教程中,我们将使用Python3.6和Tkinter来创建一个简单的屏保小程序。 2.实…

    python 2023年5月23日
    00
  • Python多线程使用方法详细讲解

    Python多线程使用方法详细讲解 在 Python 中,多线程可以用于许多场景,比如爬虫、并行处理等。本文将详细讲解 Python 多线程的使用,包括线程创建、启动、停止、同步等方面。 线程创建 Python 中创建线程有两种方式:函数和类。我们先看函数方式的创建。 函数方式 在 Python 中,可以使用 threading 模块的 Thread() 方…

    python 2023年5月19日
    00
  • 如何使Python中的print()语句运行结果不换行

    要使Python中的print()语句的运行结果不换行有多种方法,下面分别介绍两种常用的方法: 方法一:设置print语句的参数 在Python中,print()函数默认会在输出完语句后自动换行,但是你可以通过设置该语句的参数end为一个空字符串来让print语句输出后不换行,示例如下: print("hello", end="…

    python 2023年6月5日
    00
  • 带有 Python 错误的 OpenCV arcLength

    【问题标题】:OpenCV with Python error for arcLength带有 Python 错误的 OpenCV arcLength 【发布时间】:2023-04-03 18:57:01 【问题描述】: 我的代码有问题,找不到合适的解决方案。我正在使用 Python 2.7.10 和 OpenCV 3.0。我阅读了两张图片,并希望将其中一张…

    Python开发 2023年4月8日
    00
  • Python实现抓取百度搜索结果页的网站标题信息

    在本攻略中,我们将介绍如何使用Python实现抓取百度搜索结果页的网站标题信息。我们将使用requests库和BeautifulSoup库来实现这个功能。 以下是一个完整攻略包括两个示例。 步骤1:安装requests和BeautifulSoup 首先,安装requests和BeautifulSoup。我们可以使用pip命令来安装这两个库。 pip inst…

    python 2023年5月15日
    00
  • python os模块使用方法介绍

    Python os模块使用方法介绍 os 模块提供了许多与操作系统交互的方法。本文将介绍如何使用 os 模块。 os模块简介 os 模块是 Python 的标准模块之一,它提供了许多和操作系统相关的函数,可以实现与文件系统、进程等进行交互的操作。 常用的os模块函数 下面是一些常用的 os 模块函数: os.getcwd():获取当前工作目录。 os.chd…

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