自学一周python做的一个小游戏《大球吃小球》
需求
1,显示一个窗口。
2,我们要做到的功能有鼠标点击屏幕生成小球。
3,生成的小球大小随机,颜色随机,向随机方向移动,速度也随机。
4,大的球碰到小球时可以吃掉小球,吃掉后会变大。
5,球碰到边界会弹回去。
思路
思路很简单
1,这个游戏我们使用python的pygame,先生成一个带有背景颜色固定大小的窗口
2,建一个颜色类,用来生成随机颜色
3,建一个球类用于生成随机的各样小球
4,建主方法,调用颜色和球生成小游戏
5,打包
第一步 生成窗口
我们需要导入pygame模块,如果你用的是PyCharm的话点击下面这个代码,PyCharm会自动下载pygame模块
import pygame
如果你没用PyCharm的话就直接使用命令导入
pip install pygame
导入成功后我们建一个窗口对象
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption('大球吃小球')
screen.fill((224, 224, 224))
pygame.display.flip()
running = True
# 开启一个事件循环处理发生的事件
while running:
# 从消息队列中获取事件并对事件进行处理
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
800和600是窗口的长宽,大球吃小球是窗口的标题,(224,224,224)代表窗口颜色是RGB格式的颜色表达式下面是用来监听事件的后面会用到,现在开始运行
if __name__=="__main__":
main()

很好,现在第一步完成了
第二步 建一个颜色类
@unique
class Color(Enum):
red = (255, 0, 0)
@staticmethod
def random_color():
"""获得随机颜色"""
r = randint(0, 255)
g = randint(0, 255)
b = randint(0, 255)
return r, g, b
颜色类,比较简单,生成三个随机值就是一个随机的颜色了,这也就是刚才上面说的RGB值
第三步 球类
球类复杂一些,需要传入位置坐标,半径,移动距离和颜色
还要有吃,移动,和生成三个方法。代码如下
class Ball():
def __init__(self, x, y, reduis, sx, sy, color=Color.red):
self._sy = sy
self._x = x
self._y = y
self._reduis = reduis
self._sx = sx
self._color = color
self._alive = True
def move(self, screen):
self._x += self._sx
self._y += self._sy
if self._x - self._reduis <= 0 or self._x + self._reduis >= screen.get_width():
self._sx = -self._sx
if self._y - self._reduis <= 0 or self._y + self._reduis >= screen.get_height():
self._sy = -self._sy
def eat(self, other):
if self._alive and other._alive and other != self:
dx = self._x - other._x
dy = self._y - other._y
distance = sqrt(dx ** 2 + dy ** 2)
print(distance)
if distance < int(self._reduis) + int(other._reduis) and int(self._reduis) > int(other._reduis):
other._alive = False
self._reduis = self._reduis + int(other._reduis * 0.146)
def draw(self, screen):
pygame.draw.circle(screen, self._color, (self._x, self._y), self._reduis, 0)
移动和吃这两个方法的逻辑不难,我就不在这说了,不懂的可以在面评论或私信。关于属性在init里有个alive存活代表这小球是否存活的属性,需要大家注意
我就说下生成draw这个方法吧
circle这个方法的参数分别是screen窗口对象,颜色,球的坐标,球的半径,和是否填充
第四步 在主方法里调用并编写点击生成和反弹方法
代码如下:
balls = [] #
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption('大球吃小球')
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:#
x, y = event.pos#
radius = randint(10, 100)#
if x - radius < 0:#
x = radius#
if y - radius < 0:#
y = radius#
sx, sy = randint(-10, 10), randint(-10, 10)#
color = Color.random_color()#
ball = Ball(x, y, radius, sx, sy, color)#
# 将球添加到列表容器中
balls.append(ball)#
screen.fill((224, 224, 224))#
for ball in balls:#
if ball._alive:#
ball.draw(screen)#
else:#
balls.remove(ball)#
pygame.display.flip()
pygame.time.delay(50)#
for ball in balls:#
ball.move(screen)#
# 检查球有没有吃到其他的球
for other in balls:#
ball.eat(other)#
我在更改代码的部分后面加了#,表示区分
首先我们声明一个balls用来做装球的容器,然后在事件监听部分加上对鼠标点击事件的监听ifx-radius是为了防止在界面边缘点击时生成的球超出边界,然后将生成的球的对象放入容器balls里遍历容器,判断是否存活,若存活则生成,若已死则移除容器。
将窗口设置为50毫秒刷新一次,最后再次遍历判断球有没有吃其他球,现在运行。
大家可以看到效果已经出来了,现在还差最后一步。打包
打包
打包工具我用的是Pyinstaller需要先安装一下
pip install Pyinstaller
然后打开pycharm底部的terminal面板输入
pyinstaller -F xyx.py
回车就行了
如果没有pycharm的话就在命令窗口进入到项目目录下,再输入这个命令回车就行了,找到dist的exe双击就运行了
自学一周python做的一个小游戏《大球吃小球》的更多相关文章
- 用Unity做的一个小游戏,仿照一个样例写的,个人认为文章写的不错,哈哈
- 这几天有django和python做了一个多用户博客系统(可选择模板)
这几天有django和python做了一个多用户博客系统(可选择模板) 没完成,先分享下 断断续续2周时间吧,用django做了一个多用户博客系统,现在还没有做完,做分享下,以后等完善了再慢慢说 做的 ...
- FMX相当于在界面上自己又做了一个小操作系统
FMX的自画界面我也不看好,比如复制粘贴,太丑了,系统做得很好很精细的复制粘贴界面,就是无法调出,比如MIUI,复制粘贴还能有个放大镜,可以选择到屏幕边缘的文字,可以选择剪贴板内多个可粘贴的文字:还有 ...
- 使用PixiJS做一个小游戏
PixiJS PixiJS使用WebGL,是一个超快的HTML5 2D渲染引擎.作为一个Javascript的2D渲染器,Pixi.js的目标是提供一个快速的.轻量级而且是兼任所有设备的2D库. 官方 ...
- Pygame:编写一个小游戏 标签: pythonpygame游戏 2017-06-20 15:06 103人阅读 评论(0)
大学最后的考试终于结束了,迎来了暑假和大四的漫长的"自由"假期.当然要自己好好"玩玩"了. 我最近在学习Python,本意是在机器学习深度学习上使用Python ...
- python【控制台】小游戏--贪吃蛇
传统贪吃蛇相信大家都玩过,也是一款很老很经典的游戏,今天我们用python控制台实现 项目有很多bug没有解决,因为本人一时兴起写的一个小游戏,所以只是实现可玩部分功能,并没有花较多的时间和精力去维护 ...
- 手摸手教你如何在 Python 编码中做到小细节大优化
手摸手教你如何在 Python 编码中做到小细节大优化 在列表里计数 """ 在列表里计数,使用 Python 原生函数计数要快很多,所以尽量使用原生函数来计算. &qu ...
- DirectX游戏开发——从一个小游戏開始
本系列文章由birdlove1987编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/26364129 写在前面:自 ...
- js实现一个小游戏(飞翔的jj)
js实现一个小游戏(飞翔的jj) 源代码+素材图片在我的仓库 <!DOCTYPE html> <html lang="en"> <head> & ...
- Scratch 简单的小游戏 --- 碰碰球
Scratch 简单的小游戏 --- 碰碰球 ================================ 积木脚本块的简要分类: 1. 角色 2. 背景 3. 角色和背景组成的场景 4. 挡板角 ...
随机推荐
- GPT3的技术突破:实现更精准的语义分析
目录 2. 技术原理及概念 3. 实现步骤与流程 4. 应用示例与代码实现讲解 5. 优化与改进 6. 结论与展望 7. 附录:常见问题与解答 GPT-3技术突破:实现更精准的语义分析 近年来,人工智 ...
- 如何使用 Terraform 和 Git 分支有效管理多环境?
作者|Sumeet Ninawe 翻译|Seal软件 链接|https://spacelift.io/blog/terraform-environments 通常我们使用 Terraform 将我们的 ...
- JAVA生成xml文件格式
摘要: 1.在某些业务中需要使用JAVA按照规定生成固定XML格式文件,本文中根据相应的业务生成固定的XML格式文件,并且通过测试可以发送. 2.下面代码根绝dom4j生成xml格式文件 代码思路: ...
- 【调制解调】ISB 独立边带调幅
说明 学习数字信号处理算法时整理的学习笔记.同系列文章目录可见 <DSP 学习之路>目录,代码已上传到 Github - ModulationAndDemodulation.本篇介绍 IS ...
- 解决php中通过exec调用python脚本报ModuleNotFoundError错误
背景 出于某些原因,我们有时会在PHP中通过exec来调用Python代码,有可能是某些功能只能用Python实现(或用Python实现比较方便),有可能是出于性能考虑(Python可以执行耗时任务) ...
- Go 匿名返回值的坑——这道题据说 90% 的同学都答错了!
今天分享的内容比较基础,准确地说是 Go 的语言特性--命名.匿名返回值. 先看下面的例子,猜测会输出什么? package main func main() { println(A()) print ...
- Redis的设计与实现(1)-SDS简单动态字符串
现在在高铁上, 赶着春节回家过年, 无座站票, 电脑只能放行李架上, 面对着行李架撸键盘--看过<Redis的设计与实现>这本书, 突然想起, 便整理下SDS的内容, 相对后面的章节, 算 ...
- vue基本操作[2] 续更----让世界感知你的存在
Vue文件解析 什么是<template/>标签 template是html5新元素,主要用于保存客户端中的内容,表现为浏览器解析该内容但不渲染出来,可以将一个模板视为正在被存储以供随后在 ...
- IDEA: 菜单栏消失的解决办法
解决方案 步骤一 双击shift输入View,点击第一个 步骤二如图所示 至此问题解决
- Canvas好难,如何让研发低成本实现Web端流程图设计功能
摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 相信大家在职场中经常会用到流程图,在互联网行业,绘制流程 ...