学习C语言十天了,我实现了仿真自由落体小球『C/C++&图形库EasyX』

这篇具有很好参考价值的文章主要介绍了学习C语言十天了,我实现了仿真自由落体小球『C/C++&图形库EasyX』。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

💐专栏导读

🌸作者简介:花想云,在读本科生一枚,致力于 C/C++、Linux 学习。

🌸本文收录于 初学C语言必会的20个小游戏专栏,本专栏主要内容为利用C/C++与图形库EasyX实现各种有趣的小游戏。

🌸相关专栏推荐:C语言初阶系列C语言进阶系列数据结构与算法

文章导读

本文主要内容为,利用图形库与简单的C语言语法实现仿真自由落体小球。有多仿真呢?在代码中,我们引入了速度、加速度、阻力的概念,目的是尽量模仿真实的物理世界。但是真实的实现过程和物理知识没多大关系,所以小伙伴们放心食用哦~

学习C语言十天了,我实现了仿真自由落体小球『C/C++&图形库EasyX』

准备工作

  1. vs2013/2019/2022,选择一款IDE;(并不代表其它的不能,只是我没试过而已)
  2. 下载安装easyx;
  • 进入官网easyx下载;
  • 点击安装;

学习C语言十天了,我实现了仿真自由落体小球『C/C++&图形库EasyX』

到这就OK了,开搞!

一、显示一个静止的小球

注意

  • 文件类型为.cpp不是.c
  • 必须包含头文件graphics.hstdio.h
  • 接下来的内容请仔细阅读注释的内容。

<1.1>

#include<graphics.h>
#include<stdio.h>

int main()
{
	initgraph(600, 600);  //初始化游戏窗口画面,宽600,高600
	fillcircle(300, 300, 50);  //在坐标(300,300)处画一个半径为50的圆

	getchar();  //等待按键
	closegraph(); //关闭窗口
	return 0;
}

学习C语言十天了,我实现了仿真自由落体小球『C/C++&图形库EasyX』

二、显示多个小球

修改<1.1>中的代码。添加几个小球,并控制小球的纵坐标

<1.2>

#include<graphics.h>
#include<stdio.h>

int main()
{
	initgraph(600, 600);  //初始化游戏窗口画面,宽600,高600
	fillcircle(300, 100, 50);  //在坐标(300,100)处画一个半径为50的圆
	fillcircle(300, 250, 50);  //在坐标(300,250)处画一个半径为50的圆
	fillcircle(300, 400, 50);  //在坐标(300,400)处画一个半径为50的圆

	getchar();  //等待按键
	closegraph(); //关闭窗口
	return 0;
}

学习C语言十天了,我实现了仿真自由落体小球『C/C++&图形库EasyX』

使用#define美化代码

当我们需要频繁修改游戏窗口大小或者是小球间的间隔,那么就得每次都手动修改很多数据,未免显得有点麻烦。我们可以用#define定义一些很多地方都用到的数据,例如游戏窗口的大小小球的间隔等,便于一次性修改。

改进<1.2>中的代码。

<1.3>

#include<graphics.h>
#include<stdio.h>

#define G_WIDTH 600  //游戏窗口的宽度
#define G_HEIGHT 600 //游戏窗口的高度
#define STEP 100 //两小球间的距离
int main()
{
	int y = 100; //第一个小球的高度
	initgraph(G_WIDTH, G_HEIGHT);  //初始化游戏窗口画面

	fillcircle(300, y, 20);  //在坐标(300,y)处画一个半径为20的圆
	
	y += STEP;
	fillcircle(300, y, 20); 
	
	y += STEP;
	fillcircle(300, y, 20);

	y += STEP;
	fillcircle(300, y, 20);

	y += STEP;
	fillcircle(300, y, 20);

	getchar();  //等待按键
	closegraph(); //关闭窗口
	return 0;
}

学习C语言十天了,我实现了仿真自由落体小球『C/C++&图形库EasyX』

三、小球下落动画

<1.3>的基础上,每绘制一个小球后,加上Sleep(1000)语句,表示程序暂停一秒,即可实现小球从上向下一次出现的效果。

<1.4>

#include<graphics.h>
#include<stdio.h>

#define G_WIDTH 600  //游戏窗口的宽度
#define G_HEIGHT 600 //游戏窗口的高度
#define STEP 100 //两小球间的距离
int main()
{
	int y = 100; //第一个小球的高度
	initgraph(G_WIDTH, G_HEIGHT);  //初始化游戏窗口画面

	fillcircle(300, y, 20);  //在坐标(300,y)处画一个半径为20的圆
	
	Sleep(1000);  //休眠1000毫秒即1秒
	y += STEP;
	fillcircle(300, y, 20);
	
	Sleep(1000);
	y += STEP;
	fillcircle(300, y, 20);

	Sleep(1000);
	y += STEP;
	fillcircle(300, y, 20);

	Sleep(1000);
	y += STEP;
	fillcircle(300, y, 20);

	getchar();  //等待按键
	closegraph(); //关闭窗口
	return 0;
}

接着,利用cleardevice()清屏函数,在绘制新的小球前先清除画面上的内容,即可实现一个小球逐渐下落的动画效果。

<1.5>

#include<graphics.h>
#include<stdio.h>

#define G_WIDTH 600  //游戏窗口的宽度
#define G_HEIGHT 600 //游戏窗口的高度
#define STEP 100 //两小球间的距离
int main()
{
	int y = 100; //第一个小球的高度
	initgraph(G_WIDTH, G_HEIGHT);  //初始化游戏窗口画面
	cleardevice(); //清屏函数
	fillcircle(300, y, 20);  //在坐标(300,y)处画一个半径为20的圆
	
	Sleep(1000); //休眠1000毫秒即1秒
	y += STEP;
	cleardevice();
	fillcircle(300, y, 20);
	
	Sleep(1000);
	y += STEP;
	cleardevice();
	fillcircle(300, y, 20);

	Sleep(1000);
	y += STEP;
	cleardevice();
	fillcircle(300, y, 20);

	Sleep(1000);
	y += STEP;
	cleardevice();
	fillcircle(300, y, 20);

	getchar();  //等待按键
	closegraph(); //关闭窗口
	return 0;
}

四、利用while循环实现小球下落

<1.5>的代码中有很多重复的内容,我们可以用循环来代替。

<1.6>

#include<graphics.h>
#include<stdio.h>

#define G_WIDTH 600  //游戏窗口的宽度
#define G_HEIGHT 600 //游戏窗口的高度

int main()
{
	int y = 100; //第一个小球的高度
	initgraph(G_WIDTH, G_HEIGHT);  //初始化游戏窗口画面
	cleardevice();

	while (1)
	{
		y = y + 1;
		cleardevice(); //清屏函数
		fillcircle(300, y, 20); //在坐标(300,y)处画一个半径为20的圆

		Sleep(10); //休眠10毫秒
	}

	getchar();  //等待按键
	closegraph(); //关闭窗口
	return 0;
}

五、利用if语句实现小球重复下落

当小球下落到达游戏窗口的边界处,重新为y赋值,即y=-20,实现重复下落。

<1.7>

//自由落体小球  Free-fall balls
#include<graphics.h>
#include<stdio.h>

#define G_WIDTH 600  //游戏窗口的宽度
#define G_HEIGHT 600 //游戏窗口的高度

int main()
{
	int y = 100; //第一个小球的高度
	initgraph(G_WIDTH, G_HEIGHT);  //初始化游戏窗口画面
	cleardevice();

	while (1)
	{
		y = y + 1;
		if (y > 620)
		{
			y = -20;
		}
		cleardevice(); //清屏函数
		fillcircle(300, y, 20); //在坐标(300,y)处画一个半径为20的圆

		Sleep(10); //休眠10毫秒
	}

	getchar();  //等待按键
	closegraph(); //关闭窗口
	return 0;
}

六、实现小球落地反弹

定义一个变量vy表示小球在竖直方向上的速度,并初始化为3。在while循环中纵坐标y每次增加vy

当小球落到地面,即到达游戏窗口边界时,令vy=-vy,使小球向上弹起。

<1.8>

#include<graphics.h>
#include<stdio.h>

#define G_WIDTH 600  //游戏窗口的宽度
#define G_HEIGHT 600 //游戏窗口的高度

int main()
{
	int y = 100; //第一个小球的高度
	int vy = 3; //小球竖直方向的速度
	initgraph(G_WIDTH, G_HEIGHT);  //初始化游戏窗口画面
	cleardevice();

	while (1)
	{
		y = y + vy;
		if (y >=580) //因为小球的底部到达边界即可
		{
			vy = -vy;
		}
		cleardevice(); //清屏函数
		fillcircle(300, y, 20); //在坐标(300,y)处画一个半径为20的圆

		Sleep(10); //休眠10毫秒
	}

	getchar();  //等待按键
	closegraph(); //关闭窗口
	return 0;
}

七、实现小球加速下落

为了更加真实的模仿真实世界,在自由落体时,物体会有向下的重力加速度,大小为g=1.0(根据自己的喜好调节)。另外为了更加精确的表示数值,我们可以将之前的坐标和速度的类型改为float类型。

还记得物理课上讲的加速度如何影响速度吗?在while循环中,速度一直在变化,每次增加g,即vy=vy+g

<1.9>

#include<graphics.h>
#include<stdio.h>

#define G_WIDTH 600  //游戏窗口的宽度
#define G_HEIGHT 600 //游戏窗口的高度

int main()
{
	float y = 100; //第一个小球的高度
	float vy = 0; //小球竖直方向的速度
	float g = 1.0; //重力加速度
	initgraph(G_WIDTH, G_HEIGHT);  //初始化游戏窗口画面
	cleardevice();

	while (1)
	{
		vy = vy + g;  //改变速度
		y = y + vy;
		if (y >=580) //因为小球的底部到达边界即可
		{
			vy = -vy;
		}
		cleardevice(); //清屏函数
		fillcircle(300, y, 20); //在坐标(300,y)处画一个半径为20的圆

		Sleep(10); //休眠10毫秒
	}

	getchar();  //等待按键
	closegraph(); //关闭窗口
	return 0;
}

另外,小球在自由落体期间会受到阻力的影响。我们让小球在每次落地弹起的时候,速度变为之前的0.95倍。当小球停下时,要让小球正好停止在地面上,防止小球穿过地面。

<1.10>

#include<graphics.h>
#include<stdio.h>

#define G_WIDTH 600  //游戏窗口的宽度
#define G_HEIGHT 600 //游戏窗口的高度

int main()
{
	float y = 100; //第一个小球的高度
	float vy = 0; //小球竖直方向的速度
	float g = 0.8; //重力加速度
	initgraph(G_WIDTH, G_HEIGHT);  //初始化游戏窗口画面
	cleardevice();

	while (1)
	{
		vy = vy + g;  //改变速度
		y = y + vy;
		if (y >=580) //因为小球的底部到达边界即可
		{
			vy = -0.95*vy;  //考虑阻力的影响
		}

		if (y > 580) //使小球静止在地面上
		{
			y = 580;
		}
		cleardevice(); //清屏函数
		fillcircle(300, y, 20); //在坐标(300,y)处画一个半径为20的圆

		Sleep(10); //休眠10毫秒
	}

	getchar();  //等待按键
	closegraph(); //关闭窗口
	return 0;
}

<1.10>的代码就是最终版本了。由于某些原因,我不能在每一段代码后都附上演示动画,所以小伙伴们最好能够在敲完一段代码后,立即运行并检验。文章来源地址https://www.toymoban.com/news/detail-413999.html

到了这里,关于学习C语言十天了,我实现了仿真自由落体小球『C/C++&图形库EasyX』的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言(第三十天)

    1. 什么是bug bug本意是昆虫”或“虫子”,现在一般是指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问 题,简称程序漏洞。 “Bug” 的创始人格蕾丝·赫柏(Grace Murray Hopper),她是一位为美国海军工作的电脑专家, 1947年9月9日,格蕾丝·赫柏对Harvard Mark II设置好17

    2024年02月10日
    浏览(41)
  • 大数据Flink学习圣经:一本书实现大数据Flink自由

    本文是《大数据Flink学习圣经》 V1版本,是 《尼恩 大数据 面试宝典》姊妹篇。 这里特别说明一下:《尼恩 大数据 面试宝典》5个专题 PDF 自首次发布以来, 已经汇集了 好几百题,大量的大厂面试 干货、正货 。 《尼恩 大数据 面试宝典》面试题集合, 将变成大数据学习和面

    2024年02月12日
    浏览(48)
  • 平面三自由度机器人动力学建模与仿真

    网上二自由度机器臂动力学分析有很多,三自由度比较少,碰巧本科课设需要完成相关项目,分享一些经验供参考。 实际的三连杆机器臂的结构相对较复杂,很难进行精确地描述,因此,在本文中利用简化的数学模型进行讨论。简化条件如下: 假设机器臂是刚性结构,不考

    2024年02月04日
    浏览(57)
  • 程序员如何实现财富自由系列之:学习并应用云计算和大数据技术

    作者:禅与计算机程序设计艺术 云计算和大数据技术正在改变着人们的生活方式。如今越来越多的人都通过智能手机、平板电脑、电视等设备获取信息,也越来越多的企业为了优化资源配置和管理运营成本而迈向云计算。 在云计算领域,最热门的服务就是谷歌搜索引擎和亚

    2024年02月03日
    浏览(63)
  • 学习JAVA的第二十天(基础)

    目录 字符集  编码和解码 字符流 FileReader FileWriter 缓冲流  字节缓冲流 字符缓冲流 转换流                                                               序列化流         反序列化流   打印流 字节打印流   字符打印流 解压缩流                           

    2024年03月15日
    浏览(54)
  • 第四十天 Java基础学习(三十四)

    一、Tomcat的初步使用 ● Tomcat目录结构与介绍 •bin:用来存放Tomcat服务器的可执行程序,主要有两大类,一类是以.sh结尾的(linux命令),另一类是以.bat结尾的(windows命令) •conf:用来存放Tomcat服务器的配置文件 •lib:用来存放Tomcat服务器的jar包 •logs:用来存放Tomcat服务器运行

    2024年02月16日
    浏览(41)
  • 【数学建模学习笔记【集训十天】之第六天】

    运行效果如下: Matplotlib Pyplot 运行效果如下: 关于plot() 运行效果如下: 绘制任意数量的点 运行效果如下: 不指定 x 轴上的点,看看效果 运行效果如下: 再看看y更多值的效果 运行效果如下: 运行效果如下: 运行效果如下: 实心圆标记: 运行效果如下: 用 * 标记 运行效果

    2024年02月06日
    浏览(49)
  • Matlab/Simulink六自由度机器人运动学与控制系统仿真(一)【附源文件】

    本文章为系列文章,以IRB1600机器人为例,建立机器人正运动、逆运动学、控制系统模型,并在simulink中进行仿真,与理论计算结果进行对比验证 (一) irb1600机器人坐标系建立、正运动学计算与simulink验证 (二) 机器人逆运动学计算 (三) 机器人运动学控制系统仿真 本文以

    2024年01月16日
    浏览(69)
  • C++学习第二十天----简单文件输入/输出

    1.写入到文本文件中         必须声明自己的ofstream对象,为其命名,并将其同文件关联起来;         方法open()接受一个c-风格字符换作为参数,可以是一个字面字符串,也可以是存在数组中的字符串。         声明一个ofstream对象并将其同文件关联起来后,用于

    2024年02月11日
    浏览(42)
  • 第七十天学习记录:高等数学:微分(宋浩板书)

    sin(x+y) = sin(x)cos(y) + cos(x)sin(y)可以用三角形的几何图形来进行证明。 假设在一个单位圆上,点A(x,y)的坐标为(x,y),点B(x’, y’)的坐标为(x’, y’)。则以两点为直角的直角三角形的斜边长为1,且所在的角为夹角x+y。 接下来,通过计算三角形中的各条边可以得到: sin(x+y) = y’

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包