前言
毫无疑问,你一定在学生时代玩过井字游戏,我们每个人都喜欢玩这款游戏。您会惊讶地发现井字游戏自古埃及时代就已存在。
通过 TechVidvan 的这个 Python 项目,我们将构建一个交互式 Tic Tac Toe 游戏,我们将在此过程中学习新事物。
什么是井字游戏?
Tic Tac Toe 是玩得最多的游戏之一,也是最好的消磨时间的游戏,您可以在任何地方用笔和纸玩。如果您不知道如何玩这个游戏,请不要担心,让我们先了解一下。
游戏由两个人玩。首先,我们画一个 3×3 方格的棋盘。第一个玩家选择“X”并将其绘制在任何方形网格上,然后第二个玩家有机会在可用空间上绘制“O”。像这样,玩家在空白处交替绘制“X”和“O”,直到玩家成功地以水平、垂直或对角线方式绘制 3 个连续标记。然后玩家赢得游戏,否则当所有位置都填满时游戏平局。
Python 井字游戏——项目详情
有趣的 Python 项目将使用 pygame 库构建。我们将解释该项目中使用的所有 pygame 对象方法。Pygame 是一个很棒的库,它允许我们创建窗口并在窗口上绘制图像和形状。这样我们将捕获鼠标坐标并确定我们需要标记“X”或“O”的块。然后我们将检查用户是否赢得了比赛。
先决条件
为了实现这个游戏,我们将使用 Python 和 Pygame 的基本概念,Pygame 是一个用于构建跨平台游戏的 Python 库。它包含计算机图形和声音库所需的模块。要安装该库,您可以从命令行使用 pip 安装程序:
1
|
pip install pygame |
构建 Python 井字游戏的步骤
首先,让我们检查一下在 Python 中构建 Tic Tac Toe 程序的步骤:
- 为我们的游戏创建显示窗口。
- 在我们将玩井字游戏的画布上绘制网格。
- 在画布下方绘制状态栏,以显示轮到哪个玩家以及谁赢得了游戏。
- 当有人赢得比赛或比赛平局时,我们将重置比赛。
我们需要在无限循环中运行我们的游戏。它会不断寻找事件,当用户在网格上按下鼠标按钮时,我们将首先获取鼠标的 X 和 Y 坐标。然后我们将检查用户点击了哪个方块。然后我们将在画布上绘制适当的“X”或“O”图像。所以这基本上就是我们将在这个 Python 项目想法中做的事情。
1.初始化游戏组件
因此,让我们从导入 pygame 库和时间库开始,因为我们将使用time.sleep()方法在特定位置暂停游戏。然后我们初始化我们将在 Tic Tac Toe 游戏中使用的所有全局变量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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窗口
我们使用 pygame 创建一个新窗口,我们将在其中玩 Tic Tac Toe 游戏。所以我们用pg.init()方法初始化pygame ,设置窗口显示宽度为400,高度为500。我们预留了100像素的空间用于显示游戏状态。
pg.display.set_mode ()初始化显示,我们用 screen 变量引用它。每当我们想在显示器上画东西时,都会使用这个屏幕变量。
pg.display.set_caption 方法用于设置将出现在显示窗口顶部的名称。
1
2
3
4
5
6
|
#初始化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 项目使用了许多图像,例如游戏开始或重置时将显示的开场图像。当用户点击网格时我们将绘制的 X 和 O 图像。我们加载所有图像并调整它们的大小,以便它们很容易适合我们的窗口。
1
2
3
4
5
6
7
8
9
|
#加载图像 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.定义函数
现在我们创建一个函数来启动游戏。当我们想要重新启动游戏时,我们也会使用这个函数。在 pygame 中,blit()函数用于在表面上绘制一个图像到另一个图像之上。
所以我们绘制开场图像,绘制之后,我们总是需要用pg.display.update()更新显示。绘制开始图像时,我们使用time.sleep(1)等待 1 秒,然后用白色填充屏幕。
接下来,我们在白色背景上绘制 2 条垂直线和水平线来制作 3×3 网格。最后,我们调用draw_status()函数
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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 ()函数绘制一个黑色矩形,我们在其中更新游戏状态,显示轮到哪个玩家以及游戏是结束还是平局。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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”时,都会调用此函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
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 坐标。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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()。这将重新启动游戏,我们还将所有变量重置为游戏的开始。
1
2
3
4
5
6
7
8
|
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开发井字游戏内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/sikh_0529/article/details/128394759