You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

181 lines
6.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import abc,pygame
import os
from abc import abstractmethod,ABC
from enum import Enum
from .ChessColor import ChessColor
#region 游戏资源
chess_img_path = "./Resource/img/Chess"
#dropPoint_img_path = "./Resource/img/Chess"
drop_point_img = "提示.png"
eatable_red_img = "可击杀_红色_底色.png"
eatable_black_img = "可击杀_黑色_底色.png"
selected_img = "selected.png"
#endregion
#region 常量
eatable_enlarge = 1.1
selected_enlarge = 1.5
#endregion
class DropPointKind(Enum):
TIP = 1
EATABLE_BLACK = 2
EATABLE_RED = 3
SELECTED = 4
class Chess(ABC,pygame.sprite.Sprite):
def __init__(self,color):
self.color:ChessColor = color
super().__init__()
self.rect:pygame.Rect = None
@abstractmethod
def init(self,dict_posi):
from Managed.Window import scale_chess_img
"""加载图片
Args:
dict_posi (tuple): 逻辑位置,用于定位屏幕位置
"""
self.image = pygame.image.load(self.chess_img_path)
self.image = scale_chess_img(self.image)
self.rect = self.image.get_rect()
self.x,self.y = dict_posi
#self.rect.center = Dict_to_Abs_posi(dict_posi) 游戏开始时会刷新屏幕Container会给所有棋子摆正
@abstractmethod
def onSelected(self,drop_point_list,chess_board,BLACK_checkmate,RED_checkmate,to_checkmate = False):
"""展示落点
Args:
drop_point_list (list:tuple): 具体棋子类传给父类的落点数组,由父类处理
chess_board (dict[(int,int),Chess]): Container传给具体棋子类的棋盘信息
BLACK_checkmate (Chess): Container传给父类的""信息
RED_checkmate (Chess): Container传给父类的""信息
to_checkmate (bool, optional): 是否要截获落点数组. Defaults to False.
"""
if to_checkmate:
return drop_point_list
#将帅不相见
drop_point_list = self.check_king_opposite(drop_point_list,chess_board,BLACK_checkmate,RED_checkmate)
self.drop_point_dict:dict[(int,int),pygame.sprite.Sprite] = {}
self.drop_sprite_group:pygame.sprite.Group = pygame.sprite.Group()
self.drop_sprite_group.add(DropPoint(DropPointKind.SELECTED,(self.x,self.y)))
for drop_point_posi in drop_point_list:
if chess_board.__contains__(drop_point_posi):#可吃子
chess_color = chess_board[drop_point_posi].color
if chess_color == ChessColor.BLACK:
drop_point_sprite = DropPoint(DropPointKind.EATABLE_RED,drop_point_posi)
else:
drop_point_sprite = DropPoint(DropPointKind.EATABLE_BLACK,drop_point_posi)
else:
drop_point_sprite = DropPoint(DropPointKind.TIP,drop_point_posi)#落子提示
self.drop_point_dict[drop_point_posi] = drop_point_sprite
self.drop_sprite_group.add(drop_point_sprite)
def check_king_opposite(self,drop_point_list,chess_board,BLACK_checkmate,RED_checkmate):
"""将帅不相见
"""
fileted_list = []
target_colum_empty = True
if (self is BLACK_checkmate) or (self is RED_checkmate):
if (abs(BLACK_checkmate.x - RED_checkmate.x)==1) or (BLACK_checkmate.x == RED_checkmate.x):
target = (BLACK_checkmate if (self is RED_checkmate) else RED_checkmate)
temp_x = target.x
for temp_y in range(BLACK_checkmate.y,RED_checkmate.y+1):
if chess_board.__contains__((temp_x,temp_y)) and (not(chess_board[(temp_x,temp_y)] is self)) and (not(chess_board[(temp_x,temp_y)] is target)):
if drop_point_list.__contains__((temp_x,temp_y)):
fileted_list.append((temp_x,temp_y))
else:
target_colum_empty = False
break
if target_colum_empty:
for drop_point in drop_point_list:
x,_ = drop_point
if x == target.x:
fileted_list.append(drop_point)
elif (self.x == BLACK_checkmate.x) and (BLACK_checkmate.x == RED_checkmate.x):
temp_x = BLACK_checkmate.x
for temp_y in range(BLACK_checkmate.y+1,RED_checkmate.y):
if chess_board.__contains__((temp_x,temp_y)):
if not (chess_board[(temp_x,temp_y)] is self):
target_colum_empty = False
break
if target_colum_empty:
for drop_point in drop_point_list:
x,_ = drop_point
if not x == self.x:
fileted_list.append(drop_point)
for drop_point in fileted_list:
if drop_point_list.__contains__(drop_point):
drop_point_list.remove(drop_point)
return drop_point_list
# def draw_drop_points(self,screen):
# self.drop_sprite_group.update()
# self.drop_sprite_group.draw(screen)
# def clear_drop_points(self,screen,board):
# self.drop_sprite_group.update()
# self.drop_sprite_group.clear(screen,board)
# self.drop_sprite_group.draw(screen)
def onDestroyed(self):
pass
def move(self,dict_posi):
from Managed.Window import Dict_to_Abs_posi
"""_summary_
Args:
vector ((x,y)): TargetPosition
Returns:
Boolean: Move successfully
"""
self.x,self.y = dict_posi
self.rect.center = Dict_to_Abs_posi(dict_posi)
class DropPoint(pygame.sprite.Sprite):
def __init__(self,kind:DropPointKind,dict_posi):
from Managed.Window import Dict_to_Abs_posi,scale_chess_img
super().__init__()
enlargeSize = 1
if kind == DropPointKind.TIP:
image = drop_point_img
elif kind == DropPointKind.EATABLE_BLACK:
image = eatable_black_img
enlargeSize = eatable_enlarge
elif kind == DropPointKind.EATABLE_RED:
image = eatable_red_img
enlargeSize = eatable_enlarge
else:
image = selected_img
enlargeSize = selected_enlarge
self.image = pygame.image.load(os.path.join(chess_img_path,image))
self.image = scale_chess_img(self.image,enlargeSize)
self.rect = self.image.get_rect()
abs_x,abs_y = Dict_to_Abs_posi(dict_posi)
self.rect.center = (abs_x,abs_y)