本文主要介绍了Python实现消消乐小游戏,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,编程学习资料点击免费领取

提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受欢迎程度可见一斑,本文我们使用 Python 来做个简单的消消乐小游戏。

实现

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

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

1

2

3

4

5

import os

import sys

import time

import pygame

import random

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

1

2

3

4

5

6

7

8

WIDTH = 400

HEIGHT = 400

NUMGRID = 8

GRIDSIZE = 36

XMARGIN = (WIDTH - GRIDSIZE * NUMGRID) // 2

YMARGIN = (HEIGHT - GRIDSIZE * NUMGRID) // 2

ROOTDIR = os.getcwd()

FPS = 30

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

1

2

3

pygame.init()

screen = pygame.display.set_mode((WIDTH, HEIGHT))

pygame.display.set_caption('消消乐')

看一下效果:

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

1

2

3

4

5

6

7

8

9

10

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

# 游戏界面的网格绘制

def drawGrids(self):

    for x in range(NUMGRID):

        for y in range(NUMGRID):

            rect = pygame.Rect((XMARGIN+x*GRIDSIZE, YMARGIN+y*GRIDSIZE, GRIDSIZE, GRIDSIZE))

            self.drawBlock(rect, color=(255, 165, 0), size=1

# 画矩形 block 框

def drawBlock(self, block, color=(255, 0, 0), size=2):

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

看一下效果:

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

1

2

3

4

5

6

7

8

9

10

11

while True:

    self.all_gems = []

    self.gems_group = pygame.sprite.Group()

    for x in range(NUMGRID):

        self.all_gems.append([])

        for y in range(NUMGRID):

            gem = Puzzle(img_path=random.choice(self.gem_imgs), size=(GRIDSIZE, GRIDSIZE), position=[XMARGIN+x*GRIDSIZE, YMARGIN+y*GRIDSIZE-NUMGRID*GRIDSIZE], downlen=NUMGRID*GRIDSIZE)

            self.all_gems[x].append(gem)

            self.gems_group.add(gem)

    if self.isMatch()[0] == 0:

        break

看一下效果:

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

# 显示得分

def drawScore(self):

    score_render = self.font.render('分数:'+str(self.score), 1, (85, 65, 0))

    rect = score_render.get_rect()

    rect.left, rect.top = (55, 15)

    self.screen.blit(score_render, rect)

# 显示加分

def drawAddScore(self, add_score):

    score_render = self.font.render('+'+str(add_score), 1, (255, 100, 100))

    rect = score_render.get_rect()

    rect.left, rect.top = (250, 250)

    self.screen.blit(score_render, rect)

# 显示剩余时间

def showRemainingTime(self):

    remaining_time_render = self.font.render('倒计时: %ss' % str(self.remaining_time), 1, (85, 65, 0))

    rect = remaining_time_render.get_rect()

    rect.left, rect.top = (WIDTH-190, 15)

    self.screen.blit(remaining_time_render, rect)

看一下效果:

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

while True:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            pygame.quit()

            sys.exit()

        if event.type == pygame.KEYUP and event.key == pygame.K_r:

            flag = True

    if flag:

        break

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

    text0 = '最终得分: %s' % score

    text1 = '按 R 键重新开始'

    y = 140

    for idx, text in enumerate([text0, text1]):

        text_render = font.render(text, 1, (85, 65, 0))

        rect = text_render.get_rect()

        if idx == 0:

            rect.left, rect.top = (100, y)

        elif idx == 1:

            rect.left, rect.top = (100, y)

        y += 60

        screen.blit(text_render, rect)

    pygame.display.update()

看一下效果:

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

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

1

2

3

4

5

6

def checkSelected(self, position):

    for x in range(NUMGRID):

        for y in range(NUMGRID):

            if self.getGemByPos(x, y).rect.collidepoint(*position):

                return [x, y]

    return None

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

def swapGem(self, gem1_pos, gem2_pos):

    margin = gem1_pos[0] - gem2_pos[0] + gem1_pos[1] - gem2_pos[1]

    if abs(margin) != 1:

        return False

    gem1 = self.getGemByPos(*gem1_pos)

    gem2 = self.getGemByPos(*gem2_pos)

    if gem1_pos[0] - gem2_pos[0] == 1:

        gem1.direction = 'left'

        gem2.direction = 'right'

    elif gem1_pos[0] - gem2_pos[0] == -1:

        gem2.direction = 'left'

        gem1.direction = 'right'

    elif gem1_pos[1] - gem2_pos[1] == 1:

        gem1.direction = 'up'

        gem2.direction = 'down'

    elif gem1_pos[1] - gem2_pos[1] == -1:

        gem2.direction = 'up'

        gem1.direction = 'down'

    gem1.target_x = gem2.rect.left

    gem1.target_y = gem2.rect.top

    gem1.fixed = False

    gem2.target_x = gem1.rect.left

    gem2.target_y = gem1.rect.top

    gem2.fixed = False

    self.all_gems[gem2_pos[0]][gem2_pos[1]] = gem1

    self.all_gems[gem1_pos[0]][gem1_pos[1]] = gem2

    return True

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

1

2

3

4

5

6

7

8

9

10

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]

当出现三个及以上拼图块时,需要将这些拼图块消除,代码实现如下:

1

2

3

4

5

6

def removeMatched(self, res_match):

    if res_match[0] > 0:

        self.generateNewGems(res_match)

        self.score += self.reward

        return self.reward

    return 0

将匹配的拼图块消除之后,我们还需要随机生成新的拼图块,代码实现如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

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

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

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

总结

本文我们使用 Python 实现了一个简单的消消乐游戏,有兴趣的可以对游戏做进一步扩展,比如增加关卡等。

到此这篇关于Python实现消消乐小游戏的文章就介绍到这了,感谢阅读,为你们准备了编程学习的一套资料,还有相应的代码,视频教程都可以获取,添加Q裙703046414即可获取。

Python实现消消乐小游戏相关推荐

  1. 用Python写个开心消消乐小游戏!自己写的游戏就是好玩!

    提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受欢迎程度可见一斑,本文我们使用 Python 来做个简单的消消乐小游戏. 实现 消消乐的构成主要包括 ...

  2. 用Python 写个 开心消消乐小游戏

    源码在python学习交流q群:733089476 获取 提到开心消消乐这款小游戏,相信大家都不陌生,它曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受欢迎程度可见一斑,本文我们使用 Pytho ...

  3. python开心消消乐辅助_用Python写个开心消消乐小游戏

    提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受欢迎程度可见一斑,本文我们使用 Python 来做个简单的消消乐小游戏. 实现 消消乐的构成主要包括 ...

  4. python 小游戏程序_用 Python 写个消消乐小游戏

    文 |野客 来源:Python 技术「ID: pythonall」 提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受欢迎程度可见一斑,本文我们使用 ...

  5. python实现消消乐游戏_用Python写个开心消消乐小游戏

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受 ...

  6. python编写小游戏教程_用Python开发 写个消消乐小游戏

    提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受欢迎程度可见一斑,本文我们使用 Python 来做个简单的消消乐小游戏. 实现 消消乐的构成主要包括 ...

  7. 基于Python制作的消消乐小游戏

    导语 哈喽,好久不见.消失人口上线更新一波每月必出的 python 制作小游戏系列文章.本期我们将制作一个消消乐小游戏,让我们愉快地开始吧 开发工具 Python 版本:3.6.4 相关模块: pyg ...

  8. python迷宫小游戏代码_用 Python 写个消消乐小游戏

    提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受欢迎程度可见一斑,本文我们使用 Python 来做个简单的消消乐小游戏. 很多人学习python,不 ...

  9. 用Python写个开心消消乐小游戏

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受 ...

最新文章

  1. Reflector7及破解
  2. 5940. 从数组中移除最大值和最小值
  3. 前端学习(2422):回顾
  4. 跟随报文,开启一段奇妙之旅
  5. JS:ES6-1 let 关键字
  6. 纵观 30 年 5000 多部国产电视剧,豆瓣评分最低的演员原来是……
  7. iOS开发--添加定位功能
  8. python 安装pandas_Python安装的正确姿势(视频教程)(pip命令安装Pandas、Numpy、jupyter)...
  9. Nachos操作系统-文件系统添加多级目录
  10. 计算机408考研专业课思维导图(计算机组原理、数据结构、操作系统、计算机网络)
  11. 【3D动态思维导图制作软件】万彩脑图大师教程 | 添加声音跟字幕
  12. 深圳移动 神州行(大众卡/轻松卡/幸福卡)套餐资费(含香港日套餐)信息及使用方法...
  13. WEBOS——第一次感觉云计算离我们如此之今
  14. Sicily1059-Exocenter of a Trian
  15. 准确定位表单中的元素
  16. 安卓手机版微信聊天加密软件 悬浮窗版本
  17. 鸵鸟腿“半兽人”已学会跟踪避障,可自主移动到安全距离
  18. FPGA图像处理_中值滤波、均值滤波、极值滤波
  19. BT 面板控制命令 宝塔 Linux 常用命令收集整理
  20. gcc -lm 是什么意思?

热门文章

  1. 拳打DALL-E 2脚踢Imagen,谷歌最新Muse模型刷新文本图像合成排行榜
  2. eclipse汉化方式(下载,安装,中英切换)
  3. 高恪路由设置静态路由失效的问题另类解决方法
  4. DCDC电源与LDO电源
  5. 中南大学计算机夏令营经验,一位保送至中南大学学长的保研经验分享!
  6. CentOS 代理 proxy设置方法
  7. css第二课:外部样式link和import的运用及行内样式的介绍
  8. Win11通过注册表修改文件默认打开方式
  9. 简单的S40后台运行
  10. 调用不同模块A component required a bean of type ‘com.qhzx.td.service.OtcPurchaseSellOutManageService‘ that