Python3+pygame中国象棋 代码完整 非常好 有效果演示
这几天看到抖音上有个妹子下象棋超级猛,我的中国象棋也差不到哪去啊,走 做一个。。。。
一、运行效果
二、代码
下面的代码用到图片素材(images文件夹),下载地址如下:https://www.itprojects.cn/detail.html?example_id=36476747ef821e752d060e061bf0a29d
完成代码如下:
"""
作者:it项目实例网
网址:www.itprojects.cn
""" import sys import pygame # 要显示的窗口的宽、高
WIDTH, HEIGHT = 750, 667 class ClickBox(pygame.sprite.Sprite):
"""
选中棋子对象
"""
singleton = None def __new__(cls, *args, **kwargs):
if cls.singleton is None:
cls.singleton = super().__new__(cls)
return cls.singleton def __init__(self, screen, row, col, team):
super().__init__()
self.image = pygame.image.load("images/r_box.png")
self.rect = self.image.get_rect()
self.row, self.col = row, col
self.rect.topleft = (50 + self.col * 57, 50 + self.row * 57)
self.screen = screen
self.team = team @classmethod
def show(cls):
if cls.singleton:
cls.singleton.screen.blit(cls.singleton.image, cls.singleton.rect) @classmethod
def clean(cls):
"""
清理上次的对象
"""
cls.singleton = None class Dot(pygame.sprite.Sprite):
"""
可落棋子类
"""
group = list() def __init__(self, screen, position):
super().__init__()
self.image = pygame.image.load("images/dot2.png")
self.rect = self.image.get_rect()
self.row, self.col = position # 将元组拆包
self.rect.topleft = (60 + self.col * 57, 60 + self.row * 57)
self.group.append(self)
self.screen = screen @classmethod
def show(cls):
for dot in cls.group:
dot.screen.blit(dot.image, dot.rect) @classmethod
def clean_last_postion(cls):
"""
清除上次落子位置
"""
cls.group.clear() @classmethod
def click(cls):
"""
点击棋子
"""
for dot in cls.group:
if pygame.mouse.get_pressed()[0] and dot.rect.collidepoint(pygame.mouse.get_pos()):
print("被点击了「可落子」对象")
return dot class Chess(pygame.sprite.Sprite):
"""
棋子类
""" def __init__(self, screen, chess_name, row, col):
self.screen = screen
self.image = pygame.image.load("images/" + chess_name + ".png")
self.rect = self.image.get_rect()
self.rect.topleft = (50 + col * 57, 50 + row * 57)
self.team = chess_name[0] # 队伍(红方 r、黑方b)
self.name = chess_name[2] # 名字(炮p、马m等)
self.row = row
self.col = col def show(self):
self.screen.blit(self.image, self.rect) @staticmethod
def click(player, chesses):
"""
点击棋子
"""
for chess in chesses:
if pygame.mouse.get_pressed()[0] and chess.rect.collidepoint(pygame.mouse.get_pos()):
if player == chess.team:
print("被点击了")
return chess def update_postion(self, new_row, new_col):
"""
更新要显示的图片的坐标
"""
self.row = new_row
self.col = new_col
self.rect.topleft = (50 + new_col * 57, 50 + new_row * 57) class ChessBoard(object):
"""
棋盘类
""" def __init__(self, screen):
self.screen = screen
self.image = pygame.image.load("images/bg.png")
self.topleft = (50, 50)
self.__create_default_chess() def __create_default_chess(self):
"""
创建默认棋子
"""
self.map = [
["b_c", "b_m", "b_x", "b_s", "b_j", "b_s", "b_x", "b_m", "b_c"],
["", "", "", "", "", "", "", "", ""],
["", "b_p", "", "", "", "", "", "b_p", ""],
["b_z", "", "b_z", "", "b_z", "", "b_z", "", "b_z"],
["", "", "", "", "", "", "", "", ""],
["", "", "", "", "", "", "", "", ""],
["r_z", "", "r_z", "", "r_z", "", "r_z", "", "r_z"],
["", "r_p", "", "", "", "", "", "r_p", ""],
["", "", "", "", "", "", "", "", ""],
["r_c", "r_m", "r_x", "r_s", "r_j", "r_s", "r_x", "r_m", "r_c"],
]
for row, line in enumerate(self.map):
for col, chess_name in enumerate(line):
if chess_name:
# 将创建的棋子添加到属性map中
self.map[row][col] = Chess(self.screen, chess_name, row, col)
else:
self.map[row][col] = None def show(self):
# 显示棋盘
self.screen.blit(self.image, self.topleft)
# 显示棋盘上的所有棋子
for line_chess in self.map:
for chess in line_chess:
if chess:
chess.show() def get_put_down_postion(self, clicked_chess):
"""
计算当前棋子可以移动的位置
"""
# 存储当前棋子可以落子的位置
all_position = list()
# 拿到当前棋子的行、列
row, col = clicked_chess.row, clicked_chess.col
# 拿到当前棋子的team,即时红方r还是黑方b
team = clicked_chess.team # 计算当前选中棋子的所有可以落子位置
if clicked_chess.name == "p": # 炮
# 一行
direction_left_chess_num = 0
direction_right_chess_num = 0
for i in range(1, 9):
# 计算当前行中,棋子左边与右边可以落子的位置
# 左边位置没有越界
if direction_left_chess_num >= 0 and col - i >= 0:
if not self.map[row][col - i] and direction_left_chess_num == 0:
# 如果没有棋子,则将当前位置组成一个元组,添加到列表
all_position.append((row, col - i))
elif self.map[row][col - i]:
# 如果当前位置有棋子,那么就判断是否能够吃掉它
direction_left_chess_num += 1
if direction_left_chess_num == 2 and self.map[row][col - i].team != team:
all_position.append((row, col - i))
direction_left_chess_num = -1 # 让其不能够在下次for循环时再次判断
# 右边位置没有越界
if direction_right_chess_num >= 0 and col + i <= 8:
if not self.map[row][col + i] and direction_right_chess_num == 0:
# 如果没有棋子,则将当前位置组成一个元组,添加到列表
all_position.append((row, col + i))
elif self.map[row][col + i]:
# 如果当前位置有棋子,那么就判断是否能够吃掉它
direction_right_chess_num += 1
if direction_right_chess_num == 2 and self.map[row][col + i].team != team:
all_position.append((row, col + i))
direction_right_chess_num = -1
# 一列
direction_up_chess_num = 0
direction_down_chess_num = 0
for i in range(1, 10): # 这样就让i从1开始,而不是从0
# 计算当前列中,棋子上边与下边可以落子的位置
# 上边位置没有越界
if direction_up_chess_num >= 0 and row - i >= 0:
if not self.map[row - i][col] and direction_up_chess_num == 0:
# 如果没有棋子,则将当前位置组成一个元组,添加到列表
all_position.append((row - i, col))
elif self.map[row - i][col]:
# 如果当前位置有棋子,那么就判断是否能够吃掉它
direction_up_chess_num += 1
if direction_up_chess_num == 2 and self.map[row - i][col].team != team:
all_position.append((row - i, col))
direction_up_chess_num = -1 # 下边位置没有越界
if direction_down_chess_num >= 0 and row + i <= 9:
if not self.map[row + i][col] and direction_down_chess_num == 0:
# 如果没有棋子,则将当前位置组成一个元组,添加到列表
all_position.append((row + i, col))
elif self.map[row + i][col]:
# 如果当前位置有棋子,那么就判断是否能够吃掉它
direction_down_chess_num += 1
if direction_down_chess_num == 2 and self.map[row + i][col].team != team:
all_position.append((row + i, col))
direction_down_chess_num = -1
elif clicked_chess.name == "z": # 卒
if team == "r": # 红方
if row - 1 >= 0: # 只能向上移动
if not self.map[row - 1][col] or self.map[row - 1][col].team != team:
all_position.append((row - 1, col))
else: # 黑方
if row + 1 <= 9: # 只能向下移动
if not self.map[row + 1][col] or self.map[row + 1][col].team != team:
all_position.append((row + 1, col))
# 左右判断
if (team == "r" and 0 <= row <= 4) or (team == "b" and 5 <= row <= 9): # 左、右一步
# 左
if col - 1 >= 0 and (not self.map[row][col - 1] or self.map[row][col - 1].team != team):
all_position.append((row, col - 1))
# 右
if col + 1 <= 8 and (not self.map[row][col + 1] or self.map[row][col + 1].team != team):
all_position.append((row, col + 1))
elif clicked_chess.name == "c": # 车
# 一行
left_stop = False
right_stop = False
for i in range(1, 9):
# 左边位置没有越界且没有遇到任何一个棋子
if not left_stop and col - i >= 0:
if not self.map[row][col - i]:
# 如果没有棋子,则将当前位置组成一个元组,添加到列表
all_position.append((row, col - i))
else:
left_stop = True
if self.map[row][col - i].team != team:
# 如果当前位置有棋子,那么就判断是否能够吃掉它
all_position.append((row, col - i))
# 右边位置没有越界且没有遇到任何一个棋子
if not right_stop and col + i <= 8:
if not self.map[row][col + i]:
# 如果没有棋子,则将当前位置组成一个元组,添加到列表
all_position.append((row, col + i))
else:
right_stop = True
if self.map[row][col + i].team != team:
# 如果当前位置有棋子,那么就判断是否能够吃掉它
all_position.append((row, col + i)) # 一列
up_stop = False
down_stoop = False
for i in range(1, 10):
# 上边位置没有越界且没有遇到任何一个棋子
if not up_stop and row - i >= 0:
if not self.map[row - i][col]:
# 如果没有棋子,则将当前位置组成一个元组,添加到列表
all_position.append((row - i, col))
else:
up_stop = True
if self.map[row - i][col].team != team:
# 如果当前位置有棋子,那么就判断是否能够吃掉它
all_position.append((row - i, col))
# 下边位置没有越界且没有遇到任何一个棋子
if not down_stoop and row + i <= 9:
if not self.map[row + i][col]:
# 如果没有棋子,则将当前位置组成一个元组,添加到列表
all_position.append((row + i, col))
else:
down_stoop = True
if self.map[row + i][col].team != team:
# 如果当前位置有棋子,那么就判断是否能够吃掉它
all_position.append((row + i, col))
elif clicked_chess.name == "m": # 马
# 需要判断的是4个方向,每个方向对应2个位置
# 上方
if row - 1 >= 0 and not self.map[row - 1][col]: # 如果当前棋子没有被蹩马腿,那么再对这个方向的2个位置进行判断
# 左上
if row - 2 >= 0 and col - 1 >= 0 and (not self.map[row - 2][col - 1] or self.map[row - 2][col - 1].team != team):
all_position.append((row - 2, col - 1))
# 右上
if row - 2 >= 0 and col + 1 <= 8 and (not self.map[row - 2][col + 1] or self.map[row - 2][col + 1].team != team):
all_position.append((row - 2, col + 1))
# 下方
if row + 1 <= 9 and not self.map[row + 1][col]: # 如果当前棋子没有被蹩马腿,那么再对这个方向的2个位置进行判断
# 左下
if row + 2 >= 0 and col - 1 >= 0 and (not self.map[row + 2][col - 1] or self.map[row + 2][col - 1].team != team):
all_position.append((row + 2, col - 1))
# 右下
if row + 2 >= 0 and col + 1 <= 8 and (not self.map[row + 2][col + 1] or self.map[row + 2][col + 1].team != team):
all_position.append((row + 2, col + 1))
# 左方
if col - 1 >= 0 and not self.map[row][col - 1]: # 如果当前棋子没有被蹩马腿,那么再对这个方向的2个位置进行判断
# 左上2(因为有左上了,暂且称为左上2吧)
if row - 1 >= 0 and col - 2 >= 0 and (not self.map[row - 1][col - 2] or self.map[row - 1][col - 2].team != team):
all_position.append((row - 1, col - 2))
# 左下2
if row + 1 <= 9 and col - 2 >= 0 and (not self.map[row + 1][col - 2] or self.map[row + 1][col - 2].team != team):
all_position.append((row + 1, col - 2))
# 右方
if col + 1 <= 8 and not self.map[row][col + 1]: # 如果当前棋子没有被蹩马腿,那么再对这个方向的2个位置进行判断
# 右上2(因为有右上了,暂且称为右上2吧)
if row - 1 >= 0 and col + 2 <= 8 and (not self.map[row - 1][col + 2] or self.map[row - 1][col + 2].team != team):
all_position.append((row - 1, col + 2))
# 右下2
if row + 1 <= 9 and col + 2 <= 8 and (not self.map[row + 1][col + 2] or self.map[row + 1][col + 2].team != team):
all_position.append((row + 1, col + 2))
elif clicked_chess.name == "x": # 象
# 因为象是不能过河的,所以要计算出它们可以移动的行的范围
row_start, row_stop = (0, 4) if team == "b" else (5, 9)
# 有4个方向的判断(没有越界,且没有蹩象腿)
if row - 2 >= row_start and col - 2 >= 0 and not self.map[row - 1][col - 1]: # 左上
if not self.map[row - 2][col - 2] or self.map[row - 2][col - 2].team != team:
all_position.append((row - 2, col - 2))
if row - 2 >= row_start and col + 2 <= 8 and not self.map[row - 1][col + 1]: # 右上
if not self.map[row - 2][col + 2] or self.map[row - 2][col + 2].team != team:
all_position.append((row - 2, col + 2))
if row + 2 <= row_stop and col - 2 >= 0 and not self.map[row + 1][col - 1]: # 左下
if not self.map[row + 2][col - 2] or self.map[row + 2][col - 2].team != team:
all_position.append((row + 2, col - 2))
if row + 2 <= row_stop and col + 2 <= 8 and not self.map[row + 1][col + 1]: # 右下
if not self.map[row + 2][col + 2] or self.map[row + 2][col + 2].team != team:
all_position.append((row + 2, col + 2))
elif clicked_chess.name == "s": # 士
# 因为士是不能过河的,所以要计算出它们可以移动的行的范围
row_start, row_stop = (0, 2) if team == "b" else (7, 9)
if row - 1 >= row_start and col - 1 >= 3 and (not self.map[row - 1][col - 1] or self.map[row - 1][col - 1].team != team):
all_position.append((row - 1, col - 1))
if row - 1 >= row_start and col + 1 <= 5 and (not self.map[row - 1][col + 1] or self.map[row - 1][col + 1].team != team):
all_position.append((row - 1, col + 1))
if row + 1 <= row_stop and col - 1 >= 3 and (not self.map[row + 1][col - 1] or self.map[row + 1][col - 1].team != team):
all_position.append((row + 1, col - 1))
if row + 1 <= row_stop and col + 1 <= 5 and (not self.map[row + 1][col + 1] or self.map[row + 1][col + 1].team != team):
all_position.append((row + 1, col + 1))
elif clicked_chess.name == "j": # 将
# 因为"将"是不能过河的,所以要计算出它们可以移动的行的范围
row_start, row_stop = (0, 2) if team == "b" else (7, 9)
# 有4个方向的判断
if row - 1 >= row_start and (not self.map[row - 1][col] or self.map[row - 1][col].team != team):
all_position.append((row - 1, col))
if row + 1 <= row_stop and (not self.map[row + 1][col] or self.map[row + 1][col].team != team):
all_position.append((row + 1, col))
if col - 1 >= 3 and (not self.map[row][col - 1] or self.map[row][col - 1].team != team):
all_position.append((row, col - 1))
if col + 1 <= 5 and (not self.map[row][col + 1] or self.map[row][col + 1].team != team):
all_position.append((row, col + 1)) all_position = self.judge_delete_position(all_position, clicked_chess) # 返回可以落子的所有位置
return all_position def judge_delete_position(self, all_position, clicked_chess):
"""
删除被"将军"的位置
"""
# 定义要删除的列表
deleting_position = list() # 判断这些位置,是否会导致被"将军",如果是则从列表中删除这个位置
for row, col in all_position:
# 1. 备份
# 备份当前棋子位置
old_row, old_col = clicked_chess.row, clicked_chess.col
# 备份要落子的位置的棋子(如果没有,则为None)
position_chess_backup = self.map[row][col]
# 2. 挪动位置
# 移动位置
self.map[row][col] = self.map[old_row][old_col]
# 修改棋子的属性
self.map[row][col].update_postion(row, col)
# 清楚之前位置为None
self.map[old_row][old_col] = None
# 3. 判断对方是否可以发起"将军"
if self.judge_attack_general("b" if clicked_chess.team == "r" else "r"):
deleting_position.append((row, col))
# 4. 恢复到之前位置
self.map[old_row][old_col] = self.map[row][col]
self.map[old_row][old_col].update_postion(old_row, old_col)
self.map[row][col] = position_chess_backup # 5. 删除不能落子的位置
all_position = list(set(all_position) - set(deleting_position)) return all_position def move_chess(self, new_row, new_col):
"""
落子
"""
# 得到要移动的棋子的位置
old_row, old_col = ClickBox.singleton.row, ClickBox.singleton.col
print("旧位置:", old_row, old_col, "新位置:", new_row, new_col)
# 移动位置
self.map[new_row][new_col] = self.map[old_row][old_col]
# 修改棋子的属性
self.map[new_row][new_col].update_postion(new_row, new_col)
# 清楚之前位置为None
self.map[old_row][old_col] = None def judge_attack_general(self, attact_player):
"""
判断 attact_player方是否 将对方的军
"""
# 1. 找到对方"将"的位置
general_player = "r" if attact_player == "b" else "b"
general_position = self.get_general_position(general_player) # 2. 遍历我方所有的棋子
for row, line in enumerate(self.map):
for col, chess in enumerate(line):
if chess and chess.team == attact_player:
if chess.name == "z": # 兵
# 传递5个参数(攻击方的标识,攻击方row,攻击方col,对方将row,对方将col)
if self.judge_z_attack(chess.team, chess.row, chess.col, *general_position):
return True
elif chess.name == "p": # 炮
if self.judge_c_and_p_attack(chess.name, chess.row, chess.col, *general_position):
return True
elif chess.name == "c": # 车
if self.judge_c_and_p_attack(chess.name, chess.row, chess.col, *general_position):
return True
elif chess.name == "m": # 马
if self.judge_m_attack(chess.row, chess.col, *general_position):
return True
elif chess.name == "x": # 象
pass
elif chess.name == "s": # 士
pass
elif chess.name == "j": # 将
if self.judge_j_attack(chess.row, chess.col, *general_position):
return True def judge_j_attack(self, attack_row, attack_col, general_row, general_col):
"""
判断 两个将是否相对
"""
if attack_col == general_col:
# 在同一列
min_row, max_row = (attack_row, general_row) if attack_row < general_row else (general_row, attack_row) chess_num = 0
for i in range(min_row + 1, max_row):
if self.map[i][general_col]:
chess_num += 1
if chess_num == 0:
return True def judge_m_attack(self, attack_row, attack_col, general_row, general_col):
"""
判断马是否攻击到"将"
"""
if attack_row == general_row or attack_col == general_col:
return False
else:
# "马走日",利用这个特点会得出,如果此马能够攻击到"将",那么两条边的平方和一定是5
col_length = (attack_col - general_col) ** 2
row_length = (attack_row - general_row) ** 2
if col_length + row_length == 5:
# 判断是否蹩马腿
if col_length == 1:
if general_row < attack_row and not self.map[attack_row - 1][attack_col]:
return True
elif general_row > attack_row and not self.map[attack_row + 1][attack_col]:
return True
elif col_length == 4:
if general_col < attack_col and not self.map[attack_row][attack_col - 1]:
return True
elif general_col > attack_col and not self.map[attack_row][attack_col + 1]:
return True def judge_c_and_p_attack(self, attack_chess_name, attack_row, attack_col, general_row, general_col):
"""
判断"车"、"炮"能否攻击到对方"将"
"""
check_chess_num = 1 if attack_chess_name == "p" else 0
chess_num = 0
if attack_row == general_row:
# 在同一行
min_col, max_col = (attack_col, general_col) if attack_col < general_col else (general_col, attack_col)
for i in range(min_col + 1, max_col):
if self.map[attack_row][i]:
chess_num += 1
if chess_num == check_chess_num:
return True
elif attack_col == general_col:
# 在同一列
min_row, max_row = (attack_row, general_row) if attack_row < general_row else (general_row, attack_row)
for i in range(min_row + 1, max_row):
if self.map[i][general_col]:
chess_num += 1
if chess_num == check_chess_num:
return True def judge_z_attack(self, attack_team, attack_row, attack_col, general_row, general_col):
"""
判断卒是否攻击到"将"
"""
if attack_team == "r" and attack_row < general_row:
return False
elif attack_team == "b" and attack_row > general_row:
return False
elif (attack_row - general_row) ** 2 + (attack_col - general_col) ** 2 == 1:
return True def get_general_position(self, general_player):
"""
找到general_player标记的一方的将的位置
"""
for row, line in enumerate(self.map):
for col, chess in enumerate(line):
if chess and chess.team == general_player and chess.name == "j":
return chess.row, chess.col def judge_win(self, attack_player):
"""
判断是否获胜
"""
# 依次判断是否被攻击方的所有棋子,是否有阻挡攻击的可能
for line_chesses in self.map:
for chess in line_chesses:
if chess and chess.team != attack_player:
move_position_list = self.get_put_down_postion(chess)
if move_position_list: # 只要找到一个可以移动的位置,就表示没有失败,还是有机会的
return False return True class Game(object):
"""
游戏类
""" def __init__(self, screen):
self.screen = screen
self.player = "r" # 默认走棋的为红方r
self.player_tips_r_image = pygame.image.load("images/red.png")
self.player_tips_r_image_topleft = (550, 500)
self.player_tips_b_image = pygame.image.load("images/black.png")
self.player_tips_b_image_topleft = (550, 100)
self.show_attack = False
self.show_attack_count = 0
self.show_attack_time = 100
self.attack_img = pygame.image.load("images/pk.png")
self.show_win = False
self.win_img = pygame.image.load("images/win.png")
self.win_player = None def get_player(self):
"""
获取当前走棋方
"""
return self.player def exchange(self):
"""
交换走棋方
"""
self.player = "r" if self.player == "b" else "b"
return self.get_player() def show(self):
if self.show_win:
if self.win_player == "b":
self.screen.blit(self.win_img, (550, 100))
else:
self.screen.blit(self.win_img, (550, 450))
return # 通过计时,实现显示一会"将军"之后,就消失
if self.show_attack:
self.show_attack_count += 1
if self.show_attack_count == self.show_attack_time:
self.show_attack_count = 0
self.show_attack = False if self.player == "r":
self.screen.blit(self.player_tips_r_image, self.player_tips_r_image_topleft)
# 显示"将军"效果
if self.show_attack:
self.screen.blit(self.attack_img, (230, 400))
else:
self.screen.blit(self.player_tips_b_image, self.player_tips_b_image_topleft)
# 显示"将军"效果
if self.show_attack:
self.screen.blit(self.attack_img, (230, 100)) def set_attack(self):
"""
标记"将军"效果
"""
self.show_attack = True def set_win(self, win_player):
"""
设置获胜方
"""
self.show_win = True
self.win_player = win_player def main():
# 初始化pygame
pygame.init()
# 创建用来显示画面的对象(理解为相框)
screen = pygame.display.set_mode((WIDTH, HEIGHT))
# 游戏背景图片
background_img = pygame.image.load("images/bg.jpg")
# 创建游戏对象
game = Game(screen)
# 创建一个游戏棋盘对象
chess_board = ChessBoard(screen)
# 创建计时器
clock = pygame.time.Clock() # 主循环
while True:
# 事件检测(例如点击了键盘、鼠标等)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit() # 退出程序 # 如果游戏没有获胜方,则游戏继续,否则一直显示"获胜"
if not game.show_win:
# 检测是否点击了"可落子"对象
clicked_dot = Dot.click()
if clicked_dot:
chess_board.move_chess(clicked_dot.row, clicked_dot.col)
# 清理「点击对象」、「可落子位置对象」
Dot.clean_last_postion()
ClickBox.clean()
# 判断此棋子走完之后,是否"将军"
if chess_board.judge_attack_general(game.get_player()):
# 检测对方是否可以挽救棋局,如果能挽救,就显示"将军",否则显示"胜利"
if chess_board.judge_win(game.get_player()):
game.set_win(game.get_player())
else:
# 如果攻击到对方,则标记显示"将军"效果
game.set_attack()
# 落子之后,交换走棋方
game.exchange()
# 检查是否点击了棋子
clicked_chess = Chess.click(game.get_player(), [chess for line in chess_board.map for chess in line if chess])
if clicked_chess:
# 创建选中棋子对象
ClickBox(screen, clicked_chess.row, clicked_chess.col, clicked_chess.team)
# 清除之前的所有的可以落子对象
Dot.clean_last_postion()
# 真的点击了棋子,那么计算当前被点击的棋子可以走的位置
all_position = chess_board.get_put_down_postion(clicked_chess)
if all_position:
# 清空上次可落子对象
Dot.clean_last_postion()
# 创建可落子对象
for position in all_position:
Dot(screen, position) # 显示游戏背景
screen.blit(background_img, (0, 0))
screen.blit(background_img, (0, 270))
screen.blit(background_img, (0, 540)) # 显示棋盘以及棋盘上的棋子
chess_board.show() # 显示被点击的棋子
ClickBox.show() # 显示可落子对象
Dot.show() # 显示游戏相关信息
game.show() # 显示screen这个相框的内容(此时在这个相框中的内容像照片、文字等会显示出来)
pygame.display.update() # FPS(每秒钟显示画面的次数)
clock.tick(60) # 通过一定的延时,实现1秒钟能够循环60次 if __name__ == '__main__':
main()
如果有帮到你,别忘了点赞啊,谢谢
Python3+pygame中国象棋 代码完整 非常好 有效果演示的更多相关文章
- 亲自动手实现Python+pygame中国象棋游戏
功能1:实现游戏整体界面显示 一.创建基本的结构 代码如下: import time import pygame def main(): # 初始化pygame pygame.init() # 创建用 ...
- Python3+pygame实现的flappy bird游戏,代码完整,还有音乐
之前一直在手机上玩flappy bird游戏,闲暇时间就编写了一个 是采用python3+pygame模块制作而成的,运行效果非常流畅,会让你大吃一惊哦哈哈 一.运行效果展示 下载游戏之后,注意在自己 ...
- Python3+pygame实现的90坦克大战 代码完整 有演示效果
我是一个典型的80后,年轻时玩过了特别多的游戏,所以这几天用Python3+pygame实现了一个另外小游戏"坦克大战"(其他的游戏,请翻阅我的博客) 本实例代码量有些多,完整的版 ...
- python3+tkinter实现的黑白棋,代码完整 100%能运行
今天分享给大家的是采用Python3+tkinter制作而成的小项目--黑白棋 tkinter是Python内置的图形化模块,简单易用,一般的小型UI程序可以快速用它实现,具体的tkinter相关知识 ...
- JavaScript中国象棋程序(7) - 置换表
"JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.这是教程的第2节. 这一系列共有9个部分: 0.JavaScript中国象 ...
- 中国象棋游戏Chess(2) - 走棋
之前的文章请看:中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制 现在实现走棋的功能. 首先需要获取点击到的棋子,用QWidget中的函数 mouseReleaseEvent 实现函数: vo ...
- BZOJ 1801中国象棋 DP
1801: [Ahoi2009]chess 中国象棋 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1426 Solved: 826[Submit][ ...
- 中国象棋引擎的C#源代码
以前写的中国象棋引擎的C#源程序,可在VS2010中编译运行,由于个人精力有限,难以完成后续的开发工作,如果谁感兴趣,请关注微信公众号(“申龙斌的程序人生”,ID:slbGTD),发送后台消息“象棋引 ...
- 1.2 中国象棋将帅问题进一步讨论与扩展:如何用1个变量实现N重循环?[chinese chess]
[题目] 假设在中国象棋中只剩下将帅两个棋子,国人都知道基本规则:将帅不能出九宫格,只能上下左右移动,不能斜向移动,同时将帅不能照面.问在这样条件下,所有可能将帅位置.要求在代码中只能使用一个字节存储 ...
随机推荐
- hdu4501——小明系列故事——买年货(多维背包)
题解: 思路:将v1,v2,k都当作一种体积,开三维dp数组,每种物品只能取一次 代码中的for循环是倒着进行的,知道01背包和完全背包的肯定明白,倒着进行的就代表每种物品只选择一次 代码: 1 #i ...
- 动态主席树【带修改】&& 例题 Dynamic Rankings ZOJ - 2112
参考链接:https://blog.csdn.net/WilliamSun0122/article/details/77885781 一.动态主席树介绍 动态主席树与静态主席树的不同在于:静态主席树不 ...
- rabbitMq学习一
1.安装rabbitmq Windows下安装 首先,我们访问官网[https://www.rabbitmq.com/],点击Get Started. 选择下载安装,由于RabbitMQ使用Erlan ...
- .net面试--值类型和引用类型
注:下面的示意图主要是为了辅助理解,不代表内存真实情况. Introduction 类型基础是C#的基础概念,了解类型基础及背后的工作原理更有助于我们在编码的时候明白数据在内存中的分配与传递.C#提供 ...
- WSL2 准备dotnet core开发环境
首先我们要知道WSL Ubuntu的版本,以便进行下一步操作: 我的是18.04,所以安装dot net SDK我们参考这里: https://docs.microsoft.com/en-us/dot ...
- [笔记]吞吐量(TPS)、QPS、并发数、响应时间(RT)概念
开发的原因,需要对吞吐量(TPS).QPS.并发数.响应时间(RT)几个概念做下了解,查自百度百科,记录如下: 1. 响应时间(RT) 响应时间是指系统对请求作出响应的时间.直观上看,这个指标与人对软 ...
- 第三方库:logger,自定义日志封装模块
为了使用方便,二次封装logger. import os import datetime from loguru import logger class Logings: __instance = N ...
- Open3d之交互式可视化
本篇教程介绍了Open3D的可视化窗口的交互功能. # -*- coding:utf-8 -*- import copy import numpy as np import open3d as o3d ...
- 力扣567.字符串的排列—C语言实现
题目 来源:力扣(LeetCode)
- Linux 驱动框架---驱动中的时间相关
内核中的时间 Linux 系统内核对于时间的管理依赖于硬件,硬件按一定的周期产生中断,周期由内核的一个配置值HZ决定在系统启动时会将定时器配置为HZ值指定的频率产生中断:同时内核和维护一个64位(X8 ...