前几天突发奇想做一个五子棋,但是技术储备不足,于是就在C站找资料,于是我就借鉴大佬做的五子棋,根据其思路,我做的一些笔记。
目录
大佬的代码写的已经很详细了,我就不全拿出来,点击下方链接查看全部代码。
一,棋盘的绘制
1.窗口
这是用代码写出来的UI
# 创建窗体
screen = pygame.display.set_mode((670, 670))
# 背景板颜色
Checkerboard_Color = (0xE3, 0x92, 0x65)
2.网格
棋盘上的线条是通过循环和if条件语句绘制而成
for循环绘制网格线,if条件语句则是让边缘线加粗。
# 画边缘线
for i in range(27, 670, 44):
# 先画竖线
if i == 27 or i == 670 - 27:
# 边缘线稍微粗一些
pygame.draw.line(screen, line_color, [i, 27], [i, 670 - 27], 4)
else:
pygame.draw.line(screen, line_color, [i, 27], [i, 670 - 27], 2)
# 再画横线
# 边缘线稍微粗一些
if i == 27 or i == 670 - 27:
# 边缘线
pygame.draw.line(screen, line_color, [27, i], [670 - 27, i], 4)
else:
pygame.draw.line(screen, line_color, [27, i], [670 - 27, i], 2)
# 边框内线 起点、终点、步长
for i in range(32, 670, 605):
pygame.draw.line(screen, line_color, [i, 27], [i, 670 - 27], 2)
pygame.draw.line(screen, line_color, [27, i], [670 - 27, i], 2)
3.星位
之前不懂这是什么意思,后来C站学习Pygame的基础,知道这句话的意思是画圆。
# 在棋盘中心画个小圆表示正中心位置 位置 半径、线厚度
pygame.draw.circle(screen, line_color, [27 + 44 * 7, 27 + 44 * 7], 8, 10)
# 设置四个角落的标点
# 左上
pygame.draw.circle(screen, line_color, [27 + 44 * 3, 27 + 44 * 3], 6, 10)
# 右上
pygame.draw.circle(screen, line_color, [27 + 44 * 11, 27 + 44 * 11], 6, 10)
# 左下
pygame.draw.circle(screen, line_color, [27 + 44 * 3, 27 + 44 * 11], 6, 10)
# 右下
pygame.draw.circle(screen, line_color, [27 + 44 * 11, 27 + 44 * 3], 6, 10)
二,游戏功能介绍
1.下棋
把鼠标设置为一个圆圈,让下棋的人看起来跟直观,不容易下错地方。
# 获取鼠标坐标信息
x, y = pygame.mouse.get_pos()
x, y = find_pos(x, y)
棋盘上没有棋子的时候圆圈是黑色,有棋子的时候变成了白色。
# 把鼠标设置成圆圈
if check_over_pos(x, y, over_pos):
# 颜色 确定位置 长度、宽度、线厚度、圆角度
pygame.draw.rect(screen, [0, 0, 30], [x - 22, y - 22, 44, 44], 3, 20)
# 有棋子后颜色变白
else:
pygame.draw.rect(screen, [224, 224, 223], [x - 22, y - 22, 44, 44], 3, 20)
定义棋子的颜色
# 白棋颜色
white_color = [244, 244, 244]
# 黑棋颜色
black_color = [10, 10, 10]
2.胜利的判断
胜利的判断是通过设置四个方向的条件,来判定输赢。下面是我拿出一方向来解释。
# zeros(shape, dtype=float)
# 数据类型对象为整数
mp = np.zeros([15, 15], dtype=int)
# 确定落棋位置
for val in over_pos:
x = int((val[0][0] - 27) / 44)
y = int((val[0][1] - 27) / 44)
# 让黑白棋交替
if val[1] == white_color:
mp[x][y] = 2 # 表示白子
else:
mp[x][y] = 1 # 表示黑子
# 向右倾斜连线
# i代表竖直,j代表竖直方向
#用循环嵌套来同时判定水平和竖直方向棋子的位置。
for i in range(15):
for j in range(15):
pos1 = []
pos2 = []
for k in range(15):
# 竖直方向+1,竖直方向向左+1
if i + k >= 15 or j - k < 0:
# 如果达到条件,停止下面的操作
break
if mp[i + k][j - k] == 1:
pos1.append([i + k, j - k])
else:
pos1 = []
if mp[i + k][j - k] == 2:
pos2.append([i + k, j - k])
else:
pos2 = []
if len(pos1) >= 5:
return [1, pos1]
if len(pos2) >= 5:
return [2, pos2]
三,胜利提示
1.棋子上的显示
如图所示,连起来的五个棋子周围会显示方框提示。
# 获胜后显示 颜色 确定位置 长度、宽度、厚度、圆角
pygame.draw.rect(screen, [0, 0, 153], [pos[0] * 44 + 27 - 22, pos[1] * 44 + 27 - 22, 44, 44], 2, 5)
2.胜利提示窗口
这个代码我在C站找了很久都没有找到,最后是我的老师告诉我这串代码。
# 首先在代码最前面导入tkiner
from tkinter import *
from tkinter import messagebox
#代表白色棋子
if val[1] == white_color:
Tk().wm_withdraw()
messagebox.showinfo('白棋获胜', '恭喜白棋一方获胜')
else:
Tk().wm_withdraw()
messagebox.showinfo('黑棋获胜', '恭喜黑棋一方获胜')
喜欢的话,请留下你的赞美。