上边是我初步构思之后画出的一个结构图:
思路解析:
1、首先分析游戏过程
大概分为三部分
①、随机产生初始棋盘
②、棋子操作
③、判断何时游戏结束
2、对象及对象之间的关系
对象就是32个棋子和棋盘
3、对象分析确定对象的属性和方法
棋子 (将*1+士*2+象*2+马*2+车*2+炮*2+卒*5)*2 = 32 个对象
有三种状态 hidden(未被翻开) active(被翻开) dead(被吃掉)
有两个方法 move (移动) eat(吃子)
标记自己角色的 role 属性 (红色还是黑色)
标记自己类型的 type 属性(将,士,象……)
4、资源的准备
棋盘,棋子,棋子背面
背景音乐等
5、pygame 游戏框架搭建
# 引包
import pygame
from pygame.locals import *
import sys
import traceback
# 初始化
pygame.init()
try:
pygame.mixer.init()
except:
print("您没有音频设备!")
raise Exception
bg_size = width,height = 474,663
screen = pygame.display.set_mode(bg_size)
bg_rect = screen.get_rect()
pygame.display.set_caption("象棋小游戏")
# 初始化音乐
pygame.mixer.music.load('./sounds/bg.ogg')
# 初始化图片
chess_pan_img = pygame.image.load('./pic/chess_bg.png').convert()
chess_select1_img = pygame.image.load('./pic/selected.png').convert()
chess_select2_img = pygame.image.load('./pic/selected2.png').convert()
# 定义颜色
WHITE = (255,255,255)
BLACK = (0,0,0)
GREEN = (0,255,0)
RED = (255,0,0)
BLUE = (0,0,255)
running = True
def main():
# 初始化音乐
pygame.mixer.music.play(-1)
clock = pygame.time.Clock()
global running
while running:
# 首先绘制棋盘
screen.blit(chess_pan_img, (10, 10))
pygame.display.flip()
clock.tick(60)
#主函数
if __name__ == "__main__":
try:
main()
except SystemExit:
print("游戏正常退出")
except:
print("游戏退出异常")
traceback.print_exc()
pygame.quit()
input()
这时,会出现一个问题,刚开始接触 pygame 时,想了好久,贴图解释:
点击运行之后,鼠标一直是转圈状态,点击就出现无响应,怎么解决呢?
在 main() 函数 while running 中添加
# 监听所有事件
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
再次运行,完美解决,所以出现上述现象的原因应该是短时间内刷新次数太多导致的。
然后我们开始定义我们的棋子对象
import pygame
from pygame.locals import *
import math
RED_ROLE = 0
BLACK_ROLE = 1
HIDDEN_STATE = 3
ACTIVE_STATE = 4
DEAD_STATE = 5
CHOOSED_STATE = 6
JIANG_TYPE = 11
SHI_TYPE = 12
XIANG_TYPE = 13
CHE_TYPE = 14
MA_TYPE = 15
PAO_TYPE = 16
ZU_TYPE = 17
class JiangChess:
def __init__(self,rect):
self.position = x,y = 86,66
self.state = HIDDEN_STATE
self.type = JIANG_TYPE
self.role = RED_ROLE
self.rect = self.b_image.get_rect()
def move(self,pos):
pass
def eat(self):
pass
到这儿框架的搭建就差不多了,下一篇博客我们开始具体功能的实现第一部分——棋子随机排布