C语言实现简单弹跳小球
作者:无限的菜鸟 发布时间:2022-07-03 12:54:34
本文实例为大家分享了C语言实现简单弹跳小球的具体代码,供大家参考,具体内容如下
本节利用 printf 函数 实现一个在屏幕上弹跳的小球,内容简单容易入门,这也是以后我们在设计更多游戏中可能用到的东西。
绘制静止的小球
我们将以如图坐标系进行游戏,即以窗口左上角为原点。
我们希望在坐标(x , y)处显示静止的小球:
#include <stdio.h>
int main(){
?? ?int i,j; // 这两个量是循环中要使用的,一定先声明
?? ?int x = 5;
?? ?int y = 10;
?? ?//输出小球上方空行【x坐标】
?? ?for(i=0; i<x; i++)
?? ??? ?printf("\n");
?? ?//输出小球左边的空格【y坐标】
?? ?for(j=0; j<y; j++)
?? ??? ?printf(" ");
?? ?printf("o");
?? ?printf("\n");
?? ?return 0;
}
随后我们可以将此文件命名为 ball.c
再使用GCC编译:
gcc ball.c -o ball.out
可以直接用cc来代替gcc
-o ball.out 表示输出文件为 ball.out
当然可以不写这些,输出会成为a.out
如果是Windows系统,会输出exe文件
这里是我编译成功的结果:
里面的CGame.c是源文件,而那个绿油油的 ball.out 就是编译输出的文件。
然后运行它就可以了。
小球下落
如何让小球下落?根据我们之前规定的坐标系,可以知道只需让小球x坐标不断增加即可。但我们同时不想让每个x坐标上都留着原来的小球,所以需要使用清屏函数 system(“cls”)
注意要包含头文件<stdlib.h>
#include <stdio.h>
#include <stdlib.h>
int main(){
?? ?int i,j;
?? ?int x = 1;
?? ?int y = 10;
?? ?for(x=1; x<10; x++)
?? ?{
?? ??? ?system("cls"); //每次循环先清屏
?? ??? ?//输出小球上方空行【x坐标】
?? ??? ?for(i=0; i<x; i++)
?? ??? ??? ?printf("\n");
?? ??? ?//输出小球左边的空格【y坐标】
?? ??? ?for(j=0; j<y; j++)
?? ??? ??? ?printf(" ");
?? ??? ?printf("o");
?? ??? ?printf("\n");?? ?
?? ?}
?? ?return 0;
}
同样我们编译、运行。
上下弹跳的小球
接下来,我们要在上一步代码的基础上增加一个记录小球速度的变量 velocity 从而把小球的下落从简单的循环改为小球坐标x = x + velocity,当速度为正值时小球下落(x坐标增加),反之小球上升(x坐标减小)。
#include <stdio.h>
#include <stdlib.h>
int main(){
?? ?int i,j; // 这两个量是循环中要使用的,一定先声明
?? ?int x = 5;
?? ?int y = 10;
?? ?int height = 20; //边界高度,到达边界时改变方向
?? ?int velocity = 1;
?? ?
?? ?while(1){
?? ??? ?x = x + velocity;
?? ??? ?system("cls"); //每次循环先清屏
?? ??? ?//输出小球上方空行【x坐标】
?? ??? ?for(i=0; i<x; i++)
?? ??? ??? ?printf("\n");
?? ??? ?//输出小球左边的空格【y坐标】
?? ??? ?for(j=0; j<y; j++)
?? ??? ??? ?printf(" ");
?? ??? ?printf("o");
?? ??? ?printf("\n");
?? ??? ?
?? ??? ?if(x == height)?? ??? ?//到达下边界
?? ??? ??? ?velocity = -velocity; // 下落改为上升
?? ??? ?if(X == 0)?? ??? ??? ?//到达上边界
?? ??? ??? ?velocity = -velocity; // 上升改为下落
?? ?}
?? ?return 0;
}
注意这里是个死循环,小球不断在x = 0到x = 20 中间上下弹跳,并且保持恒定速度。
斜方向弹跳
既然已经实现了上下弹跳,那么如何实现斜方向弹跳呢?
这只是很简单的速度合成而已,我们上一步已经使用 velocity 来表示小球在 x 方向的速度了,那么我们只要再加一个 y 方向的速度即可。
用什么来表示呢?speed?
一定注意,为了确保代码可读性 ,也就是说让别人好接手的情况下,注释是一方面,变量命名也是很重要的一方面。
我们可以使用 velocity_x 表示 x 方向速度,用 velocity_y 表示 y 方向速度。
那么速度控制就会变成:到达上、下边界改变x速度(即 velocity_x 的符号),到达左、右边界改变y速度(即 velocity_y 的符号)。
#include <stdio.h>
#include <stdlib.h>
int main(){
?? ?int i,j;
?? ?int x = 1;
?? ?int y = 5;
?? ?int velocity_x = 1;
?? ?int velocity_y = 1;
?? ?int left = 0;//左边界坐标
?? ?int right = 20;//右边界坐标
?? ?int top = 0;//上边界坐标
?? ?int bottom = 10;//下边界坐标
?? ?while(1)
?? ?{
?? ??? ?x = x + velocity_x;
?? ??? ?y = y + velocity_y;
?? ??? ?system("cls"); //每次循环先清屏
?? ??? ?//输出小球上方空行【x坐标】
?? ??? ?for(i=0; i<x; i++)
?? ??? ??? ?printf("\n");
?? ??? ?//输出小球左边的空格【y坐标】
?? ??? ?for(j=0; j<y; j++)
?? ??? ??? ?printf(" ");
?? ??? ?printf("o");
?? ??? ?printf("\n");
?? ?
?? ??? ?if((x == top)||(x == bottom))
?? ??? ??? ?velocity_x = -velocity_x;
?? ??? ?if((y == left)||(y == right))
?? ??? ??? ?velocity_y = -velocity_y;
?? ?}
?? ?return 0
}
然后你就可以得到一个十分鬼畜(事实如此)的小球弹跳动画了。
控制小球弹跳速度
我们刚才说过,编译之后运行我们会得到一个十分鬼畜的小球弹跳动画,那么为了减缓这个动画的刷新速度(至少不会快到抽象),我们将使用 sleep 函数来在每个循环建立一个暂停机制。
sleep(50); //表示到达此处程序暂停 50ms
小结
完整代码:
#include <stdio.h>
#include <stdlib.h>
int main(){
?? ?int i,j;
?? ?int x = 1;
?? ?int y = 5;
?? ?int velocity_x = 1;
?? ?int velocity_y = 1;
?? ?int left = 0;//左边界坐标
?? ?int right = 20;//右边界坐标
?? ?int top = 0;//上边界坐标
?? ?int bottom = 10;//下边界坐标
?? ?while(1)
?? ?{
?? ??? ?x = x + velocity_x;
?? ??? ?y = y + velocity_y;
?? ??? ?system("cls"); //每次循环先清屏
?? ??? ?//输出小球上方空行【x坐标】
?? ??? ?for(i=0; i<x; i++)
?? ??? ??? ?printf("\n");
?? ??? ?//输出小球左边的空格【y坐标】
?? ??? ?for(j=0; j<y; j++)
?? ??? ??? ?printf(" ");
?? ??? ?printf("o");
?? ??? ?printf("\n");
?? ??? ?sleep(50); ?//到达此处程序暂停 50ms
?? ?
?? ??? ?if((x == top)||(x == bottom))
?? ??? ??? ?velocity_x = -velocity_x;
?? ??? ?if((y == left)||(y == right))
?? ??? ??? ?velocity_y = -velocity_y;
?? ?}
?? ?return 0
}
到此为止,我们最基本的实现就完工了!
思考题目:
1. 能不能去掉sleep函数来实现速度减慢?
2. 能不能通过在循环中改变velocity_x来模拟一个自由落体效果?
以后我们会进一步展开游戏编写,希望大家最终能如愿以偿地成为C语言大师!
来源:https://blog.csdn.net/weixin_54597744/article/details/113825174
猜你喜欢
- Mybatis 复杂对象resultMap数据对象含有普通属性,一对一对象,一对多对象(2种情况:单一主键和复合主键)下面是resultMa
- 在 Java 中,方法的重载(Overloading)和覆盖(Overriding)是两个重要的概念。它们都涉及到方法的定义与使用,但作用和
- 先简单说一下思路:网络变化时系统会发出广播。所以我们监听这个广播,利用接口回调通知activity做相应的操作就好了。思路判断网络状态(写个
- 小伙伴们在使用ICP提供的各种能力进行集成开发时常常会遇到一些技术上的困扰,例如ICP中很多接口是通过OCX控件的方式提供的,如何调用这些接
- 实践过程😜富文本芝麻粒儿提醒:标签是成对出现的就不要省略,有的不是成对的在修改了后就恢复过来,如下方alpha示例,否则多了很容易出现意外的
- 前 言🍉 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端☕专栏简介:深入、全面、系统的介绍消息中间件🌰 文章简介
- 1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;2、Retent
- 背景:Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了
- 1、心跳机制简介在分布式系统中,分布在不同主机上的节点需要检测其他节点的状态,如服务器节点需要检测从节点是否失效。为了检测对方节点的有效性,
- 前言现在市面上很多应用都会有当用户按返回键的时候提示用户:再按一次将退出应用的提示,也就是双击双击返回键退出应用,接下来我们就用几种办法来实
- 1集合的概念把集合看做是一个容器,集合不是一个类,是一套集合框架,框架体系包含很多的集合类,java api提供了集合存储任意类型(基本包装
- docker简介Docker 是一个开源的应用容器引擎,和传统的虚拟机技术相比,Docker 容器性能开销极低,因此也广受开发者喜爱。随着基
- 在上篇文章给大家介绍了使用Java8 实现观察者模式的方法(上),本文继续给大家介绍java8观察者模式相关知识,具体内容如下所述:线程安全
- Java动态数组Arraylist存放自定义数据类型class Point{ int x; int y; public Point(int
- 一、采用Object.toString()toString方法是java.lang.Object对象的一个public方法。在java中任何
- 根据狂神的视频做的,然后自己优化了一些bug,比如新生成食物的时候不会生成在蛇的身体上,再新增长身体的时候不会在左上角出现一个绿色的方块以及
- 【前言】面向资源的 Restful 风格的 api 接口本着简洁,资源,便于扩展,便于理解等等各项优势,在如今的系统服务中越来越受欢迎。.n
- 一、使用在非静态方法上public synchronized void syzDemo(){ System.out.print
- 自动注入和@Autowire@Autowire不属于自动注入!注入方式(重要)在Spring官网上(文档),定义了在Spring中的注入方式
- private void txtBarCode_KeyPress(object sender, KeyPressEventArg