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

小游戏合集之用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:
  这期小游戏就到这分享结束了~喜欢的友友们记得三连噢!家人们的支持是小编更新最大的动力~

说梦奇弱的玩家都要道歉,KPL首次出场,清清用他吊锤百兽马超KPL第三轮的比赛还在继续,这轮的S组比赛将争夺胜者组名额,所以每一个积分都非常重要,不过现在TTG手握极大优势,上一场击败DYG之后,下一场又击败佛山GK。TTG没有花太多功夫就五个中国人也能拿冠军,RNG击败DK证明自己,小虎创造了一个纪录MSI季中赛落下帷幕,如同比赛前预料的一样,RNG和DK决赛相遇,这是两支最强队伍的较量,同时也是两大赛区的较量,最终双方鏖战五场分出胜负,RNG最终捧起他们的第二个MSI冠军!在LPL变天了,S10四皇无缘S11世界赛,TES豪华阵容也白搭英雄联盟每个赛季的版本的都不一样,在版本的更替下,一些队伍衰落,一些队伍则崛起,比如S10进入世界赛的四皇在今年全都无缘季后赛,相反RNGEDGWE等队伍重新统治LPL。S10四皇IG新上单一战成名,小虎忍不住评价德杯对线打他没输IG夏季赛一开始就迎来不好的消息,Theshy因为疫情以及签证问题目前还没有回到基地,IG也没有说明他目前处于什么情况,要是因为签证问题还在韩国的话,IG常规赛将迎来很大的麻烦。由AG超玩会做不到事,eStar做到了,最后一轮横扫S组所有队伍KPL常规赛全部结束,胜者组队伍分别是eStarAG超玩会TTGHero久竞,这四支队伍的状态确实最好,他们也该进入胜者组决赛,相反佛山GKDYG稍差一些,不过没关系,也能进入季后不再避嫌,Uzi给RNG选手送礼物一个人一个藏宝图,毕竟夺了冠LPL夏季赛剩下不到一周就要开启,但RNG选手目前还在隔离状态,同时酒店也没有条件给他们训练,最近一段时间选手只能开播补补时长,并且玩玩娱乐局消磨时间,好在RNG第二周才有比赛,不RNGM还是放弃猫神了,转型辅助还不够,现在又将他挂牌RNGM春季赛表现糟糕2021年KPL有三个转会费超过千万的选手,分别是初晨清清猫神,前两位都成为各自队伍的大腿,把身价完全打了出来,猫神的表现则极其糟糕,甚至连出场的机会都没有,兮夜阿卡丽乱杀,表现完胜牙膏,JDG春季赛不让他上场太离谱JDG春季赛签约兮夜和大舅子,按理来说补足了阵容的短板,然而兮夜的到来不仅没有让JDG变强,反而出现水土不服的情况,最终兮夜被按在替补席,JDG也只拿到六强成绩。夏季赛开始后,JD对硬辅不公平,EDG出现BUG后,LCK宣布禁用海克斯闪现在LPL第二日比赛里,EDG终于出场,他们的对手则是BLG,EDG在落后一场的情况下连追两次取得胜利。虽然BLG春季赛更换了野辅,但实力还是跟EDG有所差距,要不是第一局金教练BP久哲BP碾压TTG,Hero久竞第五次进决赛,前四次都是冠军等待许久,KPL胜者组决赛终于开打,Hero久竞跟TTG争夺第一个决赛名额,赛前许多人都预测这场比赛将是龙争虎斗的画面,但结果却是Hero久竞轻松击败TTG率先进入决赛。按理来说进厂长要上场了?Uzi提前预热12号解说EDG和IG的比赛自从跟RNG分道扬镳后,Uzi就失去在直播间解说比赛的资格,虽然他可以借助其他主播直播间解说比赛,但也会被部分观众带节奏,为此Uzi也放弃了这个方法,不过最近Uzi似乎恢复了解说L
王者荣耀正式服7英雄调整,6英雄加强,公孙离削弱王者荣耀明天1214正式服要更新的内容,7英雄调整,6英雄加强,公孙离削弱,这些都是前段时间体验服的英雄调整内容,这里重新整理一下。公孙离(削弱),9号版本明天上线正式服,虽然王者王者荣耀张大仙XYG战队挺进四强,撕开了KPL混子战队的遮羞布王者荣耀超话导语万水千山总是情,各位小伙伴在右上角点点关注行不行。2021王者荣耀KPL秋季赛季后赛正在如火如荼进行中,这一次秋季赛,总冠军应该是最没有悬念的,不是重庆狼队就是武汉永劫发布会曝五大联动仙剑轩辕剑糖豆人李小龙影子武士国内游戏联动哪家强,还得看永劫无间!今晚(12月12日),人气竞技游戏永劫无间开启了咏武斗剑大会发布会,一口气在现场直播曝出了即将开启的五大联动活动,让不少玩家感叹少侠,好大的手笔暗黑2重制版圣骑士,小锤子玩转6BOSS圣骑士PAL一直有暴雪亲儿子之称,的确在很多设计上是有天生的优势。但作为一个新人玩家,只听这个亲儿子的称号就上手玩很有可能是和亲女儿法师一样,出不了地狱门口的。比如你选择的是双热玩志愿军狙击手四个月击毙上万人,海盗游戏ATLAS玩家苦练枪技狙击手目前已经成为现代军队的标配,活跃于各个战场。狙击手往往隐蔽在战场一角,不出手则已,一出手必杀,对敌方官兵,尤其是军官机枪手炮兵等高价值目标,造成巨大心理压力。在抗美援朝战争期身无分文还想闯荡江湖?没有上街讨口都已经是万幸了也许在我们的印象中,经常会有各种神仙眷侣或者浪荡侠客在江湖中游历,白衣翩翩锦衣华服,引来无数人艳羡,这种情况确实有,当要么是膏粱子弟,要么就是家族显赫,大多都是出去镀金的,在当时的传奇3手游传奇老玩家为什么爱去新区重新起号玩?许多传奇玩家都钟爱在新服拼了命升级去向往首个大boss,沃玛祖玛教主还有赤月BOSS便是这些人的目标。那为什么这么多传奇玩家疯狂于向往新服的首个大boss?听小编为你们慢慢地道来。未来世界丨喷射器僵尸又怎样,我自岿然不动在上周的评论中发现部分玩家还是被卡在了未来世界里既然这样戴夫即刻开始扫清障碍!未来世界第八天直接开整困难难度大由于僵尸种类繁杂所以植物的站位还是很重要的传送带提供的植物有以下几种激原神五郎值不值得抽?技能细节分析,不要为阿贝多抽五郎新角色五郎即将上线,由于其独特的技能设定被很多玩家称为岩系专辅,很多玩家都在考虑要不要入手?但其实,很多玩家对五郎是存在错误认知的,尤其是对五郎的E技能天赋1和命座效果有些先入为主大话西游2跨服魔王窟现状,成了代练和主播们的生意场每天一期大话,期期都有精彩,大家好,我是你们熟悉的小苏。魔王窟副本的出现,对于游戏的影响举足轻重,有了套装之后的玩法和之前完全不同。如今的游戏现状就是如此,不管你是普通玩家还是氪金走位流畅补兵稳定,用Reno7Pro英雄联盟手游限定版玩游戏太爽了对于国内的英雄联盟玩家来说,今年可以说是最为特殊的一年了。在这一年中,不仅出现了代表LPL的EDG战队成功击败DK,为中国再拿下一座英雄联盟世界赛的冠军,同时英雄联盟番剧双城之战的