Python五子棋

先拿图片资源:

百度网盘

链接:https://pan.baidu.com/s/135E38nVPwp-R5KuSZUGNKQ 
提取码:z7x4 

以上图片部分来自网络,部分自制。

 

再来看看成品效果图

*********************************************************************************************************************************************************************************************************************************************

来看代码:

*********************************************************************************************************************************************************************************************************************************************

import pygame
import time
import sys
from pygame.locals import *

# 定义棋盘
init_chess_list = []  # 保存棋盘坐标
init_role = 1  # 保存棋子(1:白--2:黑)
result_flag = 0  # 保存结果

# 落子类
class StonePoint(object):
    def __init__(self, x, y, value):
        """
        :param x: x坐标
        :param y: y坐标
        :param value: 是否有子( 0:没有,1:白,2:黑)
        """
        self.x = x
        self.y = y
        self.value = value

# 初始化棋盘
def init_chess(x, y):
    for i in range(15):  # 每一行
        row_list = []
        for j in range(15):  # 每一列
            point_x = x + j * 40
            point_y = y + i * 40
            sp = StonePoint(point_x, point_y, 0)  # 获取点位
            row_list.append(sp)  # 集合一行全部的点
        init_chess_list.append(row_list)  # 将一行存入棋盘

# 事件监听
def eventHander():
    for event in pygame.event.get():
        global init_role, result_flag, init_chess_list
        if event.type == pygame.QUIT:  # 退出游戏
            pygame.quit()
            sys.exit()
        if event.type == MOUSEBUTTONDOWN:  # 鼠标点击
            x, y = pygame.mouse.get_pos()  # 获取鼠标点击坐标值
            i = 0
            j = 0
            for temp in init_chess_list:  #获取行
                for point in temp:  # 获取列
                    if x >= point.x - 15 and x <= point.x + 15 and y <= point.y + 15 and y >= point.y - 15 and result_flag == 0:
                        if point.value == 0 and init_role == 1:  # 落子点为空且白子下
                            point.value = 1  # 落子
                            init_role = 2  # 切换角色
                            resultType(i, j, 1)
                        elif point.value == 0 and init_role == 2:  # 落子点为空且黑子下
                            point.value = 2  # 落子
                            init_role = 1  # 切换角色
                            resultType(i, j, 2)
                        break
                    j += 1
                i += 1
                j = 0
            # 重新开始
            if result_flag > 0 and x >= 250 and x <= 365 and y >= 770 and y <= 810:
                result_flag = 0
                init_chess_list = []  # 清空棋盘
                init_role = 1
                main().screen.blit(main().game, (0, 615))


# 判断函数
def resultType(i, j, value):  # 先传入子
    global result_flag
    flag = False
    if result_flag <= 0:
        for x in range(j - 4, j + 5):  # 横向检测
            if x >= 0 and x + 4 < 15:
                if init_chess_list[i][x].value == value and \
                        init_chess_list[i][x + 1].value == value and \
                        init_chess_list[i][x + 2].value == value and \
                        init_chess_list[i][x + 3].value == value and \
                        init_chess_list[i][x + 4].value == value:
                    flag = True
                    break
        for y in range(i - 4, i + 5):  # 纵向检测
            if y >= 0 and y + 4 < 15:
                if init_chess_list[y][j].value == value and \
                        init_chess_list[y + 1][j].value == value and \
                        init_chess_list[y + 2][j].value == value and \
                        init_chess_list[y + 3][j].value == value and \
                        init_chess_list[y + 4][j].value == value:
                    flag = True
                    break
        # 下面那个-1暂时不知道干哈的,但是确实不能少
        for x, y in zip(range(j + 4, j - 5, -1), range(i - 4, i + 5)):  # 东北-西南方向检测
            if x >= 0 and x + 4 < 15 and y >= 0 and y + 4 < 15:
                if init_chess_list[y][x].value == value and \
                        init_chess_list[y - 1][x + 1].value == value and \
                        init_chess_list[y - 2][x + 2].value == value and \
                        init_chess_list[y - 3][x + 3].value == value and \
                        init_chess_list[y - 4][x + 4].value == value:
                    flag = True
                    break
        for x, y in zip(range(j - 4, j + 5), range(i - 4, i + 5)):  # 西北--东南方向检测
            if x >= 0 and x + 4 < 15 and y >= 0 and y + 4 < 15:
                if init_chess_list[y][x].value == value and \
                        init_chess_list[y + 1][x + 1].value == value and \
                        init_chess_list[y + 2][x + 2].value == value and \
                        init_chess_list[y + 3][x + 3].value == value and \
                        init_chess_list[y + 4][x + 4].value == value:
                    flag = True
                    break

        if flag:  # 如果五子连珠
            result_flag = value
            if value == 1:
                print("白旗胜")
            elif value == 2:
                print("黑棋胜")

# 加载素材
def main():
    global init_chess_list, result_flag
    init_chess(27, 27)  # 棋盘两边多出15,一半就是7,半个格子就是20
    pygame.init()  # 初始化游戏
    screen = pygame.display.set_mode((615, 815), 0, 0)  # 设置游戏窗口
    pygame.display.set_caption("五子棋")  # 设置窗口标题
    bg = pygame.image.load("./images/bg.png")  # 背景图片
    white = pygame.image.load("./images/storn_white.png")  # 白棋图片
    black = pygame.image.load("./images/storn_black.png")  # 黑棋图片
    result = pygame.image.load("./images/resultStorn.jpg")  # 结束图片
    game = pygame.image.load("./images/gaming.png")
    whiteWin = pygame.image.load("./images/white_win.png")
    blackWin = pygame.image.load("./images/black_win.png")
    restart = pygame.image.load("./images/restart.png")
    rect = white.get_rect()  # 获取棋子图片 x,y

    while True:
        screen.blit(bg, (0, 0))
        screen.blit(game, (0, 615))
        # screen.blit(restart, (250, 770))
        for temp in init_chess_list:
            for point in temp:  # 落子贴图
                if point.value == 1:
                    screen.blit(white, (point.x - 18, point.y - 18))
                if point.value == 2:
                    screen.blit(black, (point.x - 18, point.y - 18))

        if result_flag == 1:
            # init_chess_list = []  # 清空棋盘
            # init_chess(27, 27)  # 重新初始化棋盘
            screen.blit(whiteWin, (0, 615))  # 绘制获胜时的图片
            screen.blit(restart, (250, 770))
            # result_flag = 0  # 置空之前的获胜结果
        elif result_flag == 2:
            # init_chess_list = []  # 清空棋盘
            # init_chess(27, 27)  # 重新初始化棋盘
            screen.blit(blackWin, (0, 615))  # 绘制获胜时的图片
            screen.blit(restart, (250, 770))
            # result_flag = 0  # 置空之前的获胜结果
        pygame.display.update()  # 更新视图
        eventHander()  # 事件监听



if __name__ == '__main__':
    main()

本程序没有面向对象的感觉,此代码主要借鉴自qq_43608549的博客  老手er 

原文链接:https://blog.csdn.net/qq_43608549/article/details/100059765

感谢观看!!!

接下来会发布 Python井字棋 使用面向对象程序设计。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值