哈喽,哈喽~小编想问到底为什么消消乐游戏这么好玩?是精致的画面还是有趣的音效,让我们心
情不好的时候玩,等车玩,睡前也玩。而且每一关必须是三星...
小编今天就用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
之后反复执行这个过程,直至耗尽游戏时间,游戏结束。
最后,我们动态看一下游戏效果。
自己码的消消乐,简单又容易上手。有手就行的三星⭐⭐⭐
大家喜欢的记得点点赞,需要完整的项目源码的可以私信我即可哟!
点击这行蓝色字体也行