火柴人

python小游戏——火柴人爱心发射 #2.14 from turtle import * from time import sleep def go_to(x, y): up() goto(x, y) down() def head(x,y,r): go_to(x,y) speed(1) circle(r) leg(x,y) def leg(x,y): right(90) forward(180) right(30) forward(100) left(120) go... 阅读详情

原文在finalObject

这个也是和弹球游戏一样的环境,python3+tkinter,所以环境配置可以参考前一篇。火柴人比前一篇就是多了个一个动画效果,已经更加麻烦的体积碰撞,还有上升下落的物理模拟,还有一个就是游戏成功的检测。

github连接在这:https://github.com/finalObject/stickman

动画效果

不像之前的弹球游戏,只有长方形和圆心,直接在程序中绘制就行,这个火柴人里的一些元素图片都需要自己提前准备的。然后image里就是自己绘制的元素,有点简陋。

承载小人的平台是设定之后就不会变更了的,但是小人和门是存在一个动画效果的。不过门的动画比较特殊,只有在游戏结束的时候才会触发一次,所以比较简单。而小人是需要不断变换图像,从而显示出奔跑状态的。

下面就是小人的动画函数

def animate(self):
        if self.x != 0 and self.y ==0:
            #每0.1s更换一下图片,刷新自身图片
            #不把刷新做在整体的update里面,可以让不同精灵拥有不同的刷新频率
            if time.time() - self.last_time >0.1:
                self.last_time = time.time()
                self.current_image += self.current_image_add
                #图片更换的顺序为1->2->3->2->1->2...这样连贯一点
                if self.current_image >=2:
                    self.current_image_add =-1
                if self.current_image <=0:
                    self.current_image_add =1
        # 如果速度方向向左
        if self.x<0:
            # 但是如果在起跳状态下,直接是固定的起跳图片
            if self.y!=0:
                self.game.canvas.itemconfig(self.image,image=self.images_left[2])
            # 不是的话,那就在朝左的图片中依次变换
            else:
                self.game.canvas.itemconfig(self.image,image=self.images_left[self.current_image])
        # 和速度向左同理
        elif self.x>0:
            if self.y!=0:
                self.game.canvas.itemconfig(self.image,image=self.images_right[2])
            else:
                self.game.canvas.itemconfig(self.image,image=self.images_right[self.current_image])

游戏中一个对应的元素(Sprite对象),在画布中创建图像时,会返回一个对象,然后就这个对象储存在self.image中。

self.image = game.canvas.create_image(x,y,image = self.photo_image1,anchor='nw')

如果需要更改图像,需要

self.game.canvas.itemconfig(self.image,image=self.photo_image2)

如果直接重新创建,会导致原画和新画都出现在屏幕上,而使用itemconfig函数,可以抹出原画,只留下新画。

体积碰撞

体积碰撞基础函数写在coords.py里,包含左右上下坐标是否重叠的检测,在class StickSprite的move()函数里,就基于简单的检测,实现了和画布边缘以及其他Sprite的碰撞检测。

def move(self):
    #首先根据现有状态更新动画,可以放在开头,也可以放在函数最后
    self.animate()
    # 如果小人处于上升状态,那么会不停的计数,等到一定时间之后,小人的速度会向下,模拟重力嘛,但是速度不是连续变化的
    if self.y <0:
        self.jump_count += 1
        if self.jump_count >20:
            self.y =4
    # 下面这个判断之前代码的这么写的,但是今天写备注的时候发现没啥意义,注释之后同样正常工作
    # if self.y >0:
    #     self.jump_count -= 1
    # 获取自身坐标,为接下来的碰撞检测做准备
    co = self.coords()
    # 四个方向是否可以继续走!
    # 为True表示这个方向没有碰到边界,为False表示触碰到了边界,可以是画布边界,也可以是其他精灵的边界
    left = True
    right = True
    top = True
    bottom = True
    # 是否正在下落
    falling = True
    # 下面四个if是用来判断和画布边缘碰撞的
    if self.y >0 and co.y2 >=self.game.canvas_height:
        self.y = 0
        bottom = False
    elif self.y <0 and co.y1 <=0:
        self.y=0
        top = False
    if self.x >0 and co.x2 >= self.game.canvas_width:
        self.x =0
        right = False
    elif self.x <0 and co.x1 <=0:
        self.x =0
        left = False
    # for循环开始判断和其他精灵的碰撞
    for sprite in self.game.sprites:
        if sprite == self:
            continue
        sprite_co = sprite.coords()
        if top and self.y<0 and collided_top(co,sprite_co):
            self.y=-self.y
            top=False
        if bottom and self.y >0 and collided_bottom(self.y,co,sprite_co):
            self.y=sprite_co.y1-co.y2
            if self.y<0:
                self.y=0
            bottom=False
            top=False
        if bottom and falling and self.y ==0 \
           and co.y2<self.game.canvas_height \
           and collided_bottom(1,co,sprite_co):
            falling = False
        if left and self.x <0 and collided_left(co,sprite_co):
            self.x=0
            left = False
            # 这个是判断游戏标志,如果碰触到了endgame为True的,running就会呗设置为False,小人就不能跑了,认为游戏结束。同时,对应的这个精灵,其实就是门,也需要执行changeEndImage,修改为开门状态。
            if sprite.endgame:
                self.game.running = False
                sprite.changeEndImage()
        if right and self.x >0 and collided_right(co,sprite_co):
            self.x=0
            right = False
    if falling and bottom and self.y ==0 \
       and co.y2 < self.game.canvas_height:
        self.y=4
    # 根据速度移动位置
    self.game.canvas.move(self.image,self.x,self.y)

物理模拟

主要就是一个小人跳跃过程中的模拟,这里其实很简单地对跳跃进行计时,到达一定时间后就将速度朝小。比较机械,只是很离散的模拟。

if self.y <0:
    self.jump_count += 1
    if self.jump_count >20:
        self.y =4

然后在检测到碰撞后(上下左右的碰撞),会把对应方向速度置0。

另外,当小人没有产生向下的碰撞时,小人会产生朝下的速度。这样就解决了小人漂浮在空中的bug。

if falling and bottom and self.y ==0 \
   and co.y2 < self.game.canvas_height:
    self.y=4

成功检测

在游戏初始化的时候,部分sprite的endgame属性为True,也就意味它有能力结束游戏,这个游戏里只有顶端的门有这个True。

if left and self.x <0 and collided_left(co,sprite_co):
    self.x=0
    left = False
    # 这个是判断游戏标志,如果碰触到了endgame为True的,running就会呗设置为False,小人就不能跑了,认为游戏结束。同时,对应的这个精灵,其实就是门,也需要执行changeEndImage,修改为开门状态。
    if sprite.endgame:
        self.game.running = False
        sprite.changeEndImage()

如果小人和门发生了碰撞,就会将running设置位False,然后执行门的结束游戏图像修改的函数,其实就是把门的图像由关变成开。running在Game类的mainloop()函数里控制着整个游戏的进行,如果变成False,小人就不能移动。

# 运行的时候就执行这个主循环,只要running为True,小人就会不停移动下去
def mainloop(self):
    while 1:
        if self.running == True:
            for sprite in self.sprites:
                sprite.move()
        self.tk.update_idletasks()
        self.tk.update()
        time.sleep(0.01)

之前尝试直接把while 1里面所有的东西放放入判断语句中,也就意味着如果running为False,连update和sleep函数都不会执行,但是这样做会导致程序卡死。

另外还有一个不足之处时,我的游戏检测只会在向左碰撞的函数里触发,因为这个场景下小人只可能从右往左抵达门,更加合理的方式,是应该保证发生碰撞一定会执行这个成功检测。

以上基本就是代码的全部内容了,代码已经贴的差不多了,再把全部代码贴上来会显得有点冗长,需要的请移步github。

python编写会动的火柴人_火柴人跑步怎么画 如何制作一个正在奔跑的火柴人动画形象?火柴人跑步动作怎么画... 小编最近一直致力于制作火柴人动画,制作火柴人各种搞笑的动作。为什么会一直想要制作火柴人动画呢?因为将动画制作成GIF格式之后,再发到微信聊天上就是一个很搞笑的微信表情包啦。然后小编的朋友总说小编制作的表情包很搞笑,很魔性,这简直就是小编创作的动力了。我们可以制作一系列的属于自己的火柴人动画表情包哦。好啦,废话不多说了,还是一起来看看小编今天给大家带来的火柴人跑步的动画表情包如何制作吧!首先,我们需... 阅读详情

相关推荐

图形学实验二:画个火柴人

由于接下来的实验要实现火柴人的动作,所以实验要求要采用分层设计,如下图所示: 这样转动hip(臀部),整个火柴人就整体转动。比如如果要动左腿,那么在相对hip上进行自己的操作,这样设计对火柴人的动作实现很方便。                                                   贴上自己的代码,程序用递归来实现分层设计,此外还增添了火柴人旋

sunny_xsc1994的专栏 2917

取火柴小游戏python turtle库

这是一场电脑和人类的博弈。游戏规则是:一共有21个火柴(默认),人类选手先开始取火柴,一次可以取1-3根火柴。接下来就是电脑取。谁取完火柴后,总火柴数只剩下1或0,那位选手就输掉了游戏,而赢家会有奖励。这款小游戏的游戏页面不限于枯燥无味的python黑色文本页面,拓展使用了turtle库进行图形展示,让这款游戏的可视性更强。海龟画布已经擦掉4根火柴的效果。

jimmy1881415157的博客 4384

2020级C语言大作业 - 火柴人打羽毛球

分享20级同学大一上学期用C语言(及少量C++)实现的火柴人打羽毛球。由于同学们刚学了三个月的编程,实现还不够完善,工程代码、图片音乐素材可以从百度网盘下载:链接:https://pan.baidu.com/s/1sZp0KBV_TblvnxkUoiqg7w 提取码:f1id 1 设计思路本游戏参考网络上的同名游戏,通过c语言编写实现。游戏中玩家通过键盘操作实现互动。游戏主体框架采用老师讲过的思路...

weixin_49630241的博客 4722

【大话设计模式】模式三 :建造者模式与使用Java的GUI绘制火柴人

引入 用笔画一个个小人,形状各异,要求小人有胳膊、身体、头部、手脚就可以。但是直接这样去编程有时候会因为疏忽忘记,出现缺手缺脚的情况,就说明这种建造方式不是稳定的。 一、定义 建造者模式(Builder)将一个复杂对象的创建和它的表示方法分离,使得同样的构建过程可以创建不同的表示。 二、组成: 1、Product产品类:具体产品 2、Builder抽象建造者:为了建造一个Product对象的各个部件指定的抽象接口。 3、ConcreteBuilder具体建造...

m0_46013789的博客 1816

《Java代码成精了——会跳萨日朗的火柴人》实现步骤四:火柴人跳舞(完)

一、处理火柴人图片 在此之前,我们已经绘画好了所有的火柴人。但是我们要想实现火柴人跳舞,还需要将图片进行最后一次处理。就是保留红色的火柴人部分,其余的全部都处理成白色。这一点的原理和实现步骤二中一样的,只是颜色值需要改一下。 加芊芊老师vx领取最新资料哦 代码实现: package demo; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import...

qfzhangxu的博客 3165

火柴人java源码-Stickman-Game:火柴人游戏

火柴人java源码火柴人游戏 介绍 一个用 Java 编写的关于角色的 2D 平台游戏:火柴人。 扮演火柴人,打败敌人并在穿越不同级别直到达到最终目标的同时获得能量提升。 程序运行说明: 转到您的终端并输入程序的路径,以便您将转到本地项目目录并输入“gradle run”以在 gradle 中运行程序。 使用“gradle build”来构建程序。 该程序也可以在 Intellij 中使用 gradle run 和 gradle build 运行。 JSON 文件的位置: JSON 文件位于“file:src/main/java/stickman/model/StickmanModel.json” JSON 文件的配置: JSON 文件分为几个部分,同时包含可以在 GameConfiguration 中加载的游戏级别。 每个级别还包含有关游戏实体的信息。 每个实体进一步分为“XVelocity”、“YVelocity”、“Height”、“Width”、“XPos”和“YPos”等子部分,分别是X轴速度、Y轴速度、高度、宽度、X - 实体的轴位置以及实体的 Y 轴位置。 该文件可以配置

java实现火柴人移动_生命的加减乘除法

很多人都喜欢用【加法】过日子,甚么都想要更多、要更大、要更好。例如:钱赚得更多、工作更好、职位更高、房子更大、车子更豪华等等。然而,当拥有了这一切之后,很多人结果反而进入了另一种迷惘的心境:耗费半生的心力所追逐来的这些东西,表面上看来,该有的差不多都有了,可是,自己并没有因此变得更满足、更快乐。想想,我们当初来到这个世界时都是赤裸裸,两手空空,没有任何东西在手。但随着岁月流逝,年纪越来越大,生活也...

weixin_31022203的博客 278

火柴人java源码-PhalApi-Core:PhalApiV2核心

火柴人java源码 ## PhalApi,简称π框架,是一个PHP轻量级开源接口框架,专注于接口开发,致力让接口开发更简单。它: 致力于快速、稳定、持续交付有价值的接口服务 关注于测试驱动开发、领域驱动设计、极限编程、敏捷开发 有众多的扩展类库,与更多开源项目一起提供高效便捷的解决方案 支持HTTP、SOAP和RPC协议,可用于快速搭建微服务、RESTful接口或Web Services PhalApi代码开源、产品开源、思想开源,请放心使用。更多请访问。再次感谢开源中国、各位贡献者和同学。 ###导读 本文内容主要分为三部分,即: PART 1:安装、在线体验与在线接口文档 PART 2:快速开发、单元测试、目录结构、SDK包和Library扩展类库 PART 3:背景回顾、贡献者、许可与更新日记 更多请访问。 ##1-1、安装 请从release分支拉取发布版本的代码 推荐部署于Linux服务器 建议PHP >= 5.3.3 将代码下载解压到服务器后,打开浏览器,访问安装向导(推荐使用nginx,并将根目录设置为Public): http://localhost/PhalApi/P

用python实现简单的火柴人游戏

用python实现简单的火柴人游戏 效果 准备工作 先画出游戏中各个部分的图像素材,其中包括背景,移动的火柴人,门,楼梯。 背景:500500像素 火柴人:2730像素 门:2730像素 三种楼梯:10010、6010、3010像素 (可酌情调整大小,自由发挥,代码部分记得匹配大小与文件名即可) 代码部分 from tkinter import * import random import time class Game: def __init__(self): # sel

卖瓜小农的博客 9765

一段python的小小游戏

用python编挺弱的

python游戏大猫快跑

python编写哭泣猫游戏,完整代码素材自取,自带音效。

python火柴人打架代码_两个火柴人对打动画 如何制作两个火柴人打架的动画效果?...

专注实拍 监控 风景 各类视频申请入群加微信: neimu500因为专注 所以专业!我们只发优质实拍视频,群管理专业、规范,确保群的视频质量以及秩序!无水印可下载可分享.昨天小编写了一篇火柴人动画制作的教程方案,不知道大家有没有自己亲自动手去尝试制作一下呢?反正小编制作之后是觉得很有乐趣的。火柴人动画不仅仅是动作简单搞笑,还可以呈现出两个或多个火柴人打斗的场景哦。两个火柴人打架动画在微信聊天中也是...

weixin_35659266的博客 5438

python火柴人打架代码

python火柴人打架代码 可自行添加火柴人素材图片,代码较为简单,仅供学习

过分了,别人用来做桌面应用开发,这家伙却用来撩妹(4)--运动的火柴人

“过分了,别人用来做桌面应用开发,这家伙却用来撩妹(4)--运动的火柴人” 我算是知道了,这个tkinter是真的好玩,还非常有趣,希望大家都可以去了解一下。 哈哈,先看成品,再决定是否有学习的兴趣。 目录 系列文章 前言​ 原理解析 需求说明 材料图片 第一步:实现一个弹框 第二步:插入图片 第三步:实现图片轮播 总结 系列文章 1、过分了,别人用来做桌面应用开发,这家伙却用来撩妹(2)-上帝给你开了各种撩妹窗口(Tkinter) 2、过分了,别人用来做桌面应用开发...

大家一起学编程(python) 4839

18650电池组流体直冷热管理仿真:COMSOL多物理场耦合建模路线与实战策略

在动力电池与储能系统的热管理设计中,多物理场耦合仿真已成为平衡性能与成本的关键工具。液冷方案的换热极限促使行业转向制冷剂直冷技术,而两相流与电池产热的强耦合特性,使得基于COMSOL的数值建模成为评估系统温升与流动分配的重要手段。工程实践中,电化学-热-流场全耦合模型与集总电池-流场简化模型各有适用场景,前者揭示电池内部微观机理,后者则以高计算效率支撑包级方案迭代。通过合理简化几何、标定内阻与熵热系数、设置等效换热边界,仿真能够准确预测直冷系统在快充或大倍率放电下的温度均匀性与压降特性,从而指导流道优化与制

weixin_33585822的博客 314

ABtest描述统计功效

我们在面试数据分析时,常常会问到如何确定样本量的问题,会有一个指标:统计功效(power),或者是1-β 统计功效会影响实验的可信度,甚至会影响实验所需的样本量,要了解统计功效,首先要理解两类统计错误 假如我们做了一个AB实验,且两组用户的数据均值为μ1和μ2,我们会有两个初始假设: H0:两个实验组的数据没有差别(μ1=μ2),这个假设也叫“零假设”,也叫原假设 H1:两个实验组之间的数据存在差别(μ1≠μ2),这个假设也叫“非零假设”,也叫备择假设 定义两类错误: 实验本身没有效应,但我们觉

qq_38134556的博客 898

C++入门——实现“火柴人跑酷”游戏

参考 《C和C++游戏趣味编程》 童晶 火柴人跑酷 游戏的思路是,玩家通过键盘控制火柴人的奔跑和跳跃,躲避蝙蝠到达终点。游戏地图随机生成,随着关卡数增加,游戏难度越来越大 定义Player类 class Player { public: IMAGE im_show; // 当前时刻要显示的图像 float x_left, y_bottom; // 左下角位置 float vx, vy;

beilizhang的博客 1万+

「 网络安全常用术语解读 」软件成分分析SCA详解:从发展背景到技术原理再到业界常用检测工具推荐

软件成分分析(Software Composition Analysis,SCA)是一种用于识别和分析软件内部组件及其关系的技术,旨在帮助开发人员更好地了解和管理其软件的构建过程,同时可帮助安全人员揭秘软件内部结构的神秘面纱。SCA技术的发展与软件行业的快速发展密不可分,下面将介绍SCA的发展背景、技术原理以及当前主流SCA工具。

所有成功的背后,都是痛苦的坚持,所有的痛苦,都是傻瓜般的不放弃! 5630

Python的火柴人

火柴人的关节包括头部、肩膀、肘部、手腕、臀部、膝盖和脚踝等。这些关节可以看作二维或三维空间中的点。(2)

s44359487yad的博客 979

机器学习模型系列:随机森林的原理和示例介绍

让我们总结一下与其他监督式机器学习模型相比,随机森林的优缺点。优点在许多真实数据集上已知能提供高度准确的模型。通过结合多个决策树的预测,可以捕捉数据集中的复杂交互和模式。通过自动选择相关特征,可以有效处理高维数据集。与单个决策树相比,不容易过拟合。自助采样和每个节点的随机特征选择有助于减少过拟合并改善泛化能力。可以处理包括数值和分类特征在内的异构数据类型。可以处理缺失值而不需要填充。提供特征重要性的度量。集成中的树可以并行训练,因为每个决策树可以独立构建。模型的泛化误差具有理论上的界限。

数智笔记 1万+

AGV路径规划实战:如何用Python+ROS实现激光SLAM导航(附避障代码)

本文提供了一份基于Python和ROS实现AGV激光SLAM导航的实战指南。内容涵盖从Docker环境搭建、激光雷达数据处理、Gmapping建图,到Move_Base全局/局部路径规划与TEB局部规划器配置的全流程。重点解析了如何通过参数调优实现稳定导航,并附带了紧急避障代码,帮助开发者快速构建具备自主路径规划与实时避障能力的AGV系统。

pepsi的博客 1234

火柴人_火柴人战争丨入口

火柴人战争遗产是一款主打火柴人题材的经典战争策略手机游戏作品,游戏打造出了一个庞大恢弘的火柴人战争世界,在这款游戏之中,你将扮演强大的英雄主角,率领麾下的火柴人英雄一路探索和冒险闯荡,勇往直前,消灭各类敌人,争夺属于你的至高荣耀! 点击开始玩游戏 ...

weixin_34583171的博客 838

GNSS气象学入门:从ZTD到PWV的水汽反演全流程解析(含精度评估)

本文详细解析了GNSS气象学中从ZTD到PWV的水汽反演全流程,包括基础概念、反演原理、数据处理步骤及精度评估方法。通过PRIDE软件和MATLAB代码示例,展示了如何高效提取ZTD数据并结合ERA5气象数据进行PWV计算,为气象研究和业务应用提供了实用指南。

weixin_28707365的博客 573

火柴人_火柴人你瞅啥:火柴人你秋哈?好玩的火柴人游戏小程序

沐沐带你发现好游戏!大家好呀!今天丑姐儿给大家伙介绍个火柴人系列的小游戏,叫做《火柴人你瞅啥》,我跟你讲了啦!可好玩啦这游戏吼!听听这名字,名字里都透露着一股不平常的气息,再看看这画风,瞅着就挺厉害的,酷帅酷帅的,那是一个色彩分明啊,还别说这游戏还挺有难度。先来说说这游戏是怎么个玩法,玩家要操控人物打败敌方的那个大雕塑才算赢得比赛,但是在这期间地方也会召唤源源不断的士兵们出来,而玩家操控...

weixin_42451850的博客 2092

Holosoma 开源人形机器人强化学习训练部署框架

Holosoma是一个综合性人形机器人框架,支持强化学习策略的训练、部署和动作重定位。该框架兼容多种模拟器(IsaacGym、IsaacSim、MuJoCo等)和机器人(Unitree G1、Booster T1),提供运动控制和全身追踪功能。主要特性包括:跨模拟器训练评估、Wandb集成、多GPU支持、自定义奖励权重和观测噪声配置。推理模块支持实体机器人部署和MuJoCo仿真测试。动作重定位工具可将人体动作数据转换为机器人动作,支持单序列和批量处理。文档详细介绍了训练配置、评估方法和高级功能,如课程学习和

2506_90492529的博客 1828

基于STM32L4XX、HAL库的MAX13487EESA RS485总线收发器驱动程序设计

MAX13487EESA是一款3.3V供电的RS-485/RS-422收发器,由Maxim Integrated生产。PA4 (控制引脚) ---> /RE, DE (连接在一起)具有±15kV ESD保护的驱动器输出和接收器输入。半双工RS-485/RS-422通信。工业温度范围:-40°C至+85°C。工作电压范围:3.0V至3.6V。数据速率高达250kbps。

zhusl6688的博客 687
上一篇: 基于激光雷达的人型识别(无人车)
下一篇: 一个扒雷达数据的爬虫
finalObject
博客等级 码龄8年 8粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值