python跳棋pygame V1

import time

import pygame
import sys
import math

class CheckerPiece:
    def __init__(self, center, color):
        self.center = center  # 棋子的中心位置
        self.color=[color,(0, 0, 0)]# 棋子的颜色
        self.radius = 5      # 棋子的半径
        self.clicked = False  # 标记棋子是否被点击了
        self.index = 0

    def draw(self, screen):
        # 绘制棋子
        pygame.draw.circle(screen, (0, 0, 0), self.center, self.radius + 2)  # 绘制黑色的边框

        pygame.draw.circle(screen, self.color[self.index], self.center, self.radius)  # 绘制棋子


    def is_clicked(self, pos):
        # 判断点击位置是否在棋子范围内
        distance = math.sqrt((pos[0] - self.center[0])**2 + (pos[1] - self.center[1])**2)
        # print(self.center)
        return distance < self.radius

    def handle_click(self):
        # 处理点击事件
        self.clicked = True
        # print(self.center)
class CheckersBoard:
    def __init__(self):
        pygame.init()
        self.is_clicked = -1
        self.BOARDSIZE = 600
        self.CEN = self.BOARDSIZE / 2
        self.EDGE = 30
        self.RADIUS = self.CEN - self.EDGE
        self.RATIO = 0.87
        self.HEIGHT = self.RADIUS / 2
        self.SIDE = self.HEIGHT / self.RATIO
        self.EACHHEIGHT = self.RADIUS / 8
        self.EACHWIDTH = self.SIDE / 8
        self.RA = 5

        self.WHITE = (255, 255, 255)
        self.BLACK = (0, 0, 0)
        self.YELLOW = (255, 255, 0)
        self.GREEN = (0, 255, 0)
        self.BLUE = (0, 0, 255)
        self.RED = (255, 0, 0)

        self.POS1 = [
            (12, 0), (11, 1), (13, 1), (10, 2), (12, 2), (14, 2), (9, 3), (11, 3),
            (13, 3), (15, 3)
        ]
        self.POS2 = [
            (3, 7), (2, 6), (4, 6), (1, 5), (3, 5), (5, 5), (0, 4), (2, 4),
            (4, 4), (6, 4)
        ]
        self.POS3 = [
            (21, 7), (20, 6), (22, 6), (19, 5), (21, 5), (23, 5), (18, 4), (20, 4),
            (22, 4), (24, 4)
        ]
        self.POS4 = self.POS1 + self.POS2 + self.POS3 + [(x, y) for y in range(4, 13) for x in range(8-y+4, 16+y-4+2, 2)] + [(x, y) for y in range(13, 18) for x in range(8+y-12, 16-y+13, 2)]
        # print(self.POS4)
        self.screen = pygame.display.set_mode((self.BOARDSIZE, self.BOARDSIZE))
        pygame.display.set_caption('Checkers Board')
        self.pieces = []
        for row, col in self.POS1:
            center_xy = self.rcToXy((row, col))
            self.pieces.append(CheckerPiece(center_xy, self.GREEN))
        for row, col in self.POS2:
            center_xy = self.rcToXy((row, col))
            self.pieces.append(CheckerPiece(center_xy, self.RED))
        for row, col in self.POS3:
            center_xy = self.rcToXy((row, col))
            self.pieces.append(CheckerPiece(center_xy, self.BLUE))

    def is_clicked_empty(self, pos, center):
        # 判断点击位置是否在棋子范围内
        center = self.rcToXy((center[0], center[1]))
        for i in self.pieces:
            if center == i.center:
                return False
        distance = math.sqrt((pos[0] - center[0])**2 + (pos[1] - center[1])**2)
        # print(pos, center)
        return distance < 5
    def rcToXy(self, rc):
        xy = [0, 0]
        xy[0] = (rc[0] - 12) * self.EACHWIDTH + self.CEN
        xy[1] = rc[1] * self.EACHHEIGHT + self.EDGE
        return xy

    def drawLine(self, start_rc, end_rc):
        start_xy = self.rcToXy(start_rc)
        end_xy = self.rcToXy(end_rc)
        pygame.draw.aaline(self.screen, self.BLACK, start_xy, end_xy, 1)

    # def drawPiece(self, center, color):
    #     # 在给定的中心点位置绘制一个带边框的棋子,颜色由color参数指定
    #     pygame.draw.circle(self.screen, (0, 0, 0), center, self.RA + 2)  # 绘制黑色的边框
    #     pygame.draw.circle(self.screen, color, center, self.RA)  # 绘制棋子
    #     self.is_clicked = False  # 添加一个属性来标记棋子是否被点击了

    def drawBoard(self):
        self.screen.fill(self.WHITE)

        tan = [
            [(self.CEN - self.SIDE / 2, self.EDGE + self.HEIGHT), (self.CEN + self.SIDE / 2, self.EDGE + self.HEIGHT),
             (self.CEN + self.SIDE, self.CEN),
             (self.CEN + self.SIDE / 2, self.BOARDSIZE - self.EDGE - self.HEIGHT),
             (self.CEN - self.SIDE / 2, self.BOARDSIZE - self.EDGE - self.HEIGHT), (self.CEN - self.SIDE, self.CEN)],
            [(self.CEN, self.EDGE), (self.CEN - self.SIDE / 2, self.EDGE + self.HEIGHT),
             (self.CEN + self.SIDE / 2, self.EDGE + self.HEIGHT)],
            [(self.CEN + self.SIDE * 3 / 2, self.EDGE + self.HEIGHT),
             (self.CEN + self.SIDE / 2, self.EDGE + self.HEIGHT), (self.CEN + self.SIDE, self.CEN)],
            [(self.CEN + self.SIDE * 3 / 2, self.BOARDSIZE - self.EDGE - self.HEIGHT), (self.CEN + self.SIDE, self.CEN),
             (self.CEN + self.SIDE / 2, self.BOARDSIZE - self.EDGE - self.HEIGHT)],
            [(self.CEN, self.BOARDSIZE - self.EDGE), (self.CEN + self.SIDE / 2, self.BOARDSIZE - self.EDGE - self.HEIGHT),
             (self.CEN - self.SIDE / 2, self.BOARDSIZE - self.EDGE - self.HEIGHT)],
            [(self.CEN - self.SIDE * 3 / 2, self.BOARDSIZE - self.EDGE - self.HEIGHT),
             (self.CEN - self.SIDE / 2, self.BOARDSIZE - self.EDGE - self.HEIGHT), (self.CEN - self.SIDE, self.CEN)],
            [(self.CEN - self.SIDE * 3 / 2, self.EDGE + self.HEIGHT), (self.CEN - self.SIDE, self.CEN),
             (self.CEN - self.SIDE / 2, self.EDGE + self.HEIGHT)]
        ]

        for i in range(0, 4):
            if i == 0:
                COLOR = self.YELLOW
                pygame.draw.polygon(self.screen, COLOR, tan[i], 0)
            else:
                if i == 1:
                    COLOR = self.GREEN
                elif i == 2:
                    COLOR = self.BLUE
                elif i == 3:
                    COLOR = self.RED
                pygame.draw.polygon(self.screen, COLOR, tan[i], 0)
                pygame.draw.polygon(self.screen, COLOR, tan[i + 3], 0)

        start_rc = [12, 0]
        end_rc = [12, 0]
        for each in range(0, 4):
            self.drawLine(start_rc, end_rc)
            start_rc[0] -= 1
            start_rc[1] += 1
            end_rc[0] += 1
            end_rc[1] += 1

        start_rc = [0, 4]
        end_rc = [24, 4]
        for each in range(0, 5):
            self.drawLine(start_rc, end_rc)
            start_rc[0] += 1
            start_rc[1] += 1
            end_rc[0] -= 1
            end_rc[1] += 1

        start_rc = [4, 8]
        end_rc = [20, 8]
        for each in range(0, 5):
            self.drawLine(start_rc, end_rc)
            start_rc[0] -= 1
            start_rc[1] += 1
            end_rc[0] += 1
            end_rc[1] += 1

        start_rc = [9, 13]
        end_rc = [15, 13]
        for each in range(0, 4):
            self.drawLine(start_rc, end_rc)
            start_rc[0] += 1
            start_rc[1] += 1
            end_rc[0] -= 1
            end_rc[1] += 1

        start_rc = [24, 4]
        end_rc = [24, 4]
        for each in range(0, 5):
            self.drawLine(start_rc, end_rc)        # 行列变换
        start_rc[0] -= 2
        end_rc[0] -= 1
        end_rc[1] += 1

        start_rc = [12, 0]
        end_rc = [24, 12]
        for each in range(0, 5):
            self.drawLine(start_rc, end_rc)
            start_rc[0] -= 1
            start_rc[1] += 1
            end_rc[0] -= 2

        start_rc = [6, 4]
        end_rc = [15, 13]
        for each in range(0, 4):
            self.drawLine(start_rc, end_rc)
            start_rc[0] -= 2
            end_rc[0] -= 1
            end_rc[1] += 1

        start_rc = [3, 9]
        end_rc = [6, 12]
        for each in range(0, 4):
            self.drawLine(start_rc, end_rc)
            start_rc[0] -= 1
            start_rc[1] += 1
            end_rc[0] -= 2

        start_rc = [0, 4]
        end_rc = [0, 4]
        for each in range(0, 4):
            self.drawLine(start_rc, end_rc)
            start_rc[0] += 2
            end_rc[0] += 1
            end_rc[1] += 1

        start_rc = [0, 12]
        end_rc = [12, 0]
        for each in range(0, 4):
            self.drawLine(start_rc, end_rc)
            start_rc[0] += 2
            end_rc[0] += 1
            end_rc[1] += 1

        start_rc = [21, 7]
        end_rc = [18, 4]
        for each in range(0, 4):
            self.drawLine(start_rc, end_rc)
            start_rc[0] += 1
            start_rc[1] -= 1
            end_rc[0] += 2

        start_rc = [8, 12]
        end_rc = [16, 4]
        for each in range(0, 5):
            self.drawLine(start_rc, end_rc)
            start_rc[0] += 1
            start_rc[1] += 1
            end_rc[0] += 2

        start_rc = [21, 9]
        end_rc = [18, 12]
        for each in range(0, 4):
            self.drawLine(start_rc, end_rc)
            start_rc[0] += 1
            start_rc[1] += 1
            end_rc[0] += 2


        # 画棋子

        for piece in self.pieces:
            piece.draw(self.screen)
        pygame.display.flip()

    def main(self):
        while True:
            self.screen.fill((255, 255, 255))  # 清屏
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                # 在事件处理函数中处理点击事件
                if event.type == pygame.MOUSEBUTTONDOWN:
                    if event.button == 1:  # 左键点击

                        if self.is_clicked != -1 :
                            for center in self.POS4:
                                # print(center)
                                if self.is_clicked_empty(event.pos, center):
                                    # print("move")
                                    self.pieces[self.is_clicked].center = self.rcToXy((center[0], center[1]))
                                    self.pieces[self.is_clicked].index = 0
                                    self.is_clicked = -1

                                    break
                        else:
                            i = 0
                            for piece in self.pieces:
                                if piece.is_clicked(event.pos):
                                    piece.handle_click()
                                    if self.is_clicked != -1:
                                        self.pieces[self.is_clicked].index = 0
                                    self.is_clicked = i
                                    self.pieces[self.is_clicked].index = 1
                                i += 1



                # 在主循环中绘制棋子
            # for piece in self.pieces:
            #     piece.draw(self.screen)
            self.drawBoard()
            pygame.display.flip()


if __name__ == "__main__":
    checker_board = CheckersBoard()
    checker_board.main()


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值