python简单代码游戏(python入门游戏代码)
Python程序开发之简单小程序实例(11)小游戏-跳动的小球
Python程序开发之简单小程序实例
(11)小 游戏 -跳动的小球
一、项目功能
用户控制挡板来阻挡跳动的小球。
二、项目分析
根据项目功能自定义两个类,一个用于控制小球在窗体中的运动,一个用于接收用户按下左右键时,挡板在窗体中的运动。在控制小球的类中,我们还需要考虑当小球下降时,碰到挡板时的位置判断。
三、程序源代码
源码部分截图:
源码:
#!/usr/bin/python3.6
# -*- coding: GBK -*-
#导入相应模块
from tkinter import *
import random
import time
#自定义小球的类 Ball
class Ball:
# 初始化
def __init__(self,canvas,paddle,color):
#传递画布值
self.canvas=canvas
#传递挡板值
self.paddle=paddle
#画圆并且保存其ID
self.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=-2
self.canvas_heigh=self.canvas.winfo_height()#获取窗口高度并保存
self.canvas_width=self.canvas.winfo_width()
#根据参数值绘制小球
def draw(self):
self.canvas.move(self.id,self.x,self.y)
pos=self.canvas.coords(self.id)#返回相应ID代表的图形的当前坐标(左上角和右上角坐标)
#使得小球不会超出窗口
pad=self.canvas.coords(self.paddle.id)#获取小球挡板的坐标
if pos[1]=self.canvas_heigh or(pos[3]=pad[1] and pos[2]=pad[0] and pos[2]
6 个值得玩味的 Python 代码
先选取了 6 个自己认为值得玩味的 python代码,希望对正在学习 python 的你有所帮助。
1、类有两个方法,一个是 new,一个是 init,有什么区别,哪个会先执行呢?
运行结果如下:
再来看另一个例子
运行结果如下:
这里给出官方的解释: init 作用是类实例进行初始化,第一个参数为 self,代表对象本身,可以没有返回值。 new 则是返回一个新的类的实例,第一个参数是 cls 代表该类本身,必须有返回值。很明显,类先实例化才能产能对象,显然是 new 先执行,然后再 init ,实际上,只要 new 返回的是类本身的实例,它会自动调用 init 进行初始化。但是有例外,如果 new 返回的是其他类的实例,则它不会调用当前类的 init 。下面我们分别输出下对象 a 和对象 b 的类型:
可以看出,a 是 test 类的一个对象,而 b 就是 object 的对象。
2、map 函数返回的对象
map()函数第一个参数是 fun,第二个参数是一般是 list,第三个参数可以写 list,也可以不写,作用就是对列表中 list 的每个元素顺序调用函数 fun 。
有没有发现,第二次输出 b 中的元素时,发现变成空了。原因是 map() 函数返回的是一个迭代器,并用对返回结果使用了 yield,这样做的目的在于节省内存。 举个例子:
执行结果为:
这里如果不用 yield,那么在列表中的元素非常大时,将会全部装入内存,这是非常浪费内存的,同时也会降低效率。
3、正则表达式中 compile 是否多此一举?
比如现在有个需求,对于文本 中国 ,用正则匹配出标签里面的“中国”,其中 class 的类名是不确定的。有两种方法,代码如下:
这里为什么要用 compile 多写两行代码呢? 原因是 compile 将正则表达式编译成一个对象,加快速度,并重复使用。
4、[[1,2],[3,4],[5,6]]一行代码展开该列表,得出[1,2,3,4,5,6]
5、一行代码将字符串 "-" 插入到 "abcdefg"中每个字符的中间
这里也建议多使用 os.path.join() 来拼接操作系统的文件路径。
6、zip 函数
zip() 函数在运算时,会以一个或多个序列(可迭代对象)做为参数,返回一个元组的列表。同时将这些序列中并排的元素配对。zip() 参数可以接受任何类型的序列,同时也可以有两个以上的参数;当传入参数的长度不同时,zip 能自动以最短序列长度为准进行截取,获得元组。
Python实现消消乐小游戏
pre{overflow-x: auto} 实现 消消乐的构成主要包括三部分:游戏主体、计分器、计时器,下面来看一下具体实现。
先来看一下游戏所需 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??-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]?=?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
之后反复执行这个过程,直至耗尽游戏时间,游戏结束。
最后,我们动态看一下游戏效果。
总结
本文我们使用 Python 实现了一个简单的消消乐游戏,有兴趣的可以对游戏做进一步扩展,比如增加关卡等。
到此这篇关于Python实现消消乐小游戏的文章就介绍到这了,希望大家以后多多支持!
花了2万多买的Python70个项目,现在分享给大家,练手进厂靠它了
前言:
不管学习哪门语言都希望能做出实际的东西来,这个实际的东西当然就是项目啦,不用多说大家都知道学编程语言一定要做项目才行。
这里整理了70个Python实战项目列表,都有完整且详细的教程,你可以从中选择自己想做的项目进行参考学习练手,你也可以从中寻找灵感去做自己的项目。
1、【Python 图片转字符画】
2、【200行Python代码实现2048】
3、【Python3 实现火车票查询工具】
4、【高德API+Python解决租房问题 】
5、【Python3 色情图片识别】
6、【Python 破解验证码】
7、【Python实现简单的Web服务器】
8、【pygame开发打飞机 游戏 】
9、【Django 搭建简易博客】
10、【Python基于共现提取《釜山行》人物关系】
11、【基于scrapy爬虫的天气数据采集(python)】
12、【Flask 开发轻博客】
13、【Python3 图片隐写术】
14、【Python 实现简易 Shell】
15、【使用 Python 解数学方程】
16、【PyQt 实现简易浏览器】
17、【神经网络实现手写字符识别系统 】
18、【Python 实现简单画板】
19、【Python实现3D建模工具】
20、【NBA常规赛结果预测——利用Python进行比赛数据分析】
21、【神经网络实现人脸识别任务】
22、【Python文本解析器】
23、【Python3 OpenCV 视频转字符动画】
24、【Python3 实现淘女郎照片爬虫 】
25、【Python3实现简单的FTP认证服务器】
26、【基于 Flask 与 MySQL 实现番剧推荐系统】
27、【Python 实现端口扫描器】
28、【使用 Python 3 编写系列实用脚本】
29、【Python 实现康威生命 游戏 】
30、【川普撞脸希拉里(基于 OpenCV 的面部特征交换) 】
31、【Python 3 实现 Markdown 解析器】
32、【Python 气象数据分析 -- 《Python 数据分析实战》】
33、【Python实现键值数据库】
34、【k-近邻算法实现手写数字识别系统】
35、【ebay在线拍卖数据分析】
36、【Python 实现英文新闻摘要自动提取 】
37、【Python实现简易局域网视频聊天工具】
38、【基于 Flask 及爬虫实现微信 娱乐 机器人】
39、【Python实现Python解释器】
40、【Python3基于Scapy实现DDos】
41、【Python 实现密码强度检测器】
42、【使用 Python 实现深度神经网络】
43、【Python实现从excel读取数据并绘制成精美图像】
44、【人机对战初体验:Python基于Pygame实现四子棋 游戏 】
45、【Python3 实现可控制肉鸡的反向Shell】
46、【Python打造漏洞扫描器 】
47、【Python应用马尔可夫链算法实现随机文本生成】
48、【数独 游戏 的Python实现与破解】
49、【使用Python定制词云】
50、【Python开发简单计算器】
51、【Python 实现 FTP 弱口令扫描器】
52、【Python实现Huffman编码解压缩文件】
53、【Python实现Zip文件的暴力破解 】
54、【Python3 智能裁切图片】
55、【Python实现网站模拟登陆】
56、【给Python3爬虫做一个界面.妹子图网实战】
57、【Python 3 实现图片转彩色字符】
58、【自联想器的 Python 实现】
59、【Python 实现简单滤镜】
60、【Flask 实现简单聊天室】
61、【基于PyQt5 实现地图中定位相片拍摄位置】
62、【Python实现模板引擎】
63、【Python实现遗传算法求解n-queens问题】
64、【Python3 实现命令行动态进度条】
65、【Python 获取挂号信息并邮件通知】
66、【Python实现java web项目远端自动化更新部署】
67、【使用 Python3 编写 Github 自动周报生成器】
68、【使用 Python 生成分形图片】
69、【Python 实现 Redis 异步客户端】
70、【Python 实现中文错别字高亮系统】
最后:
以上项目列表希望可以给你在Python学习中带来帮助~
获取方式:转发 私信“1”
python可以玩哪些小游戏?
ant 蚂蚁2. bagels 百吉饼另外贪吃蛇,吃豆子都是可以的,直接代码就可以玩。
Python包括随您的安装一起分发的大量标准库。标准库有一个称为Turtle的模块,这是一种向普通人介绍python编程的流行方法。今天介绍的所有游戏都是使用Python及其Turtle模块实现的。
每个游戏都完全独立于其他游戏,不试一试 您永远都不知道最喜欢哪种游戏。
安装完之后我们可以使用"python -m freegames list"来查看所有的游戏
贪吃蛇
贪吃蛇 -经典街机游戏。使用箭头键导航并吃绿色食品。每次食用食物,蛇就会长出一段。避免自己进食或出界!
吃豆子
吃豆子 –经典街机游戏。使用箭头键导航并吃掉所有白色食物。提防漫游迷宫的红色幽灵。
Flappy
Flappy-bird启发游戏。单击屏幕拍打翅膀。当您飞越屏幕时,请当心黑乌鸦。
加农炮
大炮-射击运动。单击屏幕发射您的炮弹。炮弹在其路径中弹出蓝色气球。弹出所有气球,然后才能越过屏幕。