主要内容 #
-
- 游戏类reset函数模块
- 游戏类主start函数模块
1.游戏类reset函数模块 #
该模块实现的功能为:随机生成各个块(即初始化游戏地图各个元素)。
该部分代码如下:
def isMatch(self):
'''
有无行列三个拼图块相同判断:是否有连续一样的三个块(无--返回0/水平--返回1/竖直--返回2)
'''
for x in range(NUMGRID):
for y in range(NUMGRID):
if x + 2 < NUMGRID:
if self.getGemByPos(x, y).type == self.getGemByPos(x+1, y).type == self.getGemByPos(x+2, y).type: # 水平方向三个连续相同块
return [1, x, y]
if y + 2 < NUMGRID:
if self.getGemByPos(x, y).type == self.getGemByPos(x, y+1).type == self.getGemByPos(x, y+2).type: # 竖直方向三个连续相同块
return [2, x, y]
return [0, x, y]
def getGemByPos(self, x, y):
'''
根据坐标获取对应位置的拼图对象
'''
return self.all_gems[x][y]
def reset(self):
'''
随机生成各个块(即初始化游戏地图各个元素)
'''
while True:
self.all_gems = []
self.gems_group = pygame.sprite.Group() # 用到sprite模块的Group()函数方法
for x in range(NUMGRID):
self.all_gems.append([])
for y in range(NUMGRID):
gem = gemSprite(img_path=random.choice(self.gem_imgs), size=(GRIDSIZE, GRIDSIZE), position=[XMARGIN+x*GRIDSIZE, YMARGIN+y*GRIDSIZE-NUMGRID*GRIDSIZE], downlen=NUMGRID*GRIDSIZE)
# 每个gem就是每个宝石
self.all_gems[x].append(gem)
self.gems_group.add(gem)
if self.isMatch()[0] == 0:
break
# 得分
self.score = 0
# 拼出一个的奖励
self.reward = 10
# 时间
self.remaining_time = 300
将以上所有代码加入到游戏类代码中,作为成员函数。
接下来需要在各个模块中添加和修改代码,具体如下。
# 在gemGame类中的__init__()函数的最后添加如下代码|
self.reset()
# 在main()函数的最后一行的代码打开
game.reset() # 后续打开该函数
全部修改完之后,运行整体代码,看整体效果,这里无宝石是因为这个只是后台生成了宝石类,还未刷新到界面上。
2.游戏类主start函数模块 #
实现游戏主循环逻辑其实很简单,就是不断检测是否有鼠标点击事件发生,如果有,则判断鼠标点击时的位置是否在某拼图块的位置区域内,若在,则选中该拼图块,否则不选中。
当有第二块拼图块被选中时,则判断两个拼图块是否满足拼图交换的条件,若满足,则交换拼图块,并获得奖励,否则不交换并取消选这两个拼图块的选中状态。
代码如下所示:
def start(self):
'''
开始游戏函数:游戏开始主循环
'''
clock = pygame.time.Clock()
# 遍历整个游戏界面更新位置
overall_moving = True
# 指定某些对象个体更新位置
individual_moving = False
# 定义一些必要的变量
gem_selected_xy = None
gem_selected_xy2 = None
swap_again = False
add_score = 0
add_score_showtimes = 10
time_pre = int(time.time())
# 游戏主循环
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT or (event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE):
pygame.quit()
sys.exit()
self.screen.fill((135, 206, 235))
self.gems_group.draw(self.screen)
if add_score:
if add_score_showtimes == 10:
random.choice(self.sounds['match']).play() # 随机选中匹配成功的音效
add_score_showtimes -= 1
if add_score_showtimes < 1:
add_score_showtimes = 10
add_score = 0
self.remaining_time -= (int(time.time()) - time_pre) # 剩余时间
time_pre = int(time.time())
if self.remaining_time <= 0: # 时间结束,返回得分
return self.score
pygame.display.update()
clock.tick(FPS)
将以上所有代码加入到上一课创建的项目文件中(该代码请置放在游戏类中,作为成员函数)。
接下来需要在各个模块中添加和修改代码,具体如下。
# 在main()函数找到如下代码
score = 0
# score = game.start() # 后续打开该函数
# 将如上两行代码修改为如下
# score = 0
score = game.start() # 后续打开该函数
全部修改完之后,运行整体代码,看整体效果。
小结 #
- 本节主要介绍了消消乐游戏的随机生成模块和主循环start模块的结构。