Hotdog 热狗大战
HOTDOG CONFLICT
废话介绍 背景介绍
创作背景
19号磨磨蹭蹭地在重庆考完了雅思,终于有机会打开积灰已久的CSDN记录一下“代码人生"了哈哈哈。未来的一个月还要同时进行AP的学习,加油啊啊啊!
项目背景
这个项目是寒假参加“发现杯”前的复习项目,觉得还不错就想把它搬上来分享分享。
【声明】非原创,受小学时候玩的“金山打字通”接苹果游戏、和wsc吃热狗的启发
整体思路
- 准备工作(搭建环境,例如导入库、设置标题、窗框大小坐标等等)
- 设置处理事件类型
- 通过“类”的方式创造组件,并进行调用
- 后台处理
准备工作
导入库大家都应该很熟练,这里我们也很熟练地操作一下~
(玄武黑,感觉比简约白更高级炫酷欸哈哈哈,高光也很棒orz)
# coding:utf-8
import pygame
from pygame.locals import *
import time, random
import sys
import os
接下来的一步,创建窗口和设置标题我们在Time Management里面也见到过,这里不难也比较标准,不用过多进行思维上的理解。
值得一提的是,最后一行(255,255,255)表示的是边框的颜色,分别对应“红黄蓝”三原色的占比(此处代表白色),(0, 0, 0)的配比则是黑色。
# 初始化pygame环境
pygame.init()# 创建一个长宽分别为1300/700窗口
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (100, 25)
canvas = pygame.display.set_mode((1000, 625))
canvas.fill((255, 255, 255))
窗口标题的设置也很常规~
# 设置窗口标题
pygame.display.set_caption("热狗大战")
(哈哈哈说一句题外话,我真的好喜欢Markdown:)
在完成外框的设置之后,我们就要开始逐步传输图片了。我们事先会将图片储存在同级别的文件夹里,运用调动相对路径的方式将它们传输上去。
(如何区分相对路径和绝对路径呢?
绝对路径跟快递收货地址很像,就像是卫星定位一样,需要提供确切的位置。在电脑中的绝对路径就相当于“C盘 XXX文件夹”
而相对路径适用于描述某个相邻的事物,例如当你知道我的位置时,我通知你来到我的邻居家,你也能很方便清晰地找到它。)
# 加载图片
bg = pygame.image.load("images/bg.jpg")
h = pygame.image.load("images/hotdog.png")
player = pygame.image.load("images/hero.png")
end = pygame.image.load("images/end.jpg")
bullet_tip = pygame.image.load("images/bullet_tip.png")
time_tip = pygame.image.load("images/time_tip.png")
到此为止准备任务就到此结束啦,我们接下来进行事件处理类型的设置。
下一步是对用户操作动作的设置,例如如果按下了移动箭头的按键,程序会进行怎样的变化。用到的是比较简单的if-elif-else语句,所以也很便于理解~
# 处理事件
def handleEvent():for event in pygame.event.get(): # 循环出事件列表中的每个事件对象if event.type == QUIT: # 如果事件的类型是退出类型pygame.quit() # pygame游戏框的退出方法sys.exit() # 系统程序结束方法if event.type == KEYDOWN: # 如果事件类型是键盘被按下if event.key == 276: # 通过key属性查看是不是左箭头被按下Var.wsc.x -= 40 # 如果是,王思聪x轴左移动40if event.key == 275: # 通过key属性查看是不是右箭头被按下Var.wsc.x += 40 # 如果是,王思聪x轴右移动40if Var.wsc.x < 0: # 如果王思聪的x轴比0小Var.wsc.x = 0 # 那么还是把这个值赋值为0if Var.wsc.x > 1000 - Var.wsc.width: # 如果王思聪的x轴最右边Var.wsc.x = 1000 - Var.wsc.width # 那x值赋值为最右边的值
这时 重点就来了!!!
一般我们想用某个库/工具包里的功能时,我们直接用库名.方法名() 的方法进行调用;但如果此时我们想调用的功能还没有被创建出来,但每一次书写都特别麻烦时,我们就可以用def的方法自己创造工具包。
例如这里,我们想创造一个“字体”方法,之后设置字体的时候就可以直接调用 。
# 工具方法-写文字方法
def fillText(text, position, view=canvas):# 设置字体样式和大小my_font = pygame.font.Font("my_font/font1.ttf", 30)# 渲染文字text = my_font.render(text, True, (255, 255, 255))view.blit(text, position)
- 第一排括号里的(text, position, view=canvas)是形式参数,相当于只是一个名字而已,没有任何实际意义。之后在调用这个方法时,再将实际参数传输进去。
- 第二行代码是进行字体的设置,前者是字体类型,后者是字体大小
- 下一行的第一个元素代表内容;第二个元素True代表“抗锯齿效果”,如果设置为False或者忽略设置,就会看到一群马赛克在晃动;后面的3个255我们在前面已经提到过啦~)
- 最后一行就是传输文字,包含内容和位置坐标。
class object
这里比较特别,是用class语句将特定功能*“封装”*起来,也是方便之后的调用。
def括号内的内容也是形式参数,后面的传参就是“实例化方法”。
就像是设置的一个一个工具包,把代码分成一块一块的,再来调用。
# 创建一个热狗类
# 创建一个热狗类
class HotDog():def __init__(self, x, y, width, height, img): # 实例化方法,有参数self.x = x # x轴的值self.y = y # y轴的值self.width = width # 图片宽self.height = height # 图片高self.img = img # 图片self.canDelete = False # 可删除属性,初始为False,即不可删除def paint(self): # 定义一个画画方法canvas.blit(self.img, (self.x, self.y)) # 将热狗画出来def step(self): # 定义一个移动方法self.y += 4 # 将热狗的y坐标变大,即往下移动def hit(self, wsc): # 碰撞方法,检查是否发生碰撞并做处理# 一定要让热狗的x轴和y轴同时满足碰到王思聪if self.x >= wsc.x - self.width + 10 and self.x <= wsc.x + wsc.width - 10 and self.y >= wsc.y - self.height + 10 and self.y <= wsc.y + wsc.height - 10:self.canDelete = True # 这个热狗可以删除Var.game.score += 1 # 得分加1def out(self): # 出界方法if self.y >= 625 - self.height: # 如果热狗出界self.canDelete = True # canDelete属性改成True# 判断游戏时间是否到了def gameOver():Var.game.end() # 调用游戏对象中的end方法来处理游戏倒计时的问题
最后一步,是为了保持项目的实时性,即使用while True死循环将保证所有的插件元素(热狗、wsc、背景等一直出现在画布上)
while True:if not Var.game.isEnd: # 如果游戏时间还没到componentEnter() # 生产热狗componentPaint() # 画出所有的角色componentStep() # 移动所有的角色checkHit() # 检查王思聪和热狗是否发生碰撞componentDelete() # 删除该消失的热狗isOutBounds() # 判断是否出界gameOver() # 判断游戏是否时间到else: # 如果游戏时间到canvas.blit(end, (0, 0)) # 画结束背景图fillTextOver(str(Var.game.score), (460, 390)) # 画最后得分# 监听有没有按下退出按钮handleEvent()# 更新屏幕内容pygame.display.update()# 延时10毫秒pygame.time.delay(10)
这个项目就到此结束啦!刚刚回看了一下自己写的blog,感觉有很多东西没有讲清楚:(
只能先这样啦,到时候想到什么再补嘻嘻!
对了,来看看这个项目的完整版和效果视频吧:
# coding:utf-8
import pygame
from pygame.locals import *
import time, random
import sys
import os# 初始化pygame环境
pygame.init()# 创建一个长宽分别为1300/700窗口
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (100, 25)
canvas = pygame.display.set_mode((1000, 625))
canvas.fill((255, 255, 255))# 设置窗口标题
pygame.display.set_caption("热狗大战")# 加载图片
bg = pygame.image.load("images/bg.jpg")
h = pygame.image.load("images/hotdog.png")
player = pygame.image.load("images/hero.png")
end = pygame.image.load("images/end.jpg")
bullet_tip = pygame.image.load("images/bullet_tip.png")
time_tip = pygame.image.load("images/time_tip.png")# 处理事件
def handleEvent():for event in pygame.event.get(): # 循环出事件列表中的每个事件对象if event.type == QUIT: # 如果事件的类型是退出类型pygame.quit() # pygame游戏框的退出方法sys.exit() # 系统程序结束方法if event.type == KEYDOWN: # 如果事件类型是键盘被按下if event.key == 276: # 通过key属性查看是不是左箭头被按下Var.wsc.x -= 40 # 如果是,王思聪x轴左移动40if event.key == 275: # 通过key属性查看是不是右箭头被按下Var.wsc.x += 40 # 如果是,王思聪x轴右移动40if Var.wsc.x < 0: # 如果王思聪的x轴比0小Var.wsc.x = 0 # 那么还是把这个值赋值为0if Var.wsc.x > 1000 - Var.wsc.width: # 如果王思聪的x轴最右边Var.wsc.x = 1000 - Var.wsc.width # 那x值赋值为最右边的值# 工具方法-写文字方法
def fillText(text, position, view=canvas):# 设置字体样式和大小my_font = pygame.font.Font("my_font/font1.ttf", 30)# 渲染文字text = my_font.render(text, True, (255, 255, 255))view.blit(text, position)def fillTextOver(text, position, view=canvas):my_font = pygame.font.Font("my_font/font1.ttf", 50)# 渲染文字text = my_font.render(text, True, (255, 255, 255))view.blit(text, position)# 创建一个热狗类
class HotDog():def __init__(self, x, y, width, height, img): # 实例化方法,有参数self.x = x # x轴的值self.y = y # y轴的值self.width = width # 图片宽self.height = height # 图片高self.img = img # 图片self.canDelete = False # 可删除属性,初始为False,即不可删除def paint(self): # 定义一个画画方法canvas.blit(self.img, (self.x, self.y)) # 将热狗画出来def step(self): # 定义一个移动方法self.y += 4 # 将热狗的y坐标变大,即往下移动def hit(self, wsc): # 碰撞方法,检查是否发生碰撞并做处理# 一定要让热狗的x轴和y轴同时满足碰到王思聪if self.x >= wsc.x - self.width + 10 and self.x <= wsc.x + wsc.width - 10 and self.y >= wsc.y - self.height + 10 and self.y <= wsc.y + wsc.height - 10:self.canDelete = True # 这个热狗可以删除Var.game.score += 1 # 得分加1def out(self): # 出界方法if self.y >= 625 - self.height: # 如果热狗出界self.canDelete = True # canDelete属性改成True# 创建一个王思聪类
class Wsc():def __init__(self, x, y, width, height, img): # 定义实例化方法self.x = x # x轴的值self.y = y # y轴的值self.width = width # 图片宽self.height = height # 图片高self.img = img # 图片def paint(self): # 画画方法canvas.blit(self.img, (self.x, self.y)) # 画出王思聪# 游戏类,相当于裁判,来判定游戏结束,得分等等
class Game():def __init__(self, t): # 实例化方法self.score = 0 # 分数self.t = t # 时间self.lastTime = time.time() # 用于判断游戏进行的时间self.interval = 0.6 # 生产热狗间隔是0.4秒钟self.time0 = 0 # time0属性代表,上次生产热狗的时间self.isEnd = False # 时间是否结束,一开始是没结束def end(self): # 定义end方法if self.t > 0: # 代表游戏还在进行t = time.time() # 获得现在的时间if t - self.lastTime >= 1: # 用现在时间和之前时间比,是否超过1秒self.t -= 1 # 如果超过了1秒,我们现实的倒计时就减1self.lastTime = t # 并且,更新lastTime的时间为现在的时间else: # 代表游戏已经结束self.isEnd = True # 把isEnd属性改为Truedef isTime(self): # 判断是否要生产热狗的方法if not self.time0: # 如果time0==0,代表还没有生产过热狗self.time0 = time.time() # 更新time0属性return True # 返回一个Truet = time.time() # 得到一个现在的时间# 如果现在时间-上次生产热狗时间大于等于我们设置的间隔时间if t - self.time0 >= self.interval:self.time0 = t # 更新我们的time0属性return True # 返回一个Truepass# 创建一个类,专门储存游戏中用到的变量
class Var():hotDogs = [] # 储存热狗对象的列表wsc = Wsc(480, 625 - 153, 80, 133, player) # 创建王思聪对象game = Game(30) # 创建游戏对象,传参时间为30秒pass# 产生热狗的组件
def componentEnter():if Var.game.isTime(): # 时间到的方法,达成了我们再生产热狗x = random.randint(0, 1000 - 32) # 产生随机数,作为热狗的x轴Var.hotDogs.append(HotDog(x, 0, 32, 60, h)) # 创建热狗对象加进列表pass# 删除热狗的组件
def componentDelete():for hotDog in Var.hotDogs: # 循环出每一个热狗if hotDog.canDelete: # 检查这些热狗的canDelete属性是否为真Var.hotDogs.remove(hotDog) # 从列表中删除被吃的热狗对象pass# 画角色的组件
def componentPaint():canvas.blit(bg, (0, 0)) # 首先要画背景for hotDog in Var.hotDogs: # 循环出热狗列表中的每个热狗对象hotDog.paint() # 调用热狗对象的画画方法Var.wsc.paint() # 调用王思聪对象的画画方法canvas.blit(bullet_tip, (800, 5)) # 画积分板canvas.blit(time_tip, (25, 25)) # 画时间板fillText(str(Var.game.t), (40, 40)) # 写上时间fillText(str(Var.game.score), (880, 40)) # 写上分数pass# 移动的组件
def componentStep():for hotDog in Var.hotDogs: # 循环出热狗列表中的每个热狗对象hotDog.step() # 调用热狗对象的移动方法pass# 检查是否碰撞
def checkHit():for hotDog in Var.hotDogs: # 循环出每个热狗对象hotDog.hit(Var.wsc) # 调用热狗对象的碰撞方法,传入王思聪对象pass# 判断是否出界
def isOutBounds():for hotDog in Var.hotDogs: # 循环出每一个热狗对象hotDog.out() # 调用热狗对象的out方法pass# 判断游戏时间是否到了
def gameOver():Var.game.end() # 调用游戏对象中的end方法来处理游戏倒计时的问题while True:if not Var.game.isEnd: # 如果游戏时间还没到componentEnter() # 生产热狗componentPaint() # 画出所有的角色componentStep() # 移动所有的角色checkHit() # 检查王思聪和热狗是否发生碰撞componentDelete() # 删除该消失的热狗isOutBounds() # 判断是否出界gameOver() # 判断游戏是否时间到else: # 如果游戏时间到canvas.blit(end, (0, 0)) # 画结束背景图fillTextOver(str(Var.game.score), (460, 390)) # 画最后得分# 监听有没有按下退出按钮handleEvent()# 更新屏幕内容pygame.display.update()# 延时10毫秒pygame.time.delay(10)
嘿嘿,之前参加比赛,为传承中国文化,还专门照葫芦画瓢了个“苏武牧羊”:
最后的最后,小本生意码字不易,大家能看到这里已经是我何等的荣幸了哈哈哈
如有问题,记得联系我呀~
1773632066@qq.com
Hotdog 热狗大战相关推荐
- c++怎么打印出句子中的各个单词_小学英语单词汇总篇 身体 食品、饮料 蔬菜...
身体英语名称 hair头发 head头 eye眼睛 face脸 neck脖子 arm手臂 leg腿 hand手 foot脚 toe脚趾 finger手指 ear耳朵 nose鼻子 mouth嘴巴 to ...
- ImageNet中英文类别对照
0 n01440764 tench 鱼 1 n01443537 goldfish 鱼 2 n01484850 great_white_shark 鱼 3 n01491361 tiger_shark 鱼 ...
- 中餐和西餐菜名大全(zt)
凉菜 cold dish 冷盘 cold dish 拼盘 assorted cold foods; hors d'oeuvres; assorted appetizers 凉拼盘 assorted c ...
- 关于音频情感分类的随笔(5)
书接上一篇,通过对少量音频的事后抽查.发现其用的预测算法有误,然后修改了算法,再次对FMA的7997首音频测试.结果没有了Annoying这类分类,应该是训练数据集中的对于这类数据相对较少.对于Ner ...
- ImageNet Large Scale Visual Recognition Competition (ILSVRC)-ImageNet数据集标签名称中英文对照
0 n01440764 tench 鱼 1 n01443537 goldfish 鱼 2 n01484850 great_white_shark 鱼 3 n01491361 tiger_shark 鱼 ...
- English trip V1 - 3.What Would you Like? Teacher:Lamb Key: would like to
In this lesson you will learn to talk about fast food and health. would = will 的过去式 STARTER 1.Tell y ...
- 实用食品英语 (餐桌上用的)
最近经常与老外吃饭,很多单词不会挺尴尬的,在网上正好看到有人整理出来了 实用食品用语(餐具) coffee pot 咖啡壶 coffee cup 咖啡杯 paper towel 纸巾 napkin 餐 ...
- 图像分类数据集 (热狗 hotdog)
引入 热狗数据集包含2800包含热狗和其他食物的图像,下载地址如下: 原始:https://apache-mxnet.s3-accelerate.amazonaws.com/gluon/dat ...
- 王校长一分钟能吃多少热狗?| 小游戏
公元 2018 年 11 月 3 日 ,王思聪的创办的 iG 战队 在< 英雄联盟 >比赛中以 3:0 的比分击败了 Fnatic 战队,夺得了 LPL 赛区的首个 S 系列冠军 ,创造了 ...
- HTML实现怀旧小游戏,超级玛丽、飞机大战…等十余款【完整源码分享】
HTML怀旧小游戏 介绍 超级玛丽.飞机大战.赛车.俄罗斯方块.飞翔的鸟.王校长热狗飞机大战.植物大战僵尸.冒险岛.塔块游戏.五子棋.贪吃蛇 怀旧小游戏,简单HTML实现,可下载修改代码调整难度,增加 ...
最新文章
- 基于BERT预训练的中文命名实体识别TensorFlow实现
- 计算机培训专业中心架,国家高技能人才培养车工培训方案.doc
- 安全感与职业发展的几点思考
- 除了游戏和医疗,腾讯区块链还准备做什么?
- spring框架 web开发_go语言web开发框架学习:Iris框架讲解(一)
- Vue3中的父子、子父组件通信
- Kaldi AMI数据集脚本学习5---AMI mono phone文件 40.mdl分析
- Netty in action—Bootstraping
- ASP.NET MVC应用中一个诡异错误的处理
- BIOS的启动原理学习--加载引导程序
- Axure RP 9 原型图的绘制及交互
- Python爬虫-博客and贴吧
- Open Distro 初探
- OPPO技术开放日第六期丨OPPO安全解析“应用与数据安全防护”背后的技术
- Error Some file crunching failed, see logs for details 解决方案
- 如何在 SAP UI5 应用里显示 PDF 文件试读版
- 2.4.3 Mybatis 高级查询, 复杂映射, 返回主键, 动态SQL if, set, foreach, 核心配置文件深入,plugins标签, 多表查询, 嵌套查询
- 关于微信的APP支付、公众号(服务号)支付,商户问题
- Vue2.x - Vue Router
- 微信缓存dat怎么转图片_微信 .dat图片格式转换为.jpg
热门文章
- java程序设计pdf下载_Java程序设计基础(第5版) PDF 下载
- 判断在ios系统中打开微信浏览器
- 算法导论第三版 第5章习题答案
- 什么是servlet及其生命周期
- 内网主机通过外网地址访问内网服务器
- 3.配置阿里云镜像加速
- Unity组件脚本的常用类和结构体GameObject
- 高通QFIL烧录错误解决方法
- S32K144 S32K148 UDS诊断 BOOTLOADER开发 ISO14229 15765 软件定 基于UDS协议的CAN总线Bootloader设计 具体价格以咨询为主 UDS 诊断
- java疯狂讲义pdf_《疯狂Java讲义(第3版)》PDF 下载