Python开发游戏之井字游戏的实战步骤

2023-02-05 08:57:57
目录
前言什么是井字游戏?Python 井字游戏——项目详情先决条件构建 Python 井字游戏的步骤1.初始化游戏组件2.初始化Pygame窗口3.加载和转换图像4.定义函数总结

前言

毫无疑问,你一定在学生时代玩过井字游戏,我们每个人都喜欢玩这款游戏。您会惊讶地发现井字游戏自古埃及时代就已存在。

通过>

什么是井字游戏?

Tic>

游戏由两个人玩。首先,我们画一个 3×3 方格的棋盘。第一个玩家选择“X”并将其绘制在任何方形网格上,然后第二个玩家有机会在可用空间上绘制“O”。像这样,玩家在空白处交替绘制“X”和“O”,直到玩家成功地以水平、垂直或对角线方式绘制 3 个连续标记。然后玩家赢得游戏,否则当所有位置都填满时游戏平局。

Python>

有趣的 Python 项目将使用 pygame 库构建。我们将解释该项目中使用的所有 pygame 对象方法。Pygame 是一个很棒的库,它允许我们创建窗口并在窗口上绘制图像和形状。这样我们将捕获鼠标坐标并确定我们需要标记“X”或“O”的块。然后我们将检查用户是否赢得了比赛。

先决条件

为了实现这个游戏,我们将使用>

pip install pygame

构建>

首先,让我们检查一下在 Python 中构建 Tic Tac Toe 程序的步骤:

    为我们的游戏创建显示窗口。在我们将玩井字游戏的画布上绘制网格。在画布下方绘制状态栏,以显示轮到哪个玩家以及谁赢得了游戏。当有人赢得比赛或比赛平局时,我们将重置比赛。

    我们需要在无限循环中运行我们的游戏。它会不断寻找事件,当用户在网格上按下鼠标按钮时,我们将首先获取鼠标的 X 和 Y 坐标。然后我们将检查用户点击了哪个方块。然后我们将在画布上绘制适当的“X”或“O”图像。所以这基本上就是我们将在这个 Python 项目想法中做的事情。

    1.初始化游戏组件

    因此,让我们从导入>

    import pygame as pg,sys 
    from pygame.locals import * 
    import time 
     
    #初始化全局变量
    XO = 'x' 
    winner = None 
    draw = False 
    width = 400 
    height = 400 
    white = (255, 255, 255) 
    line_color = (10,10 ,10) 
     
    #TicTacToe 3x3 棋盘
    TTT = [[None]*3,[None]*3,[None]*3]

    在这里,TTT 是主要的 3×3 井字棋盘,起初,它将有 9 个无值。我们将玩游戏的画布的高度和宽度为 400×400。

    2.初始化Pygame窗口

    我们使用>

    pg.display.set_mode ()初始化显示,我们用 screen 变量引用它。每当我们想在显示器上画东西时,都会使用这个屏幕变量。

    pg.display.set_caption 方法用于设置将出现在显示窗口顶部的名称。

    #初始化pygame窗口
    pg.init() 
    fps = 30 
    CLOCK = pg.time.Clock() 
    screen = pg.display.set_mode((width, height+100),0,32) 
    pg.display.set_caption("Tic Tac Toe")

    3.加载和转换图像

    Python>

    #加载图像
    opening = pg.image.load('tic tac opening.png')
    x_img = pg.image.load('x.png')
    o_img = pg.image.load('o.png')
     
    #调整图像大小
    x_img = pg.transform.scale(x_img, (80,80))
    o_img = pg.transform.scale(o_img, (80,80))
    opening = pg.transform.scale(opening, (width, height+100))

    4.定义函数

    现在我们创建一个函数来启动游戏。当我们想要重新启动游戏时,我们也会使用这个函数。在>

    所以我们绘制开场图像,绘制之后,我们总是需要用pg.display.update()更新显示。绘制开始图像时,我们使用time.sleep(1)等待 1 秒,然后用白色填充屏幕。

    接下来,我们在白色背景上绘制 2 条垂直线和水平线来制作 3×3 网格。最后,我们调用draw_status()函数

    def game_opening(): 
        screen.blit(opening,(0,0)) 
        pg.display.update() time.sleep 
        (1) 
        screen.fill(white) 
     
        # 绘制垂直线
        pg.draw.line(screen,line_color,(width/3,0),(width/3, height),7)
        pg.draw.line(screen,line_color,(width/3*2,0),(width/3*2, height),7)
        # 绘制水平线
        pg.draw.line(screen,line_color,(0,height/3),(width, height/3),7)
        pg.draw.line(screen,line_color,(0,height/3*2),(width, height/3*2),7)
        draw_status()

    draw_status ()函数绘制一个黑色矩形,我们在其中更新游戏状态,显示轮到哪个玩家以及游戏是结束还是平局。

    def draw_status():
        global draw
     
        if winner is None:
            message = XO.upper() + "'s Turn"
        else: 
            message = winner.upper() + "won!" 
        if draw: 
            message = 'Game Draw!' 
        font = pg.font.Font(None, 30) 
        text = font.render(message, 1, (255, 255, 255)) 
        # 将呈现的消息复制到板上
        screen.fill ((0, 0, 0), (0、400、500、100)) 
        text_rect = text.get_rect(center=(width/2, 500-50)) 
        screen.blit(text, text_rect) 
        pg.display.update()

    check_win()函数检查井字棋盘以查看“X”和“O”的所有标记。它计算玩家是否赢得了比赛。当玩家在一行、一列或对角线上连续标记 3 个标记时,他们可以获胜。每当我们在板上画一个标记“X”或“O”时,都会调用此函数。

    def check_win():
        global TTT, winner,draw
     
        # 检查获胜行
        for row in range (0,3):
            if ((TTT [row][0] == TTT[row][1] == TTT[row][2]) and(TTT [row][0] is not None)):
                # this row won
                winner = TTT[row][0]
                pg.draw.line(screen, (250,0,0), (0, (row + 1)*height/3 -height/6),\
                                  (width, (row + 1)*height/3 - height/6 ), 4)
                break
     
        # 检查获胜列
        for col in range (0, 3):
            if (TTT[0][col] == TTT[1][col] == TTT[2][col]) and (TTT[0][col] is not None):
                # 绘制获胜线
                winner = TTT[0][col]
                #draw winning line
                pg.draw.line (screen, (250,0,0),((col + 1)* width/3 - width/6, 0),\
                              ((col + 1)* width/3 - width/6, height), 4)
                break
     
        # 检查对角线赢家
        if (TTT[0][0] == TTT[1][1] == TTT[2][2]) and (TTT[0][0] is not None):
            # game won 对角线从左到右
            winner = TTT[0][0]
            pg.draw.line (screen, (250,70,70), (50, 50), (350, 350), 4)
     
        if (TTT[0][2] == TTT[1][1] == TTT[2][0]) and (TTT[0][2] is not None):
            # game won diagonally right to left
            winner = TTT[0][2]
            pg.draw.line (screen, (250,70,70), (350, 50), (50, 350), 4)
     
        if(all([all(row) for row in TTT]) and winner is None ):
            draw = True
        draw_status()

    drawXO(row, col) 函数获取鼠标单击的行和列,然后绘制“X”或“O”标记。我们从绘制标记的 png 图像的位置计算起点的 x 和 y 坐标。

    def drawXO(row,col):
        global TTT,XO
        if row==1:
            posx = 30
        if row==2:
            posx = width/3 + 30
        if row==3:
            posx = width/3*2 + 30
     
        if col==1:
            posy = 30
        if col==2:
            posy = height/3 + 30
        if col==3:
            posy = height/3*2 + 30
        TTT[row-1][col-1] = XO
        if(XO == 'x'):
            screen.blit(x_img,(posy,posx))
            XO= 'o'
        else:
            screen.blit(o_img,(posy,posx))
            XO= 'x'
        pg.display.update()
        #print(posx,posy)
        #print(TTT)

    最后一个函数是 reset_game()。这将重新启动游戏,我们还将所有变量重置为游戏的开始。

    def reset_game():
        global TTT, winner,XO, draw
        time.sleep(3)
        XO = 'x'
        draw = False
        game_opening()
        winner=None
        TTT = [[None]*3,[None]*3,[None]*3]

    万岁!游戏已经完成,可以玩了。使用tictactoe.py文件名保存源代码并运行该文件。

    总结

    到此这篇关于Python开发游戏之井字游戏的文章就介绍到这了,更多相关Python开发井字游戏内容请搜索易采站长站以前的文章或继续浏览下面的相关文章希望大家以后多多支持易采站长站!