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()
python跳棋pygame V1
于 2024-06-05 11:13:02 首次发布