python简单代码游戏
- 游戏信息
- 发布时间:2025-06-20 04:29:32
Python实现消消乐小游戏
pre{overflow-x:auto}实现消消乐的构成主要包括三部分:游戏主体、计分器、计时器,下面来看一下具体实现。
先来看一下游戏所需Python库。
import?osimport?sysimport?timeimport?pygameimport?random
定义一些常量,比如:窗口宽高、网格行列数等,代码如下:
WIDTH?=?400HEIGHT?=?400NUMGRID?=?8GRIDSIZE?=?36XMARGIN?=?(WIDTH?-?GRIDSIZE?*?NUMGRID)?//?2YMARGIN?=?(HEIGHT?-?GRIDSIZE?*?NUMGRID)?//?2ROOTDIR?=?os.getcwd()FPS?=?30
接着创建一个主窗口,代码如下:
pygame.init()screen?=?pygame.display.set_mode((WIDTH,?HEIGHT))pygame.display.set_caption('消消乐')
看一下效果:
再接着在窗口中画一个8x8的网格,代码如下:
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??-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]?=?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实现了一个简单的消消乐游戏,有兴趣的可以对游戏做进一步扩展,比如增加关卡等。
到此这篇关于Python实现消消乐小游戏的文章就介绍到这了,希望大家以后多多支持!
python可以玩哪些小游戏?
ant蚂蚁2.bagels百吉饼另外贪吃蛇,吃豆子都是可以的,直接代码就可以玩。
Python包括随您的安装一起分发的大量标准库。标准库有一个称为Turtle的模块,这是一种向普通人介绍python编程的流行方法。今天介绍的所有游戏都是使用Python及其Turtle模块实现的。
每个游戏都完全独立于其他游戏,不试一试您永远都不知道最喜欢哪种游戏。
安装完之后我们可以使用"python-mfreegameslist"来查看所有的游戏
贪吃蛇
贪吃蛇-经典街机游戏。使用箭头键导航并吃绿色食品。每次食用食物,蛇就会长出一段。避免自己进食或出界!
吃豆子
吃豆子–经典街机游戏。使用箭头键导航并吃掉所有白色食物。提防漫游迷宫的红色幽灵。
Flappy
Flappy-bird启发游戏。单击屏幕拍打翅膀。当您飞越屏幕时,请当心黑乌鸦。
加农炮
大炮-射击运动。单击屏幕发射您的炮弹。炮弹在其路径中弹出蓝色气球。弹出所有气球,然后才能越过屏幕。
求个Python小游戏浅浅的笑着:“我会带着你的孩子,
顚节进入
Python程序开发之简单小程序实例(11)小游戏-跳动的小球一、项目功能用户控制挡板来阻挡跳动的小球。二、项目分析根据项目功能自定义两个类,一个用于控制小球在窗体中的运动,一个用于接收用户按下左右键时,挡板在窗体中的运动。在控制小球的类中,我们还需要考虑当小球下降时,碰到挡板时的位置判断。三、程序源代码源码部分截图:源码:#!/usr/bin/python3.6#-*-coding:GBK-*-#导入相应模块fromtkinterimport*importrandomimporttime#自定义小球的类BallclassBall:#初始化def__init__(self,canvas,paddle,color):#传递画布值self.canvas=canvas#传递挡板值self.paddle=paddle#画圆并且保存其IDself.id=canvas.create_oval(10,10,25,25,fill=color)self.canvas.move(self.id,245,100)#小球的水平位置起始列表start=[-3,-2,-1,1,2,3]#随机化位置列表random.shuffle(start)self.x=start[0]self.y=-2self.canvas_heigh=self.canvas.winfo_height()#获取窗口高度并保存self.canvas_width=self.canvas.winfo_width()#根据参数值绘制小球defdraw(self):self.canvas.move(self.id,self.x,self.y)pos=self.canvas.coords(self.id)#返回相应ID代表的图形的当前坐标(左上角和右上角坐标)#使得小球不会超出窗口pad=self.canvas.coords(self.paddle.id)#获取小球挡板的坐标ifpos[1]=self.canvas_heighor(pos[3]=pad[1]andpos[2]=pad[0]andpos[2]
Python游戏开发,Python实现贪吃蛇小游戏与吃豆豆附带源码Python版本:3.6.4
相关模块:
pygame模块;
以及一些Python自带的模块。
安装Python并添加到环境变量,pip安装需要的相关模块即可。
贪吃蛇的游戏规则应该不需要我多做介绍了吧T_T。写个贪吃蛇游戏其实还是很简单的。首先,我们进行一下游戏初始化:
然后定义一个贪吃蛇类:
其中head_coord用来记录蛇头所在位置,而tail_coords是一个二维数组,用来记录所有蛇身的位置。一开始,贪吃蛇长为3,并且位置是随机生成的。用户通过键来控制贪吃蛇的行动:
需要注意的是,贪吃蛇不能180大拐弯,只能90地拐弯。例如正在向左行动的贪吃蛇不能瞬间变成向右行动。具体而言,代码实现如下:
然后,我们需要随机生成一个食物,且需要保证该食物的位置不与贪吃蛇的位置相同:
在更新贪吃蛇的时候,如果它吃到了食物,则蛇身长加一,否则只是简单的按照给定的方向行动而不改变蛇身长度:
同时,当贪吃蛇吃到食物时,需要重新生成一个新的食物:
最后,当贪吃蛇碰到墙壁或者蛇头碰到蛇身时,游戏结束:
并显示一下游戏结束界面:
玩家通过键控制游戏的主角吃豆人吃掉藏在迷宫内的所有豆子,并且不能被鬼魂抓到。
若能顺利吃完迷宫内的所有豆子并且不被鬼魂抓到,则游戏胜利,否则游戏失败。
逐步实现:
Step1:定义游戏精灵类
首先,让我们先来明确一下该游戏需要哪些游戏精灵类。
①墙类
②食物类(即豆豆)
③角色类
角色类包括吃豆人和鬼魂,鬼魂由电脑控制其运动轨迹,吃豆人由玩家控制其运动轨迹。
显然,其均需具备更新角色位置和改变角色运动方向的能力,其源代码如下:
Step2:设计游戏地图
利用Step1中定义的游戏精灵类,我们就可以开始设计游戏地图了。由于时间有限,我只写了一个关卡的游戏地图,有兴趣的小伙伴可以在此基础上进行扩展(在我的源代码基础上进行扩展是很方便滴~)。游戏地图的设计包括以下四方面内容:
①创建墙
②创建门(一开始关幽灵用的)
image.gif
③创建角色
④创建食物
因为食物不能和墙、门以及角色的位置重叠,所以为了方便设计游戏地图,要先创建完墙、门以及角色后再创建食物:
Step3:设计游戏主循环
接下来开始设计游戏主循环。首先是初始化:
然后定义主函数:
其中startLevelGame函数用于开始某一关游戏,其源代码如下:
showText函数用于在游戏结束或关卡切换时在游戏界面中显示提示性文字,其源代码如下:
多重随机标签
原神解除炮闩的保险机怎么解除 魔兽世界复仇军监牢钥匙哪里刷 马尔代夫怎么选岛屿阿雅达岛攻略 选岛工具 动物融合模拟器化石有什么用 王者荣耀上分必选哪些英雄 最强王者上分英雄推荐 黑色沙漠台服 装备耐久度为0就不能用了么 王者荣耀2021年7月蔷薇珍宝阁会开启么暑期蔷薇珍宝阁什么时候开启 二战时轴心国和同盟国有什么区别 中国远古文明有什么特点呢 熊出没之熊大快跑海盗熊角色属性技能详解图手游攻略游戏鸟手游网 怎样打雷伊 贪婪洞窟2摸金流怎么玩 摸金流攻略大全高手进阶安族网 三国之刃过关斩将中守城大将怎么打 通关技巧分享 魔兽世界50级部落战士练级路线 荒野大镖客2亚瑟结局影响因素有哪些 亚瑟结局影响因素和全结局介绍 王者荣耀s16孙尚香黑切流玩法详解 祖玛我想玩后面的关卡 怎么调 炉石传说佣兵模式攻略 佣兵模式规则详解新手攻略安族网 数码宝贝类游戏 数码宝贝类游戏锦集 地铁连线游戏叫什么名字 半决赛郑钦文几点开始 蜀山镇魂曲坐骑怎么获得 坐骑培养完全指南 steam上的titan quest anniversary edition 黑屏闪退之前还好好的更新以后就有问题了win7操作系统 鬼谷八荒李四来也逆天改命效果介绍 实战效果怎么样 云顶之弈s8幻灵薇恩阵容攻略 2019年爱尔兰五年签证怎么办 黑暗之魂银骑士的枪可以杀鬼魂吗 有谁可以把自己平时所听的音乐 给我分享分享 诛仙3开游仙录可以换多少个昭武碎片 魔兽世界里面最经典是哪个副本