pygame 实现五子棋小游戏

pygame 实现五子棋小游戏

pygame 实现五子棋小游戏。
五子棋是一种在棋盘上进行的两人对弈游戏。游戏目标是先在棋盘上形成连续的五颗自己颜色的棋子,无论是横、竖、斜线上都可以。
在 Python 中可以通过第三方库pygamenumpy来实现五子棋小游戏。

如下是代码示例:

# 调用 pygame 库
import pygame
import sys
# 调用常用关键字常量
from pygame.locals import QUIT, KEYDOWN
import numpy as np

# 初始化 pygame
pygame.init()
# 获取对显示系统的访问,并创建一个窗口 screen
# 窗口大小为 670 x 670
screen = pygame.display.set_mode((670, 670))
# 设置画布颜色, [238,154,73] 对应为棕黄色
screen_color = [238, 154, 73]
# 设置线条颜色,[0,0,0] 对应黑色
line_color = [0, 0, 0]

# 判断五子连心
def check_win(over_pos):
    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
    # 通过矩阵中的棋子判定横向出现五子连珠的情况
    for i in range(15):
        pos1 = []
        pos2 = []
        for j in range(15):
            # 统计白棋的棋子情况
            if mp[i][j] == 1:
                pos1.append([i, j])
            else:
                pos1 = []
            # 统计黑棋的棋子情况
            if mp[i][j] == 2:
                pos2.append([i, j])
            else:
                pos2 = []
            # 判定五子连珠
            if len(pos1) >= 5:
                return [1, pos1]
            if len(pos2) >= 5:
                return [2, pos2]
    # 通过矩阵中的棋子判定竖向出现五子连珠的情况
    for j in range(15):
        pos1 = []
        pos2 = []
        for i in range(15):
            # 统计白棋的棋子情况
            if mp[i][j] == 1:
                pos1.append([i, j])
            else:
                pos1 = []
            # 统计黑棋的棋子情况
            if mp[i][j] == 2:
                pos2.append([i, j])
            else:
                pos2 = []
            # 判定五子连珠
            if len(pos1) >= 5:
                return [1, pos1]
            if len(pos2) >= 5:
                return [2, pos2]
    # 通过矩阵中的棋子判定左斜向出现五子连珠的情况
    for i in range(15):
        for j in range(15):
            pos1 = []
            pos2 = []
            for k in range(15):
                # 统计棋盘中白棋和黑子的棋子情况
                if i + k >= 15 or j + k >= 15:
                    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]
    # 通过矩阵中的棋子判定右斜向出现五子连珠的情况
    for i in range(15):
        for j in range(15):
            pos1 = []
            pos2 = []
            for k in range(15):
                # 统计棋盘中白棋和黑子的棋子情况
                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]
    return [0, []]
# 找到显示的可以落子的位置
def find_pos(x, y):
    for i in range(27, 670, 44):
        for j in range(27, 670, 44):
            L1 = i - 22
            L2 = i + 22
            R1 = j - 22
            R2 = j + 22
            if x >= L1 and x <= L2 and y >= R1 and y <= R2:
                return i, j
    return x, y
# 检查当前的位置是否已经落子
def check_over_pos(x, y, over_pos):
    for val in over_pos:
        if val[0][0] == x and val[0][1] == y:
            return False
    # 表示没有落子
    return True

flag = False
tim = 0
# 表示已经落子的位置
over_pos = []
# 白棋颜色
white_color = [255, 255, 255]
# 黑棋颜色
black_color = [0, 0, 0]
# 不断训练刷新画布
while True:
    # 获取事件,如果鼠标点击右上角关闭按钮,关闭
    for event in pygame.event.get():
        if event.type in (QUIT, KEYDOWN):
            sys.exit()
    # 结束响应,清屏
    screen.fill(screen_color)
    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)
    # 在棋盘中心画个小圆表示正中心位置
    pygame.draw.circle(screen, line_color, [27 + 44 * 7, 27 + 44 * 7], 8, 0)
    # 显示所有落下的棋子
    for val in over_pos:
        pygame.draw.circle(screen, val[1], val[0], 20, 0)

    # 判断是否存在五子连心
    res = check_win(over_pos)
    if res[0] != 0:
        for pos in res[1]:
            pygame.draw.rect(screen, [238, 48, 167], [pos[0] * 44 + 27 - 22, pos[1] * 44 + 27 - 22, 44, 44], 2, 1)
        # 刷新显示
        pygame.display.update()
        # 游戏结束,停止下面的操作
        continue
    # 获取鼠标坐标信息
    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, 229, 238], [x - 22, y - 22, 44, 44], 2, 1)
    # 获取鼠标按键信息
    keys_pressed = pygame.mouse.get_pressed()
    # 鼠标左键表示落子, tim 用来延时的,因为每次循环时间间隔很断,容易导致明明只按了一次左键,却被多次获取,认为按了多次。
    if keys_pressed[0] and tim == 0:
        flag = True
        # 先判断是否可以落子,再执行落子操作
        if check_over_pos(x, y, over_pos):
            if len(over_pos) % 2 == 0:
                over_pos.append([[x, y], black_color])
            else:
                over_pos.append([[x, y], white_color])
    # 鼠标左键延时作用
    if flag:
        tim += 1
    if tim % 50 == 0:
        flag = False
        tim = 0
    # 刷新显示
    pygame.display.update()

上述程序定义了一些常量和函数,包括check_winfind_poscheck_over_pos等函数,用于判断是否存在五子连珠、找到落子点以及检查当前位置是否已经落子。在主程序中,该程序不断地循环并检测用户的鼠标操作,如果用户点击了左键并且可以落子,程序将在对应位置绘制一个圆形代表该颜色的棋子,并将其记录到已落子的集合over_pos中。同时,程序会通过check_win函数判断是否存在五子连珠的情况,如果存在,则停止游戏并将连子的位置用红框标注出来。最后,程序通过Pygame库将棋盘的状态绘制到屏幕上,实现了五子棋游戏的基本功能。

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值