导语:

哈喽,哈喽~小编想问到底为什么消消乐游戏这么好玩?是精致的画面还是有趣的音效,让我们心

情不好的时候玩,等车玩,睡前也玩。而且每一关必须是三星...

小编今天就用python,码一个消消乐小游戏

 正文:

消消乐的构成主要包括三部分:游戏主体、计分器、计时器,下面来看一下具体实现。

先来看一下游戏所需 Python 库。

1 impormt os

2 impormt sys

3 impormt time

4 impormt pygame

5 impormt random​

定义一些常量,比如:窗口宽高、网格行列数等,代码如下:

1 WIDTH - 400

2 HEIGHT = 460

3 NUMGRID = 8

4 GRIDSIZE - 36

5 XMARGIN = (WIDTH - GRIDSIZE * NUMGRID) 11 2

6 YMARGIN - (HEIGHT - GRIDSIZE * NUMGRID) 1f 2

7 ROOTDIR = os . get cwd()

8 FPS = 30

接着创建一个主窗口,代码如下:

1 pygame. init()

2 screen = pygame . display.set_ mode( ( WIDTH, HEIGHT) )

3 руgаmе . dіѕрlау.ѕеt_ сарtіоn( '消消乐')

看一下效果:

图片

再接着在窗口中画一个 8 x 8 的网格,代码如下:

1 screen. fill((255, 255, 220))

2 #游戏界面的网格绘制

3 def dr awGrids(self):

4           for x in range(NUMGRID):

5                    for y in range(NUMGRID) :

6                          rect= pygame . Rect( (XMARGIN+x*GRIDSIZE ,

7 YMARGIN+y *GRIDSIZE, GRIDSIZE, GRIDSIZE) )

8                      self . dr awBlock(rect, color=(255, 165, Ѳ), size=1

9 #画矩形block框

10 def dr awBlock(self, block, color=(255, 0, 0), size=2):

11           pygame . draw.rect(self.screen, color, block, size)

看一下效果:

图片

再接着在网格中随机放入各种拼图块,代码如下:

1 while True:

2            self.all_ gems = []

3            self ·gems_ group = pygame.sprite.Group()
                
4            for x in range(NUMGRID) :

5            self .all_ gems . append( [])

6            for y in range(NUMGRID) :

7            gem =

8 Puzzle( img_ path=random . choice(self.gem_ imgs), size-(GRIDSIZE, GRIDSIZE),

9 position= [XMARGIN+x*GRIDSIZE, YMARGIN+ y*GRIDSIZE -NUMGRID*GRIDSIZE ] ,

10 down len=NUMGRID *GRIDSIZE )

11                            self .all_ gems [x] .append(gem)

12                            self gems_ group.add(gem)

13       if self .isMatch()[e] == e:

14               break

看一下效果:

图片

再接着加入计分器和计时器,代码如下:

看一下效果:

图片

当设置的游戏时间用尽时,我们可以生成一些提示信息,代码如下:

 看一下效果:

图片

说完了游戏图形化界面相关的部分,我们再看一下游戏的主要处理逻辑。

我们通过鼠标来操纵拼图块,因此程序需要检查有无拼图块被选中,代码实现如下:

 我们需要将鼠标连续选择的拼图块进行位置交换,代码实现如下:

 每一次交换拼图块时,我们需要判断是否有连续一样的三个及以上拼图块,代码实现如下:


def isMatch(self):
  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 generateNewGems(self, res_match):
  if res_match[0] == 1:
    start = res_match[2]
    while start > -2:
      for each in [res_match[1], res_match[1]+1, res_match[1]+2]:
        gem = self.getGemByPos(*[each, start])
        if start == res_match[2]:
          self.gems_group.remove(gem)
          self.all_gems[each][start] = None
        elif start >= 0:
          gem.target_y += GRIDSIZE
          gem.fixed = False
          gem.direction = 'down'
          self.all_gems[each][start+1] = gem
        else:
          gem = Puzzle(img_path=random.choice(self.gem_imgs), size=(GRIDSIZE, GRIDSIZE), position=[XMARGIN+each*GRIDSIZE, YMARGIN-GRIDSIZE], downlen=GRIDSIZE)
          self.gems_group.add(gem)
          self.all_gems[each][start+1] = gem
      start -= 1
  elif res_match[0] == 2:
    start = res_match[2]
    while start > -4:
      if start == res_match[2]:
        for each in range(0, 3):
          gem = self.getGemByPos(*[res_match[1], start+each])
          self.gems_group.remove(gem)
          self.all_gems[res_match[1]][start+each] = None
      elif start >= 0:
        gem = self.getGemByPos(*[res_match[1], start])
        gem.target_y += GRIDSIZE * 3
        gem.fixed = False
        gem.direction = 'down'
        self.all_gems[res_match[1]][start+3] = gem
      else:
        gem = Puzzle(img_path=random.choice(self.gem_imgs), size=(GRIDSIZE, GRIDSIZE), position=[XMARGIN+res_match[1]*GRIDSIZE, YMARGIN+start*GRIDSIZE], downlen=GRIDSIZE*3)
        self.gems_group.add(gem)
        self.all_gems[res_match[1]][start+3] = gem
      start -= 1

之后反复执行这个过程,直至耗尽游戏时间,游戏结束。

最后,我们动态看一下游戏效果。

图片

 结尾:

自己码的消消乐,简单又容易上手。⭐⭐⭐

大家喜欢的记得点点赞,需要完整的项目源码的可以私信我即可哟!

    或者点击这行蓝色字体也行wo~

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐