范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

小游戏合集之用Python自己开发一个闯关小游戏开心消消乐

  导语:
  今天这款小游戏是最适合小伙伴们一同挑战的精美手游,其因画面精美、上手简单、休闲有趣、有惊喜有挑战而获得广大玩家的喜爱...这款小游戏没错就是开心消消乐,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受欢迎程度可见一斑,接下来就让我们使用 Python 来做个简单的娱乐小游戏吧。(想领取更多完整源码或Python学习资料可私信我01获取)实现
  消消乐的构成主要包括三部分:游戏主体、计分器、计时器,下面来看一下具体实现。
  先来看一下游戏所需 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 = 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()
  看一下效果:
  说完了游戏图形化界面相关的部分,我们再看一下游戏的主要处理逻辑。
  我们通过鼠标来操纵拼图块,因此程序需要检查有无拼图块被选中,代码实现如下: 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 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
  每一次交换拼图块时,我们需要判断是否有连续一样的三个及以上拼图块,代码实现如下: 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.reward return self.reward return 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] = 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
  之后反复执行这个过程,直至耗尽游戏时间,游戏结束。
  最后,我们动态看一下游戏效果。
  end:
  这期小游戏就到这分享结束了~喜欢的友友们记得三连噢!家人们的支持是小编更新最大的动力~

去月球曾让无数猛男落泪,那么它的第3部续作是否依旧感动?去月球是自由鸟工作室旗下的著名作品,虽然画面和玩法较为简单,但它深刻的剧情曾感动了无数人。其实去月球是一个系列,系列中总共有三部曲,第二部名为寻找天堂,第三部就是我这次要介绍的影子NH斩获PGC总冠军,明明入选PGC最佳阵容,而KX却正式下班了一起来和小梦分享你的游戏日常!前言为期整整一个月的绝地求生PGC全球总决赛终于落下帷幕,在最后的冠军争夺战中NH以159的总分力压HERO,PCL赛区时隔三年再度夺冠,同时我们还实继太大之后,太强也被打上了辱印的标签宗教的问题总是比我们想的要复杂。注意本文轻微涉及真女神转生5剧透,请谨慎阅读。真女神转生5是我在今年里玩到最好的日式RPG。虽然在刚刚过去的TGA上,它没能打败隔壁南梦宫花费重金打国产手游厉害了,奥斯卡最佳艺术指导亲自动手,把时装复刻到现实对于游戏时装,相信是不少玩家的心头爱,平时玩游戏时,想方设法都要弄一套漂亮的时装穿在身上。甚至有些狂热爱好者,还会自己动手,将游戏中比较好看的时装复刻到现实之中来穿在身上,可见大家ampampquot网易腾讯!ampampquot黑豚战队从败者组一穿六夺得首届小TI冠军在昨日结束的,由斗鱼主播Zard发起的首届互联网大厂DOTA2友谊赛上,网易黑豚战队从败者组一穿五杀回决赛,最终以30的比分拿下此前未尝一败的腾讯小企鹅战队,夺得首届小TI冠军。参Steam一周大事件SteamDeck被黄牛疯炒,512GB也能卖出上万块GTA还没出6,G胖仍未数3,大家好我是游戏日报小Y。欢迎收看本期的Steam一周大事件栏目!SteamDeck有望明年2月份发货,黄牛价炒至上万作为V社旗下又一款备受期待的硬件设打造您梦想中的主题公园,设计令人惊奇的过山车公园。过山车之星游戏简介过山车之星是FrontierDevelopments打造推出的一款全新模拟游戏。相信很多玩家在游乐园都留下过美好的回忆,同时也拥有一个将游乐园搬回家的梦想。虽然我们不能真的世界观补全只能靠主线?幻塔就连武器都有专属剧情世界观是支撑一款游戏的根本,很多游戏都是通过主线剧情的推进来补全世界观。这样的做法有一个弊端,那就是当玩家推完主线之后,只能苦等下一次的剧情更新。为了避免出现这种空窗期,不少游戏也画质全面升级,战舰世界全新版本上线近日,战舰世界开启全球同步上新0。10。11版本的消息一度刷屏了游戏圈。可能有许多小伙伴会感觉到有些奇怪,战舰世界是什么类型的游戏?出众的点在哪?为什么之前没听过?今天就由小编为大2021CEO大会丨JoyPacCEOMark草木皆兵打造休闲游戏百万日活JoyPac是一家致力于将海外精品游戏引入中国及亚太市场并打造全球热门游戏的移动游戏发行商,专业团队分布于哥本哈根与北京。由JoyPac发行的豆腐女孩神回避系列躲猫猫等游戏全都成为无主之地3魔女如何配装?利刃之怒魔女配装介绍无主之地3魔女如何配装?许多小伙伴不知道魔女该如何配装,利刃之怒配装厉不厉害。下面小编就带来无主之地3利刃之怒魔女配装介绍,一起来看看吧。无主之地3利刃之怒魔女配装介绍技能加点武器
王者荣耀露露削弱,打野榜群龙无首,这5位英雄有望成新野王大家好,我是秋豆。S25赛季打野刀可以蹭线,发育速度加快,S25赛季可以说就是刺客的版本。然而随着最后的荣光娜可露露的削弱,打野榜的T0已经全部阵亡。回看公认最强的澜和镜,现在的胜MLXG我直播效果难改,不想当娱乐主播,我打游戏还是不摆的前言其实大家都知道,职业选手退役后通常走的路都会是直播行业,因为他们在打职业期间就积累了不少的粉丝,那么再去开直播就会比一般的主播更受欢迎。而MLXG就是一名从职业选手转型主播的一和平精英全球总决赛槽点多,INFIN选手单局狂搜26个大包和平精英全球总决赛PMGC在北京时间2021年11月30日12月24日火热开战。四十支来自世界各地的最强和平精英职业战队齐聚一堂争夺冠军。届时整场比赛将会在虎牙实时直播,上虎牙看2猫射手加点攻略猫射手是一款好玩又有趣的射击游戏,游戏采用的是闯关制的玩法,玩家将以一个猫咪的视角去进行游戏,游戏的目标也很简单,只要用弓箭将天空中的小鸟全部射下来就可以了,否则它们就会来破坏你的杀戮地城种族词条目前游戏有200词条组合,其中有技能专属词条和通用词条和boss专属词条,boss专属词条玩家很难获得,技能专属词条只能再使用相应的技能才能触发,通用词条可以任意技能和状态触发。下三国杀孙邵或将成为斗地主T1级别农民?全面既是巅峰小伙伴们大家好,欢迎来到深渊三国杀!最近打三国杀的时候我突然发现了一个非常强的精品武将孙邵,要说孙邵这个武将也是历经磨难才来到了正式服,就光是在测试服中都改动了三次才让官方满意,不HTD链游首发抹茶,表现极佳链游王者板块天花板DEE来袭HeroesTD是一款基于区块链的PlaytoEarn游戏,玩家可以召唤英雄来攻击敌人的基地并保卫他们的基地。有两种类型的英雄基本英雄和NFT英雄。初级英雄是在游戏开始时给予玩家体当年玩星际争霸的美好回忆,英语不及格,偏偏秘籍记得很牢靠记得在九十年代末期,整个电脑房几乎全都是在玩星际争霸的。那时候大部分玩家都是通过局域网联机的,而玩单机练操作的人更是不在少数。九十年代末期那会儿,没有营业执照的黑网吧比比皆是,而我爆料育碧35周年活动免费游戏会是纪元1404据Mydealz的爆料消息,育碧35周年活动将会送出的免费游戏是纪元1404历史版。免费领取时间为12月6日周一1600至12月14日周二1500。Anno1404及其扩展包威尼斯游戏王卡图故事被封印的黑暗大法师如何打破封印,化身为死灵?在很久很久以前,天地间有一位召唤神,名字叫做艾克佐迪亚。其拥有着无法匹敌的力量,可以说是世间最高最强的存在之一。但是这位神并非正义的使者,而是一位魔神。人们畏惧他的力量,同时又渴望嘉宾阵容强大,揭开战舰世界日的神秘面纱战舰世界作为一款模拟海上战争游戏,一直深受广大玩家的喜欢,在这里面我们可以亲自驾驶军舰,指挥舰队进行作战,真正体验战火纷飞的感觉,是体验感极强的海战类游戏。为了提升玩家们与日俱增的