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

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

Nike已经原谅LPL,春季赛的抵制,看起来更像一个笑话文筱文聊电竞随着季中赛MSI以RNG的夺冠结束,LPL夏季赛也是即将开赛众所周知的在春季赛因为新疆棉花事件,LPL官方宣布和Nike结束合作关系,并且连夜做出新海报,与Nike彻底英雄联盟国外媒体评选S11战队战力排名,EDGFPX携手步入S级文筱文聊电竞随着最近WE战队卖票工作的结束,LPL参赛全球总决赛四支战队都已经确定,1号种子EDG2号种子FPX3号种子RNG和4号种子LNG。于此同时,其他赛区的夏季赛也基本都结鬼泣巅峰之战全平台公测今日正式开启CAPCOM殿堂级动作IP授权手游鬼泣巅峰之战正式宣布,全平台公测今日火热开启,现在前往各大安卓应用商店均可进行游戏下载!三年开发,不负期待,享誉世界的动作游戏天花板鬼泣系列强势登英雄联盟渴血战斧小幅重做,移除怨恨新增全能吸血文筱文聊电竞玩上单的小伙伴对渴血战斧肯定非常熟悉,由于过于强势,渴血死舞血手的标配都被号称真实的肉,板甲蓝盾及绿甲等坦克装备反而被称为虚假的肉。经常看到一个残血的剑魔被冲到人堆主动RNG夺得MSI冠军,GALA是最大功臣,但其实原神也功不可没文筱文聊电竞恭喜RNG获得MSI冠军,虽然这场雨的颜色有点怪,不是玩家想象中的那场金色的雨,这也是LPL时隔两年以后重新夺得季中赛冠军,上次MSI夺冠也是RNG,这次的MSI夺冠依云顶之弈S5。5赛季黑暗装备移除,新增光明装备,设计师脑袋真大文筱文聊电竞云顶之弈S5赛季主打的特色就是装备库系统,因而本赛季新增了黑暗装备,不过黑暗装备虽然强力,但是Debuff效果也是非常让人烦恼,也有玩家呼吁删除黑暗装备,捆绑销售让人很云顶之弈S5赛季结束,S5。5将于7月22上线,终于告别最无聊版本了文筱文聊电竞云顶之弈S5赛季,对于不同的人来说有不同的看法,有人认为这是最平衡的赛季,但也有人认为是非常无聊的赛季,反正筱文已经被这个赛季无聊到爆了,除了装备库的更新外,其实很多英王者荣耀日活量超1亿,LOL三千万都不到,KPL影响力差LPL九条街?文筱文聊电竞对于熟悉王者荣耀和英雄联盟的玩家来说,这两款游戏在很多方面都是相似的,英雄联盟是端游MOBA类游戏顶流,王者荣耀则是手游MOBA游戏的头牌。甚至王者荣耀的日均活跃量用户云顶之弈一篇通俗易懂的文章,带你玩转S5的新赛季文筱文聊的电竞云顶之弈S5赛季将在本月的29号更新,本赛季的主题是光名与黑暗,因此所有的阵容和羁绊都是围绕着这两个主题进行由于天选之人的缺席,S4赛季所有的游戏经验和玩法都可能不适又是最有希望的一年?MSI更改A组赛制,RNG要打18场B01文筱文聊电竞众所周知RNG拿到了本届LPL春季赛的冠军,代表着LPL参加本届MSI,但是由于A组的变化,VCS赛区由于某些特殊原因宣布放弃参加MSI,A组只剩下了三支队伍在缺少一只英雄联盟无限火力的隐藏改动,你的劫为何生命值那么低?文筱文聊电竞众所周知,本次无限火力移除了buff与Debuff的效果,所有英雄伤害和承受伤害强度与常规模式一样由此造成再也不会像之前的无限火力,就是战士渴血的天下。版本T0英雄也重
LOL新版本AD增强!KID谈野区改动野核废了猪妹崛起随着2020新年将至,拳头近日也终于公布了11。4新版本的改动内容,这也让许多玩家有了提前适应新版本的时间。不过让大家没想到的是,本以为新版本的主角是ADC,但最终却是打野这个位置RNG上野发力拒绝爆冷!青钢影踢晕前队友,西卡小虎永远的神随着春节假期即将结束,LPL春季赛也如期重新开启。经过一段时间的等待后,我们终于迎来了RNG战队年后的首场比赛。和其他战队不同,RNG年后的首个对手将是联赛垫底的RW战队。值得一提RNG史诗级翻盘战胜TES!卡萨连丢2龙心态崩了,笑笑功过相抵经过短暂的休息后,我们终于迎来了LPL春季赛的关键一战。虽然在上一场比赛遭到对手零封,但由于赛制改动,RNG和TES获得了打复活赛的机会,只要他们能够战胜对手,那么就有机会重新回到DK上路是突破口,爆冷不敌C9人气下降,RNG要夺冠全靠小虎?目前本届MSI首轮小组赛已经全部结束,晋级下一轮的队伍也已经全部产生。作为两个最强赛区出来的队伍,DK和RNG自然进入了次轮。不过虽然两支队伍都顺利晋级,但他们的表现还是引起了玩家玩游戏输了心态不好摔手机,一年换了三个手机,我该怎么办?这是一个很复杂的过程,跟个人性格和心态有很大关系,个人认为就两个方法转移注意力或者不要把结果看的太重,你越看得重越在乎,对你的影响就越大,心态放平和,毕竟游戏不是你生活的全部,转移列王的纷争你不适合玩游戏!之前我也和大家说过,亮哥这个人虽然说情商不低,但是他的游戏智商真的不高。如果说他把所有号都移过来集合向我发起进攻,那我未必能打过他们。毕竟他的那个22级城堡之中有十多万的八级兵。但这3位坦克就算不出攻击装,一样输出爆炸,榜首自带600多点攻击力在王者荣耀之中有很多输出强大的坦克英雄,他们就算不用出攻击装备一样输出爆炸,可以说非常的变态无解。有的朋友可能会不相信,认为不出攻击装备,怎么可能打出伤害呢?今天我就和大家说三个坦王者荣耀这3位英雄没有星耀实力不要碰,榜首自带600攻击力本文只代表个人观点前言在王者荣耀之中,有很多英雄看起来简单,但实际操作并没有那么容易。如果你没有星耀以上的真实实力,贸然使用这些英雄,那肯定就是掉分的下场。第一个要和大家说的就是吕在游戏里开公交,不如来战舰世界开军舰,不能错过的军武佳作模拟经营游戏一直是休闲玩家们的最爱,在此类游戏中玩家可以尝试各种不同的职业来体验不一样的人生选择。最近就有一款担任大巴车司机的模拟游戏Thebus上线steam受到了众多玩家的喜爱惊掉你下巴的脑洞游戏!吃鸡坦克,很有搞头曾几何时,我们突然发现大家玩的游戏突然一夜之间都变成了含有吃鸡元素或者吃鸡模式的游戏,而且这个趋势有愈演愈烈之势。回顾一下近几年的游戏热榜,我们发现从2017年到2021年,游戏圈什么?今年ChinaJoy的爆款游戏竟然是坦克世界?不得不说,今年的ChinaJoy嘉年华真的是盛况空前。这次ChinaJoy展会共使用了上海新国际博览中心12。5个场馆,展区总面积达到了15。6万平方米。最为火爆的BOTC展区有3