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

实现

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

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

import os
import sys
import time
import pygame
import random

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

WIDTH = 400
HEIGHT = 400
NUMGRID = 8
GRIDSIZE = 36
XMARGIN = (WIDTH - GRIDSIZE * NUMGRID) // 2
YMARGIN = (HEIGHT - GRIDSIZE * NUMGRID) // 2
ROOTDIR = os.getcwd()
FPS = 30

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

pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('消消乐')

看一下效果:

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

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)

看一下效果:

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

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

看一下效果:

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

# 显示得分
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)

看一下效果:

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

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 = Trueif flag:breakscreen.fill((255, 255, 220))text0 = '最终得分: %s' % scoretext1 = '按 R 键重新开始'y = 140for 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 += 60screen.blit(text_render, rect)pygame.display.update()

看一下效果:

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

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

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

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

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 Falsegem1 = 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.leftgem1.target_y = gem2.rect.topgem1.fixed = Falsegem2.target_x = gem1.rect.leftgem2.target_y = gem1.rect.topgem2.fixed = Falseself.all_gems[gem2_pos[0]][gem2_pos[1]] = gem1self.all_gems[gem1_pos[0]][gem1_pos[1]] = gem2return True

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

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 removeMatched(self, res_match):if res_match[0] > 0:self.generateNewGems(res_match)self.score += self.rewardreturn self.rewardreturn 0

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

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] = Noneelif start >= 0:gem.target_y += GRIDSIZEgem.fixed = Falsegem.direction = 'down'self.all_gems[each][start+1] = gemelse: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] = gemstart -= 1elif 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] = Noneelif start >= 0:gem = self.getGemByPos(*[res_match[1], start])gem.target_y += GRIDSIZE * 3gem.fixed = Falsegem.direction = 'down'self.all_gems[res_match[1]][start+3] = gemelse: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] = gemstart -= 1

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

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

总结

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

代码获取方式】

识别文末二维码,回复:消消乐

推荐7个阅读:
再见HTML ! 用纯Python就能写一个漂亮的网页
Python精选库大全,建议收藏留用!
GitHub又放大招,植物大战僵尸还能作弊玩!
一道Python面试题,硬是没憋出来,最后憋身汗!
爆红Github!再来一个小白练手项目,20个项目随你造!
太赞了!Python学习宝典!223个小例子,一次让你吃个够!
学Python还是Java, 7张漫画带你全面分析
程序员GitHub专注于分享程序员圈新鲜趣事
GitHub上Python,Java,Go语言
和前端框架等优质的学习资源

用 Python 写个消消乐小游戏相关推荐

  1. 用Python写了一个植物大战僵尸小游戏

    点击上方"码农的后花园",选择"星标" 公众号 精选文章,第一时间送达 大家好,我是 A梦. 今天给大家带来一个 Python 的练手项目.用Python的Py ...

  2. 如何用Python写一个“猜数字”的小游戏,没想到如此简单!

    #纯干货分享 游戏规则:计算机想一个[1,10]之间的整数,让玩家猜测,并且在每次猜测后告诉玩家猜大了还是猜小了.如果玩家在6次之内猜到正确的数字就赢了.在游戏最后,显示玩家共猜了多少次. IPO描述 ...

  3. 用Python写了一个空洞机甲小游戏

    来源:http://nxw.so/4WSng 先来看看效果图: 由于项目代码过多,这里只给出部分代码. 图片素材和源码的下载链接在文章结尾,大家自行下载即可. import pygame,sys im ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. QEMU — I/O QoS 的实现方式
  2. 接口持续集成环境搭建
  3. wpf中的点击窗口放大放小按钮怎么写_Python tkinter教程01:创建窗口
  4. Spring Boot-Spring Tool Suit + Gradle 构建第一个Spring Boot 项目01
  5. python去掉重复内容并按原来次序输出元素_在Python中,从列表中删除重复项以使所有元素在保留顺序时都是唯一的最快的算法是什么?...
  6. BeanShell自动装箱拆箱
  7. 真正的高情商,从学会麻烦别人开始
  8. 软件设计师 - UML图
  9. PowerDesigner导出表为Excel(转)
  10. bat 自动输入密码_三轴自动焊接,三轴搬运机械手示教系统简易说明,分秒学会...
  11. 【资源分享】ppt的模版获取-可用于转正答辩、毕业答辩、课程答辩等等
  12. (转)MySQL数据库InnoDB存储引擎的磁盘空间利用率分析
  13. 第五章---面向对象---小练习
  14. PHP京东商城爬取网页乱码问题解决
  15. 计算机修改用户名密码,怎么修改电脑用户名
  16. 远程操控计算机,将手机平板与电脑连接起来--随时办公
  17. Hacked【黑客】手游攻略
  18. 【Java】巩固基础,温故知新——程序逻辑控制
  19. 定制化centos7
  20. 斐波那契数列和斐波那契数

热门文章

  1. 如何mysql学籍管理系统_MySQL基础-学生管理系统数据库设计
  2. 校对双层PDF中的隐藏文本
  3. 德语翻译器在线翻译中文-德语翻译器支持各大语言翻译
  4. TRC文件转ASC文件
  5. Lingoes 灵格斯词霸
  6. 用PS抽出滤镜让头发溶于背景nbsp;简单…
  7. 实用开发工具及框架概述
  8. EXCEL——向上、向下自动填充数据
  9. springboot+基于JavaWEB学生课程考试系统 毕业设计-附源码171548
  10. matlab机器学习库