python实现《五子棋》

        今天突然心血来潮,想全程自己写一个小游戏(毕竟对于一个才接触python不到一个月的小白来说,还是比较为难,虽然不算是完全成功,因为棋盘大小和布局还是借鉴了其它博主的,但这都是小问题,重要是其它的都是自己写的嘛!!!(咦,这小编真能扯,还不上代码)) 。相信各位既然来到了这里,那一定对这规则了如指掌了的。那我就不多赘述了。

        先上图(有图有真相)

        下面就由我来盖释盖释(解释解释)这破代码

         这个参数是为了记录当前的轮次(该谁来)

class Stats:
        def __init__(self):
                """管理游戏过程中的可变参数"""
                self.turn = 2  #当前轮次,1表示白棋,2表示黑棋

        游戏中的固定参数

class Setting:
        def __init__(self):
                self.screen_size = (670, 670)
                self.screen_color = (238, 154, 73)
                self.line_color = (0, 0, 0)
                self.chess = [(), (255, 255, 255), (0, 0, 0)] #1表示白色,2表示黑色

        使用sys中的exit()来结束游戏

扫描二维码关注公众号,回复: 14759911 查看本文章

        使用pygame中的画图工具来绘制

        1.pygame.draw.line(surface对象,颜色,起点坐标,终点坐标,线条大小) #坐标采用[x,y]表示。

        2.pygame.draw.cirle(surface对象,颜色,圆点坐标,半径大小,外边框大小=0)   #外边框大小缺省默认为0,表示绘制实心圆;大于0表示绘制空心圆,数值大小表示边框线条粗细;小于0则什么都不会绘制。

import sys

import pygame

from game_over import isover
from game_stats import Stats
from setting import Setting


class my_chess:
        """管理五子棋的类"""

        def __init__(self):
                pygame.init()  # 获取对显示系统的访问

                # 记录棋子位置的数组,用于判断当前文字是否可下和判断五子连心
                self.chess_color = []
                self.chess = []
                self.chess_position = [[0 for _ in range(15)] for _ in range(15)]

                self.setting = Setting()  # 游戏参数设置
                self.stats = Stats()

                self.screen = pygame.display.set_mode(self.setting.screen_size)
                pygame.display.set_caption("我的五子棋")

        def run_game(self):
                while True:
                        self.update_screen()

                        # 将之前的棋子绘制出来
                        for i in range(len(self.chess_color)):
                                pygame.draw.circle(self.screen, self.chess_color[i], self.chess[i], 22)

                        self.event_check()

                        # pygame.display.flip()  # 让最近绘制的屏幕可见
                        pygame.display.update()

        def update_screen(self):
                """刷新屏幕显示"""

                self.screen.fill(self.setting.screen_color)  # 先填充背景色

                """绘制棋盘"""
                for i in range(27, 670, 44):
                        if i == 27 or i == 670 - 27:
                                # 边界线条画大一点
                                # 横线
                                pygame.draw.line(self.screen, self.setting.line_color, [i, 27], [i, 670 - 27], 4)
                                # 竖线
                                pygame.draw.line(self.screen, self.setting.line_color, [27, i], [670 - 27, i], 4)
                        else:
                                pygame.draw.line(self.screen, self.setting.line_color, [i, 27], [i, 670 - 27], 2)
                                pygame.draw.line(self.screen, self.setting.line_color, [27, i], [670 - 27, i], 2)

                # 中心小黑点绘制
                pygame.draw.circle(self.screen, self.setting.line_color, [27 + 44 * 7, 27 + 44 * 7], 7)

        def event_check(self):
                """对游戏发生的事件进行处理"""
                for event in pygame.event.get():
                        if event.type == pygame.QUIT:
                                sys.exit()
                        elif event.type == pygame.MOUSEBUTTONDOWN:
                                a, b = pygame.mouse.get_pos()
                                x, y = self.get_mouse(a, b)
                                if x == 0 or not self.isOk([x, y]):
                                        pass
                                else:
                                        self.chess_color.append(self.setting.chess[self.stats.turn])
                                        self.chess.append([x, y])
                                        if isover(self.chess_position, [x // 44, y // 44]):
                                                print('结束')
                                                sys.exit()
                                        self.chess_position[x // 44][y // 44] = self.stats.turn

                                        if self.stats.turn == 1:
                                                self.stats.turn += 1
                                        else:
                                                self.stats.turn -= 1

        def isOk(self, nums):
                """检测当前位置是否可以下棋子"""
                if nums in self.chess:
                        return False
                return True

        def get_mouse(self, a, b):
                for i in range(27, 670, 44):
                        for j in range(27, 670, 44):
                                left = i - 11
                                right = i + 11
                                up = j - 11
                                down = j + 11
                                if a >= left and a <= right and b >= up and b <= down:
                                        return i, j

                return 0, 0




if __name__ == '__main__':
        game = my_chess()
        game.run_game()

        判断这步棋子下了之后是否出现了五子相连的情况,这破代码太长了,当然也可以使用一个列表存储偏移量一个,再使用for循环内嵌一个while循环来减少代码量(我就不再淦它了)

from game_stats import Stats

stats = Stats()


def isover(chess_position, nums):
        cur = stats.turn
        left, right = 0, 0
        x = nums[0]
        y = nums[1]

        # 检测行
        for i in range(x - 1, -1, -1):
                if chess_position[i][y] == cur:
                        left += 1
                else:
                        break
        for i in range(x + 1, 15, 1):
                if chess_position[i][y] == cur:
                        right += 1
                else:
                        break
        if left + right >= 4:
                return True

        # 检测列
        left, right = 0, 0
        for i in range(y - 1, -1, -1):
                if chess_position[x][i] == cur:
                        left += 1
                else:
                        break
        for i in range(y + 1, 15, 1):
                if chess_position[x][i] == cur:
                        right += 1
                else:
                        break
        if left + right >= 4:
                return True

        # 检测左对角线
        left, right = 0, 0
        i, j = x - 1, y - 1
        while i >= 0 and j >= 0:
                if chess_position[i][j] == cur:
                        left += 1
                        i -= 1
                        j -= 1
                else:
                        break
        i, j = x + 1, y + 1
        while i < 15 and j < 15:
                if chess_position[i][j] == cur:
                        right += 1
                        i += 1
                        j += 1
                else:
                        break
        if left + right >= 4:
                return True

        # 检测右对角线
        left, right = 0, 0
        i, j = x - 1, y + 1
        while i >= 0 and j < 15:
                if chess_position[i][j] == cur:
                        left += 1
                        i -= 1
                        j += 1
                else:
                        break
        i, j = x + 1, y - 1
        while i < 15 and j >= 0:
                if chess_position[i][j] == cur:
                        right += 1
                        i += 1
                        j -= 1
                else:
                        break
        if left + right >= 4:
                return True

        return False

猜你喜欢

转载自blog.csdn.net/qq_65120254/article/details/126440208