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 热狗大战相关推荐

  1. c++怎么打印出句子中的各个单词_小学英语单词汇总篇 身体 食品、饮料 蔬菜...

    身体英语名称 hair头发 head头 eye眼睛 face脸 neck脖子 arm手臂 leg腿 hand手 foot脚 toe脚趾 finger手指 ear耳朵 nose鼻子 mouth嘴巴 to ...

  2. ImageNet中英文类别对照

    0 n01440764 tench 鱼 1 n01443537 goldfish 鱼 2 n01484850 great_white_shark 鱼 3 n01491361 tiger_shark 鱼 ...

  3. 中餐和西餐菜名大全(zt)

    凉菜 cold dish 冷盘 cold dish 拼盘 assorted cold foods; hors d'oeuvres; assorted appetizers 凉拼盘 assorted c ...

  4. 关于音频情感分类的随笔(5)

    书接上一篇,通过对少量音频的事后抽查.发现其用的预测算法有误,然后修改了算法,再次对FMA的7997首音频测试.结果没有了Annoying这类分类,应该是训练数据集中的对于这类数据相对较少.对于Ner ...

  5. ImageNet Large Scale Visual Recognition Competition (ILSVRC)-ImageNet数据集标签名称中英文对照

    0 n01440764 tench 鱼 1 n01443537 goldfish 鱼 2 n01484850 great_white_shark 鱼 3 n01491361 tiger_shark 鱼 ...

  6. 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 ...

  7. 实用食品英语 (餐桌上用的)

    最近经常与老外吃饭,很多单词不会挺尴尬的,在网上正好看到有人整理出来了 实用食品用语(餐具) coffee pot 咖啡壶 coffee cup 咖啡杯 paper towel 纸巾 napkin 餐 ...

  8. 图像分类数据集 (热狗 hotdog)

    引入   热狗数据集包含2800包含热狗和其他食物的图像,下载地址如下:   原始:https://apache-mxnet.s3-accelerate.amazonaws.com/gluon/dat ...

  9. 王校长一分钟能吃多少热狗?| 小游戏

    公元 2018 年 11 月 3 日 ,王思聪的创办的 iG 战队 在< 英雄联盟 >比赛中以 3:0 的比分击败了 Fnatic 战队,夺得了 LPL 赛区的首个 S 系列冠军 ,创造了 ...

  10. HTML实现怀旧小游戏,超级玛丽、飞机大战…等十余款【完整源码分享】

    HTML怀旧小游戏 介绍 超级玛丽.飞机大战.赛车.俄罗斯方块.飞翔的鸟.王校长热狗飞机大战.植物大战僵尸.冒险岛.塔块游戏.五子棋.贪吃蛇 怀旧小游戏,简单HTML实现,可下载修改代码调整难度,增加 ...

最新文章

  1. 基于BERT预训练的中文命名实体识别TensorFlow实现
  2. 计算机培训专业中心架,国家高技能人才培养车工培训方案.doc
  3. 安全感与职业发展的几点思考
  4. 除了游戏和医疗,腾讯区块链还准备做什么?
  5. spring框架 web开发_go语言web开发框架学习:Iris框架讲解(一)
  6. Vue3中的父子、子父组件通信
  7. Kaldi AMI数据集脚本学习5---AMI mono phone文件 40.mdl分析
  8. Netty in action—Bootstraping
  9. ASP.NET MVC应用中一个诡异错误的处理
  10. BIOS的启动原理学习--加载引导程序
  11. Axure RP 9 原型图的绘制及交互
  12. Python爬虫-博客and贴吧
  13. Open Distro 初探
  14. OPPO技术开放日第六期丨OPPO安全解析“应用与数据安全防护”背后的技术
  15. Error Some file crunching failed, see logs for details 解决方案
  16. 如何在 SAP UI5 应用里显示 PDF 文件试读版
  17. 2.4.3 Mybatis 高级查询, 复杂映射, 返回主键, 动态SQL if, set, foreach, 核心配置文件深入,plugins标签, 多表查询, 嵌套查询
  18. 关于微信的APP支付、公众号(服务号)支付,商户问题
  19. Vue2.x - Vue Router
  20. 微信缓存dat怎么转图片_微信 .dat图片格式转换为.jpg

热门文章

  1. java程序设计pdf下载_Java程序设计基础(第5版) PDF 下载
  2. 判断在ios系统中打开微信浏览器
  3. 算法导论第三版 第5章习题答案
  4. 什么是servlet及其生命周期
  5. 内网主机通过外网地址访问内网服务器
  6. 3.配置阿里云镜像加速
  7. Unity组件脚本的常用类和结构体GameObject
  8. 高通QFIL烧录错误解决方法
  9. S32K144 S32K148 UDS诊断 BOOTLOADER开发 ISO14229 15765 软件定 基于UDS协议的CAN总线Bootloader设计 具体价格以咨询为主 UDS 诊断
  10. java疯狂讲义pdf_《疯狂Java讲义(第3版)》PDF 下载