|
|
import pygame
|
|
|
from copy import copy
|
|
|
from os import _exit # 退出
|
|
|
from collections import Counter as aniSet # 490行
|
|
|
import win32api # 鼠标类操作、屏幕
|
|
|
import win32con # 鼠标类操作、屏幕
|
|
|
|
|
|
pygame.init()
|
|
|
# 主界面
|
|
|
pygame.display.set_mode((1200, 600))
|
|
|
menu_image = pygame.image.load("./mainGround.png")
|
|
|
menu_image = pygame.transform.scale(menu_image, (1200, 600))
|
|
|
flag = True
|
|
|
while flag:
|
|
|
for event in pygame.event.get():
|
|
|
x, y = pygame.mouse.get_pos()
|
|
|
if pygame.mouse.get_pressed()[0] and 500 <= x <= 900 and 300 <= y <= 500:
|
|
|
flag = False
|
|
|
menu = pygame.display.get_surface()
|
|
|
menu.blit(menu_image, (0, 0))
|
|
|
pygame.display.update()
|
|
|
# 获取屏幕大小
|
|
|
sizel = 0.8
|
|
|
size = width, height = win32api.GetSystemMetrics(win32con.SM_CXSCREEN) * sizel, win32api.GetSystemMetrics(
|
|
|
win32con.SM_CYSCREEN) * sizel
|
|
|
# 满屏推算棋格大小
|
|
|
ul = 135 * height // 1080
|
|
|
# 特殊区域
|
|
|
river = [(3, 1), (3, 2), (3, 4), (3, 5),
|
|
|
(4, 1), (4, 2), (4, 4), (4, 5),
|
|
|
(5, 1), (5, 2), (5, 4), (5, 5)]
|
|
|
# 陷阱
|
|
|
Blue_trap = [(0, 2), (0, 4), (1, 3)]
|
|
|
Red_trap = [(8, 2), (8, 4), (7, 3)]
|
|
|
rd = 0
|
|
|
# 穴
|
|
|
Blue_home = [(0, 3)]
|
|
|
Red_home = [(8, 3)]
|
|
|
# 是否可走
|
|
|
Blue_way = 0
|
|
|
Red_way = 0
|
|
|
|
|
|
|
|
|
def get_rect(i, pos): # 定位
|
|
|
j = i.get_rect()
|
|
|
j.left, j.top = pos
|
|
|
return j
|
|
|
|
|
|
|
|
|
def is_chess_in_board(x, y): # 在棋盘里
|
|
|
return 0 <= x < 9 and 0 <= y < 7
|
|
|
|
|
|
|
|
|
def tryout():
|
|
|
global movable, win, rd, Blue_way, Red_way
|
|
|
movable = True # 判断移动变量
|
|
|
win = 0 # 胜负判断变量:初始为0,为1时红方胜,为2时蓝方胜
|
|
|
rd = 0 # 回合计数变量
|
|
|
Blue_way = 0 # 蓝方总可走位置数目
|
|
|
Red_way = 0 # 红方总可走位置数目
|
|
|
# 对方进入洞穴判胜负
|
|
|
if grid[0][3]:
|
|
|
if grid[0][3].camp == 1:
|
|
|
movable = False
|
|
|
win = 1
|
|
|
if grid[8][3]:
|
|
|
if grid[8][3].camp == 0:
|
|
|
movable = False
|
|
|
win = 2
|
|
|
|
|
|
if rd == 100: # 回合数为100时不能继续移动
|
|
|
movable = False
|
|
|
# 遍历双方可走位置总数
|
|
|
for i in range(7):
|
|
|
for j in range(9):
|
|
|
if grid[i][j]:
|
|
|
if grid[i][j].camp == 0:
|
|
|
Blue_way += len(grid[i][j].next)
|
|
|
else:
|
|
|
Red_way += len(grid[i][j].next)
|
|
|
|
|
|
if Blue_way == 0:
|
|
|
win = 1
|
|
|
movable = False
|
|
|
if Red_way == 0:
|
|
|
win = 2
|
|
|
movable = False
|
|
|
|
|
|
|
|
|
def refresh(): # 继续
|
|
|
for i in grid:
|
|
|
for j in i:
|
|
|
if j:
|
|
|
j.next_step(grid)
|
|
|
|
|
|
|
|
|
class Base: # 定义棋子的类
|
|
|
def __init__(self, camp, b, r, Rank): # 初始化:camp为阵营,camp=1红方,camp=0蓝方
|
|
|
self.camp = camp # Rank为吃子顺序,从0到6依次为鼠、鹰、狐、狼、豹、狮、象
|
|
|
if self.camp: # camp=1,红方
|
|
|
self.img = r
|
|
|
else:
|
|
|
self.img = b
|
|
|
self.rank = Rank
|
|
|
self.x = self.y = 0
|
|
|
self.next = [] # 可走位置的集合
|
|
|
self.eat = [] # 可吃位置的集合
|
|
|
self.pro = [] # 不可走位置的集合
|
|
|
|
|
|
def hint(self): # 显示可走路径
|
|
|
for i, j in self.next:
|
|
|
htrect.center = pos[i][j].center
|
|
|
screen.blit(ht, htrect)
|
|
|
for i, j in self.eat:
|
|
|
screen.blit(cpht, pos[i][j])
|
|
|
|
|
|
def next_step(self, grid): # 步法
|
|
|
pass
|
|
|
|
|
|
def eagle_next(self, grid): # 老鹰走法
|
|
|
for i in range(self.x + 1, 9): # 向右飞
|
|
|
if grid[i][self.y]:
|
|
|
if grid[i][self.y].camp != self.camp and (grid[i][self.y].rank <= self.rank or
|
|
|
(((i, self.y) in Blue_trap or (i, self.y) in Red_trap) and grid[i][
|
|
|
self.y].camp == 1) or
|
|
|
(((i, self.y) in Blue_trap or (i, self.y) in Red_trap) and grid[i][
|
|
|
self.y].camp == 0)) and (i, self.y) not in river:
|
|
|
self.eat.append([i, self.y])
|
|
|
else:
|
|
|
self.pro.append([i, self.y])
|
|
|
break
|
|
|
if (i, self.y) in Blue_trap or (i, self.y) in Red_trap:
|
|
|
self.next.append([i, self.y])
|
|
|
break
|
|
|
# 判断老鹰不能进河不能进入本方兽穴
|
|
|
if (i, self.y) not in river and (
|
|
|
((i, self.y) not in Blue_home and self.camp == 0) or ((i, self.y) not in Red_home and self.camp == 1)):
|
|
|
self.next.append([i, self.y])
|
|
|
|
|
|
for i in range(self.x - 1, -1, -1): # 向左飞
|
|
|
if grid[i][self.y]:
|
|
|
if grid[i][self.y].camp != self.camp and (grid[i][self.y].rank <= self.rank or
|
|
|
(((i, self.y) in Blue_trap or (i, self.y) in Red_trap) and grid[i][
|
|
|
self.y].camp == 1) or
|
|
|
(((i, self.y) in Blue_trap or (i, self.y) in Red_trap) and grid[i][
|
|
|
self.y].camp == 0)) and (i, self.y) not in river:
|
|
|
self.eat.append([i, self.y])
|
|
|
else:
|
|
|
self.pro.append([i, self.y])
|
|
|
break
|
|
|
if (i, self.y) in Blue_trap or (i, self.y) in Red_trap:
|
|
|
self.next.append([i, self.y])
|
|
|
break
|
|
|
if (i, self.y) not in river and (
|
|
|
((i, self.y) not in Blue_home and self.camp == 0) or ((i, self.y) not in Red_home and self.camp == 1)):
|
|
|
self.next.append([i, self.y])
|
|
|
|
|
|
for i in range(self.y + 1, 7): # 向上飞
|
|
|
if grid[self.x][i]:
|
|
|
if grid[self.x][i].camp != self.camp and (grid[self.x][i].rank <= self.rank or
|
|
|
(((self.x, i) in Blue_trap or (self.x, i) in Red_trap) and
|
|
|
grid[self.x][i].camp == 1) or
|
|
|
(((self.x, i) in Blue_trap or (self.x, i) in Red_trap) and
|
|
|
grid[self.x][i].camp == 0)) and (self.x, i) not in river:
|
|
|
self.eat.append([self.x, i])
|
|
|
else:
|
|
|
self.pro.append([self.x, i])
|
|
|
break
|
|
|
if (self.x, i) in Blue_trap or (self.x, i) in Red_trap:
|
|
|
self.next.append([self.x, i])
|
|
|
break
|
|
|
if (self.x, i) not in river and (
|
|
|
((self.x, i) not in Blue_home and self.camp == 0) or ((self.x, i) not in Red_home and self.camp == 1)):
|
|
|
self.next.append([self.x, i])
|
|
|
|
|
|
for i in range(self.y - 1, -1, -1): # 向下飞
|
|
|
if grid[self.x][i]:
|
|
|
if grid[self.x][i].camp != self.camp and (grid[self.x][i].rank <= self.rank or
|
|
|
(((self.x, i) in Blue_trap or (self.x, i) in Red_trap) and
|
|
|
grid[self.x][i].camp == 1) or
|
|
|
(((self.x, i) in Blue_trap or (self.x, i) in Red_trap) and
|
|
|
grid[self.x][i].camp == 0)) and (self.x, i) not in river:
|
|
|
self.eat.append([self.x, i])
|
|
|
else:
|
|
|
self.pro.append([self.x, i])
|
|
|
break
|
|
|
if (self.x, i) in Blue_trap or (self.x, i) in Red_trap:
|
|
|
self.next.append([self.x, i])
|
|
|
break
|
|
|
if (self.x, i) not in river and (
|
|
|
((self.x, i) not in Blue_home and self.camp == 0) or ((self.x, i) not in Red_home and self.camp == 1)):
|
|
|
self.next.append([self.x, i])
|
|
|
|
|
|
def lion_next(self, grid): # 狮子跳河
|
|
|
tx, ty = self.x, self.y
|
|
|
i = 1 # 向右走
|
|
|
if is_chess_in_board(tx + i, ty):
|
|
|
while (tx + i, ty) in river:
|
|
|
if grid[tx + i][ty]:
|
|
|
break
|
|
|
i += 1
|
|
|
|
|
|
if grid[tx + i][ty]:
|
|
|
if grid[tx + i][ty].camp != self.camp and (grid[tx + i][ty].rank <= self.rank or
|
|
|
(((tx + i, ty) in Blue_trap or (tx + i, ty) in Red_trap) and
|
|
|
grid[tx + i][ty].camp == 1) or
|
|
|
(((tx + i, ty) in Blue_trap or (tx + i, ty) in Red_trap) and
|
|
|
grid[tx + i][ty].camp == 0)) and (tx + i, ty) not in river:
|
|
|
self.eat.append([tx + i, ty])
|
|
|
else:
|
|
|
self.pro.append([tx + i, ty])
|
|
|
# 判断狮子不能进入己方洞穴
|
|
|
elif ((tx + i, ty) not in Blue_home and self.camp == 0) or ((tx + i, ty) not in Red_home and self.camp == 1):
|
|
|
self.next.append([tx + i, ty])
|
|
|
|
|
|
i = -1 # 向左走
|
|
|
if is_chess_in_board(tx + i, ty):
|
|
|
while (tx + i, ty) in river:
|
|
|
|
|
|
if grid[tx + i][ty]:
|
|
|
break
|
|
|
i -= 1
|
|
|
if grid[tx + i][ty]:
|
|
|
if grid[tx + i][ty].camp != self.camp and (grid[tx + i][ty].rank <= self.rank or
|
|
|
(((tx + i, ty) in Blue_trap or (tx + i, ty) in Red_trap) and
|
|
|
grid[tx + i][ty].camp == 1) or
|
|
|
(((tx + i, ty) in Blue_trap or (tx + i, ty) in Red_trap) and
|
|
|
grid[tx + i][ty].camp == 0)) and (tx + i, ty) not in river:
|
|
|
self.eat.append([tx + i, ty])
|
|
|
else:
|
|
|
self.pro.append([tx + i, ty])
|
|
|
elif ((tx + i, ty) not in Blue_home and self.camp == 0) or ((tx + i, ty) not in Red_home and self.camp == 1):
|
|
|
self.next.append([tx + i, ty])
|
|
|
|
|
|
i = 1 # 向上走
|
|
|
if is_chess_in_board(tx, ty + i):
|
|
|
while (tx, ty + i) in river:
|
|
|
|
|
|
if grid[tx][ty + i]:
|
|
|
break
|
|
|
i += 1
|
|
|
if grid[tx][ty + i]:
|
|
|
if grid[tx][ty + i].camp != self.camp and (grid[tx][ty + i].rank <= self.rank or
|
|
|
(((tx, ty + i) in Blue_trap or (tx, ty + i) in Red_trap) and
|
|
|
grid[tx][ty + i].camp == 1) or
|
|
|
(((tx, ty + i) in Blue_trap or (tx, ty + i) in Red_trap) and
|
|
|
grid[tx][ty + i].camp == 0)) and (tx, ty + i) not in river:
|
|
|
self.eat.append([tx, ty + i])
|
|
|
else:
|
|
|
self.pro.append([tx, ty + i])
|
|
|
elif (((tx, ty + i) not in Blue_home and self.camp == 0) or ((tx, ty + i) not in Red_home and self.camp == 1)):
|
|
|
self.next.append([tx, ty + i])
|
|
|
|
|
|
i = -1 # 向下走
|
|
|
if is_chess_in_board(tx, ty + i):
|
|
|
while (tx, ty + i) in river:
|
|
|
|
|
|
if grid[tx][ty + i]:
|
|
|
break
|
|
|
i -= 1
|
|
|
if grid[tx][ty + i]:
|
|
|
if grid[tx][ty + i].camp != self.camp and (grid[tx][ty + i].rank <= self.rank or
|
|
|
(((tx, ty + i) in Blue_trap or (tx, ty + i) in Red_trap) and
|
|
|
grid[tx][ty + i].camp == 1) or
|
|
|
(((tx, ty + i) in Blue_trap or (tx, ty + i) in Red_trap) and
|
|
|
grid[tx][ty + i].camp == 0)) and (tx, ty + i) not in river:
|
|
|
self.eat.append([tx, ty + i])
|
|
|
else:
|
|
|
self.pro.append([tx, ty + i])
|
|
|
elif (((tx, ty + i) not in Blue_home and self.camp == 0) or ((tx, ty + i) not in Red_home and self.camp == 1)):
|
|
|
self.next.append([tx, ty + i])
|
|
|
|
|
|
|
|
|
# 非特殊棋子
|
|
|
class Elephant(Base): # 大象
|
|
|
def __init__(self, camp):
|
|
|
Base.__init__(self, camp, Bel, Rel, 6)
|
|
|
|
|
|
def next_step(self, grid):
|
|
|
self.next = []
|
|
|
self.eat = []
|
|
|
self.pro = []
|
|
|
dir = [[-1, 0], [1, 0], [0, -1], [0, 1]]
|
|
|
for i, j in dir:
|
|
|
tx, ty = self.x + i, self.y + j
|
|
|
if is_chess_in_board(tx, ty):
|
|
|
if (tx, ty) not in river:
|
|
|
if grid[tx][ty]:
|
|
|
# 判断可吃,但对方不能为老鼠
|
|
|
if grid[tx][ty].camp != self.camp and (grid[tx][ty].rank <= self.rank or
|
|
|
(((tx, ty) in Blue_trap or (tx, ty) in Red_trap) and grid[tx][
|
|
|
ty].camp == 1) or
|
|
|
(((tx, ty) in Blue_trap or (tx, ty) in Red_trap) and grid[tx][
|
|
|
ty].camp == 0)) and (tx, ty) not in river and \
|
|
|
grid[tx][ty].rank != 0:
|
|
|
self.eat.append([tx, ty])
|
|
|
else:
|
|
|
self.pro.append([tx, ty])
|
|
|
# 不能进入本方兽穴
|
|
|
elif ((tx, ty) not in Blue_home and self.camp == 0) or ((tx, ty) not in Red_home and self.camp == 1):
|
|
|
self.next.append([tx, ty])
|
|
|
|
|
|
|
|
|
class Lion(Base): # 狮子基本走法
|
|
|
def __init__(self, camp):
|
|
|
Base.__init__(self, camp, Bl, Rl, 5)
|
|
|
|
|
|
def next_step(self, grid):
|
|
|
self.next = []
|
|
|
self.eat = []
|
|
|
self.pro = []
|
|
|
self.lion_next(grid)
|
|
|
|
|
|
|
|
|
class Leopard(Base): # 豹子
|
|
|
def __init__(self, camp):
|
|
|
Base.__init__(self, camp, Ble, Rle, 4)
|
|
|
|
|
|
def next_step(self, grid):
|
|
|
self.next = []
|
|
|
self.eat = []
|
|
|
self.pro = []
|
|
|
dir = [[-1, 0], [1, 0], [0, -1], [0, 1]]
|
|
|
for i, j in dir:
|
|
|
tx, ty = self.x + i, self.y + j
|
|
|
if is_chess_in_board(tx, ty):
|
|
|
if (tx, ty) not in river:
|
|
|
if grid[tx][ty]:
|
|
|
if grid[tx][ty].camp != self.camp and (grid[tx][ty].rank <= self.rank or
|
|
|
(((tx, ty) in Blue_trap or (tx, ty) in Red_trap) and grid[tx][
|
|
|
ty].camp == 1) or
|
|
|
(((tx, ty) in Blue_trap or (tx, ty) in Red_trap) and grid[tx][
|
|
|
ty].camp == 0)) and (tx, ty) not in river:
|
|
|
self.eat.append([tx, ty])
|
|
|
else:
|
|
|
self.pro.append([tx, ty])
|
|
|
elif (((tx, ty) not in Blue_home and self.camp == 0) or ((tx, ty) not in Red_home and self.camp == 1)):
|
|
|
self.next.append([tx, ty])
|
|
|
|
|
|
|
|
|
class Wolf(Base): # 狼
|
|
|
def __init__(self, camp):
|
|
|
Base.__init__(self, camp, Bw, Rw, 3)
|
|
|
|
|
|
def next_step(self, grid):
|
|
|
self.next = []
|
|
|
self.eat = []
|
|
|
self.pro = []
|
|
|
dir = [[-1, 0], [1, 0], [0, -1], [0, 1]]
|
|
|
for i, j in dir:
|
|
|
tx, ty = self.x + i, self.y + j
|
|
|
if is_chess_in_board(tx, ty):
|
|
|
if (tx, ty) not in river:
|
|
|
if grid[tx][ty]:
|
|
|
if grid[tx][ty].camp != self.camp and (grid[tx][ty].rank <= self.rank or
|
|
|
(((tx, ty) in Blue_trap or (tx, ty) in Red_trap) and grid[tx][
|
|
|
ty].camp == 1) or
|
|
|
(((tx, ty) in Blue_trap or (tx, ty) in Red_trap) and grid[tx][
|
|
|
ty].camp == 0)) and (tx, ty) not in river:
|
|
|
self.eat.append([tx, ty])
|
|
|
else:
|
|
|
self.pro.append([tx, ty])
|
|
|
elif ((tx, ty) not in Blue_home and self.camp == 0) or ((tx, ty) not in Red_home and self.camp == 1):
|
|
|
self.next.append([tx, ty])
|
|
|
|
|
|
|
|
|
class Fox(Base): # 狐狸
|
|
|
def __init__(self, camp):
|
|
|
Base.__init__(self, camp, Bf, Rf, 2)
|
|
|
|
|
|
def next_step(self, grid):
|
|
|
self.next = []
|
|
|
self.eat = []
|
|
|
self.pro = []
|
|
|
dir = [[-1, 0], [1, 0], [0, -1], [0, 1],
|
|
|
[-1, -1], [-1, 1], [1, -1], [1, 1]]
|
|
|
for i, j in dir:
|
|
|
tx, ty = self.x + i, self.y + j
|
|
|
if is_chess_in_board(tx, ty):
|
|
|
if (tx, ty) not in river:
|
|
|
if grid[tx][ty]:
|
|
|
if grid[tx][ty].camp != self.camp and (grid[tx][ty].rank <= self.rank or
|
|
|
(((tx, ty) in Blue_trap or (tx, ty) in Red_trap) and grid[tx][
|
|
|
ty].camp == 1) or
|
|
|
(((tx, ty) in Blue_trap or (tx, ty) in Red_trap) and grid[tx][
|
|
|
ty].camp == 0)) and (tx, ty) not in river:
|
|
|
self.eat.append([tx, ty])
|
|
|
else:
|
|
|
self.pro.append([tx, ty])
|
|
|
elif ((tx, ty) not in Blue_home and self.camp == 0) or ((tx, ty) not in Red_home and self.camp == 1):
|
|
|
self.next.append([tx, ty])
|
|
|
|
|
|
|
|
|
class Eagle(Base): # 老鹰
|
|
|
def __init__(self, camp):
|
|
|
Base.__init__(self, camp, Bea, Rea, 1)
|
|
|
|
|
|
def next_step(self, grid):
|
|
|
self.next = []
|
|
|
self.eat = []
|
|
|
self.pro = []
|
|
|
self.eagle_next(grid)
|
|
|
|
|
|
|
|
|
class Mouse(Base): # 老鼠
|
|
|
def __init__(self, camp):
|
|
|
Base.__init__(self, camp, Bm, Rm, 0)
|
|
|
|
|
|
def next_step(self, grid):
|
|
|
self.next = []
|
|
|
self.eat = []
|
|
|
self.pro = []
|
|
|
dir = [[-1, 0], [1, 0], [0, -1], [0, 1]]
|
|
|
for i, j in dir:
|
|
|
tx, ty = self.x + i, self.y + j
|
|
|
if is_chess_in_board(tx, ty):
|
|
|
if grid[tx][ty]:
|
|
|
if grid[tx][ty].camp != self.camp and (self.x, self.y) not in river and (
|
|
|
(grid[tx][ty].rank == 6 or grid[tx][ty].rank == 0)
|
|
|
or (((tx, ty) in Red_trap or (tx, ty) in Blue_trap) and grid[tx][ty].camp == 1)
|
|
|
or (((tx, ty) in Red_trap or (tx, ty) in Blue_trap) and grid[tx][ty].camp == 0)):
|
|
|
self.eat.append([tx, ty])
|
|
|
else:
|
|
|
self.pro.append([tx, ty])
|
|
|
elif ((tx, ty) not in Blue_home and self.camp == 0) or ((tx, ty) not in Red_home and self.camp == 1):
|
|
|
self.next.append([tx, ty])
|
|
|
|
|
|
|
|
|
# 导入背景音乐
|
|
|
file = r'.\Space - Just Blue.mp3'
|
|
|
pygame.mixer.init()
|
|
|
# 加载音乐文件
|
|
|
pygame.mixer.music.load(file)
|
|
|
# 开始播放音乐流
|
|
|
pygame.mixer.music.play()
|
|
|
# def game_start():
|
|
|
# 导入图片
|
|
|
size1 = 0.91
|
|
|
chessboard = pygame.transform.scale(pygame.image.load("backGround.png"), (1080 * size1 * sizel, 827 * size1 * sizel))
|
|
|
Bel = pygame.transform.scale(pygame.image.load("BElephant.jpg"), (ul, ul))
|
|
|
Rel = pygame.transform.scale(pygame.image.load("RElephant.jpg"), (ul, ul))
|
|
|
Bea = pygame.transform.scale(pygame.image.load("BEagle.jpg"), (ul, ul))
|
|
|
Rea = pygame.transform.scale(pygame.image.load("REagle.jpg"), (ul, ul))
|
|
|
Bf = pygame.transform.scale(pygame.image.load("BFox.jpg"), (ul, ul))
|
|
|
Rf = pygame.transform.scale(pygame.image.load("RFox.jpg"), (ul, ul))
|
|
|
Ble = pygame.transform.scale(pygame.image.load("BLeopard.jpg"), (ul, ul))
|
|
|
Rle = pygame.transform.scale(pygame.image.load("RLeopard.jpg"), (ul, ul))
|
|
|
Bl = pygame.transform.scale(pygame.image.load("BLion.jpg"), (ul, ul))
|
|
|
Rl = pygame.transform.scale(pygame.image.load("RLion.jpg"), (ul, ul))
|
|
|
Bw = pygame.transform.scale(pygame.image.load("BWolf.jpg"), (ul, ul))
|
|
|
Rw = pygame.transform.scale(pygame.image.load("RWolf.jpg"), (ul, ul))
|
|
|
Bm = pygame.transform.scale(pygame.image.load("BMouse.jpg"), (ul, ul))
|
|
|
Rm = pygame.transform.scale(pygame.image.load("RMouse.jpg"), (ul, ul))
|
|
|
ht = pygame.transform.scale(pygame.image.load("AimAt.png"), (44 * sizel, 44 * sizel))
|
|
|
htrect = ht.get_rect()
|
|
|
cpht = pygame.transform.scale(pygame.image.load("prey.png"), (108 * sizel, 108 * sizel))
|
|
|
grid = [] # 位置上有没有棋子
|
|
|
pos = []
|
|
|
occ = []
|
|
|
movable = False
|
|
|
for i in range(9):
|
|
|
grid.append([])
|
|
|
pos.append([])
|
|
|
occ.append([])
|
|
|
for j in range(9):
|
|
|
occ[i].append([])
|
|
|
grid[i].append(None)
|
|
|
recthere = Bl.get_rect()
|
|
|
recthere.left, recthere.top = (width - height) / 2 + ul * i, ul * j # 中心点计算位置
|
|
|
pos[i].append(recthere)
|
|
|
|
|
|
dir = (1, 0), (-1, 0), (0, 1), (0, -1) # 坐标存储
|
|
|
|
|
|
times = 1
|
|
|
lastmove = []
|
|
|
selected = False
|
|
|
chesslst = []
|
|
|
|
|
|
|
|
|
def scan():
|
|
|
tmp2 = []
|
|
|
for i in grid:
|
|
|
tmp = []
|
|
|
for j in i:
|
|
|
if j:
|
|
|
tmp.append(type(j))
|
|
|
yield type(j)
|
|
|
else:
|
|
|
tmp.append(j)
|
|
|
tmp2.append(tmp)
|
|
|
chesslst.append(tmp2)
|
|
|
|
|
|
|
|
|
def add(i, x, y):
|
|
|
i.x, i.y = x - 1, y - 1
|
|
|
grid[x - 1][y - 1] = i
|
|
|
|
|
|
|
|
|
# 左边棋子放置
|
|
|
add(Elephant(0), 3, 1)
|
|
|
add(Lion(0), 3, 4)
|
|
|
add(Leopard(0), 3, 5)
|
|
|
add(Wolf(0), 3, 3)
|
|
|
add(Fox(0), 2, 6)
|
|
|
add(Eagle(0), 2, 2)
|
|
|
add(Mouse(0), 3, 7)
|
|
|
# 右边棋子放置
|
|
|
add(Elephant(1), 7, 7)
|
|
|
add(Lion(1), 7, 4)
|
|
|
add(Leopard(1), 7, 3)
|
|
|
add(Wolf(1), 7, 5)
|
|
|
add(Fox(1), 8, 2)
|
|
|
add(Eagle(1), 8, 6)
|
|
|
add(Mouse(1), 7, 1)
|
|
|
|
|
|
scan()
|
|
|
refresh()
|
|
|
running = True
|
|
|
|
|
|
screen = pygame.display.set_mode(size)
|
|
|
|
|
|
|
|
|
def animate():
|
|
|
screen.blit(chessboard, [(width - height) / 2, 0])
|
|
|
if selected:
|
|
|
selected.hint()
|
|
|
for x, i in enumerate(grid):
|
|
|
for y, j in enumerate(i):
|
|
|
if j:
|
|
|
screen.blit(j.img, [(width - height) / 2 + ul * x, ul * y])
|
|
|
pygame.display.flip()
|
|
|
|
|
|
|
|
|
while running:
|
|
|
for event in pygame.event.get():
|
|
|
# 程序退出
|
|
|
if event.type == pygame.QUIT:
|
|
|
running = False
|
|
|
# 点击鼠标
|
|
|
elif event.type == pygame.MOUSEBUTTONDOWN:
|
|
|
mousex, mousey = pygame.mouse.get_pos() # 获取鼠标坐标
|
|
|
x = y = z = j = False
|
|
|
for y, i in enumerate(grid):
|
|
|
for z, j in enumerate(i):
|
|
|
if pos[y][z].collidepoint(mousex, mousey):
|
|
|
x = j
|
|
|
break
|
|
|
if pos[y][z].collidepoint(mousex, mousey):
|
|
|
break
|
|
|
if x is False:
|
|
|
continue
|
|
|
if selected:
|
|
|
if [y, z] in selected.next or [y, z] in selected.eat:
|
|
|
lastmove = []
|
|
|
selected.used = True
|
|
|
lastmove.append(copy(selected))
|
|
|
grid[y][z] = selected
|
|
|
grid[selected.x][selected.y] = None
|
|
|
grid[y][z].x, grid[y][z].y = y, z
|
|
|
lastmove.append(grid[y][z])
|
|
|
selected = False
|
|
|
times ^= 1
|
|
|
refresh()
|
|
|
tryout()
|
|
|
for i2 in occ:
|
|
|
for j2 in range(len(i2)):
|
|
|
i2[j2] = []
|
|
|
for i in grid:
|
|
|
for j in i:
|
|
|
if j:
|
|
|
for k, t in j.eat:
|
|
|
occ[k][t].append(j)
|
|
|
animate()
|
|
|
scanlst = scan()
|
|
|
camp = aniSet()
|
|
|
camp.update(scanlst)
|
|
|
if not movable:
|
|
|
if rd != 100:
|
|
|
print("BLue" if win == 2 else "RED", "check!!!")
|
|
|
my_font = pygame.font.SysFont("Consolas", 100)
|
|
|
time_surf = my_font.render("BLUE WIN!!!" if win == 2 else "RED WIN!!!", 1,
|
|
|
[255, 0, 0] if win == 1 else [0, 0, 255])
|
|
|
gor = time_surf.get_rect()
|
|
|
gor.center = width / 2, height / 2
|
|
|
screen.blit(time_surf, gor)
|
|
|
pygame.display.update()
|
|
|
running2 = True
|
|
|
while running2:
|
|
|
for event2 in pygame.event.get():
|
|
|
if event2.type == pygame.KEYDOWN:
|
|
|
if event2.key == pygame.K_ESCAPE:
|
|
|
_exit(0)
|
|
|
else:
|
|
|
print("平局", "check!!!")
|
|
|
my_font = pygame.font.SysFont("Consolas", 100)
|
|
|
time_surf = my_font.render("平局", 1, [255, 255, 255])
|
|
|
gor = time_surf.get_rect()
|
|
|
gor.center = width / 2, height / 2
|
|
|
screen.blit(time_surf, gor)
|
|
|
pygame.display.update()
|
|
|
running2 = True
|
|
|
while running2:
|
|
|
for event2 in pygame.event.get():
|
|
|
if event2.type == pygame.KEYDOWN:
|
|
|
if event2.key == pygame.K_ESCAPE:
|
|
|
_exit(0)
|
|
|
rd += 1
|
|
|
|
|
|
elif x:
|
|
|
if x.camp == times:
|
|
|
selected = x
|
|
|
else:
|
|
|
selected = False
|
|
|
else:
|
|
|
selected = False
|
|
|
else:
|
|
|
if x:
|
|
|
if x.camp == times:
|
|
|
selected = x
|
|
|
|
|
|
animate()
|
|
|
pygame.quit()
|