c语言编程实例——小球跳动

本文介绍了如何使用C语言实现小球动画,包括静止小球显示、上下移动、上下弹跳、斜向弹跳及控制弹跳速度等效果。文章详细讲解了相关头文件的作用、循环结构的使用,并提供了完整的代码示例。

1、预备知识

1.1 相关头文件

“#include”是c语言中用以申明所需调用的库函数或自定义函数的头文件路径及文件名。#include ""和#include <>存在区别,#include "" 当要调用某个函数时先在用户自已编写的文件中查找,如果找不到再到库文件里去找。而#include <>  是直接到库文件里去找,所以如果是调用自己写的函数的话就用#include ""这种形式,而调用标准库函数的话就用#include <> 这种形式,可以提高速度。

1.1.1 stdio.h

这个标准库的头文件定义了用于输入输出的宏和函数。从键盘上读取数据,将输入写入命令行上时,需要包含这个头文件。

1.1.2 stdlib.h

定义了许多一般用途的函数和宏。它包含将字符串转化为数值的函数,生成伪随机数的rand()函数,给数据动态分配和释放内存的函数,搜索和排序例程,整数算数函数,以及转换多字节和宽字节串的函数。

1.1.3 windows.h

系统头文件。

1.2 相关函数与结构

1.2.1 printf

1.2.2 循环结构

c语言有3种用于实现循环结构的语句,分别是for、while(先判断,后循环)和do-while(先循环,后判断)。使用格式如下:

(1)for循环

for(表达式1;表达式2;表达式3)
//表达式1为初值,表达式2为终止条件,表达式3为循环步长
{
  //这里是循环体
}

(2)while循环

while(表达式)    //表达式即终止循环的条件
{
  //这里是循环体
}

(3)do-while循环

do
{
  //这里是循环体
}while(表达式)

 

1.2.3 system("cls")

这是VC环境下的清屏方法,隶属stdlib头文件库,属于调用格式为:

#include <stdlib.h>
system("cls");

1.2.4 Sleep函数

功 能: 执行挂起一段时间  

用 法: unsigned sleep(unsigned seconds);  

注意:  

在VC中使用带上头文件#include <windows.h>,在Linux下,gcc编译器中,使用的头文件因gcc版本的不同而不同#include <unistd.h> ;

在VC中,Sleep中的第一个英文字符为大写的"S" ,在linux下不要大写,在标准C中是sleep, 不要大写,简单的说VC用Sleep, 别的一律使用sleep;

在VC中,Sleep()里面的单位,是以毫秒为单位,所以如果想让函数滞留1秒的话,应该是Sleep(1000); 在Linux下,sleep()里面的单位是秒,而不是毫秒。

2、程序构建

2.1 显示静止的小球

// 在坐标(x,y)处输出一个小球
#include <stdio.h>
int main(void) { int i,j; int x = 5; int y = 10; // 输出小球上面的空行 for(i=0;i<x;i++) printf("\n"); // 输出小球左边的空格 for (j=0;j<y;j++) printf(" "); printf("o"); // 输出小球o printf("\n"); }

 

2.2 通过改变小球坐标的变量,让小球下落

 

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int i,j;
    int x = 1;
    int y = 10;
    for (x=1;x<10;x++)
    {
        system("cls");   // 清屏函数
        // 输出小球上面的空行
        for(i=0;i<x;i++)
            printf("\n");
        // 输出小球左边的空格
        for (j=0;j<y;j++)
            printf(" ");
        printf("o");  // 输出小球o
        printf("\n"); 
    }    
} 

这里利用了一个清屏函数system("cls");,只需要加上头文件#include <stdlib.h>即可。

2.3 实现小球的上下弹跳

在上面一步代码的基础上,增加记录速度的变量,小球的新位置=旧位置+速度。判断小球到达上下边界时,速度改变方向,即改变正负号。

#include <stdio.h>
#include <stdlib.h>

void main()
{
    int i,j;
    int x = 5;
    int y = 10;
    
    int hight = 20;
    int velocity = 1;
    
    while (1)
    {
        x=x+velocity;
        system("cls");   // 清屏函数
        
        // 输出小球前的空行
        for(i=0;i<x;i++)
            printf("\n");
        for (j=0;j<y;j++)
            printf(" ");
        printf("o");  // 输出小球o
        printf("\n"); 
        
               //判断边界条件
        if (x==hight)
            velocity = -velocity;
        if (x==0)
        {
            velocity = -velocity;
        }        
    }    
}

 

2.4 实现小球斜跳

主要思路是增加x,y两个方向的速度控制变量,一个碰到上下边界后改变正负号,一个碰到左右边界后改变正负号。

#include <stdio.h>
#include <stdlib.h>

void main()
{
    int i,j;
    int x = 0;
    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");   // 清屏函数
        // 输出小球前的空行
        for(i=0;i<x;i++)
            printf("\n");
        for (j=0;j<y;j++)
            printf(" ");
        printf("o");  // 输出小球o
        printf("\n"); 
        
               //判断边界条件
        if ((x==top)||(x==bottom))
            velocity_x = -velocity_x;
        if ((y==left)||(y==right))
            velocity_y = -velocity_y;        
    }    
}

大家尽量养成良好的编码习惯,上面的边界坐标尽量不要在程序中写数字,可以用定义的变量或常量。这样程序可读性更好,后面也更容易调整。

 

2.5 控制小球弹跳速度

介绍一个Sleep函数,可以让游戏中间等待,从而可以控制小球弹跳的速度。使用这个函数,需要#include<windows.h>。

#include <stdio.h>
#include <stdlib.h>
#include<windows.h> 

void main()
{
    int i,j;
    int x = 0;
    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");   // 清屏函数
        // 输出小球前的空行
        for(i=0;i<x;i++)
            printf("\n");
        for (j=0;j<y;j++)
            printf(" ");
        printf("o");  // 输出小球o
        printf("\n"); 
        Sleep(50);  // 等待若干毫秒
        
        if ((x==top)||(x==bottom))
            velocity_x = -velocity_x;
        if ((y==left)||(y==right))
            velocity_y = -velocity_y;        
    }
}

 

3 参考文献

[1]陈萌.C语言编程思维[M].北京:清华大学出版社,2014.  

[2]Ivor Horton.C语言入门经典[M].第5版.北京:清华大学出版社,2013.  

 

转载于:https://www.cnblogs.com/BJTU-WHC/p/6286187.html

1.基本要求 能够实现如下功能: ‹ 首先用蓝色清屏 ‹ 在屏幕中央显示由字符串“-============#”组成的黄色的小球,#为球, 按下方向键可以控制上述小球球行方式在屏幕上行走 ‹ 在行进过程中,球只能左转、右转或继续前进,不能掉转 180 度 2.鼓励实现完整的彩球滚动游戏,鼓励有新的创意 3.提示 ①通过调用 INT 16H 的 0 号功能可以读取光标控制键的扩展码 光标控制键: ↑ ↓ ← → 扩展码(十进制): 72 80 75 77 ②在指定位置用指定属性显示字符的方法有两种:一是直接写显示缓冲区,二是利用 BIOS 屏显功能调用。解: 功能描述(基本上是全部功能):本程序有以下功能 共分为7关,可以手工选择关卡(带有输入异常处理)。走完一关后,如果后面还有关, 直接跳到下一关。否则,结束游戏。各个关之间的差别是速度不同。 按下方向键,球能够按照题的要求在屏幕上行走。按下 ESC 键,退出游戏,按下其他键, 程序不理会。 长时间不按键,球会自动前进。 能够产生随机数,作为蛋。球的初始大小为 14,当大小为 20 时,此关结束。 如果球运动到了边界,球死亡。游戏结束。 ① 设计思路 程序开始时,由用户指定一个关卡,进入游戏。 每次用清屏加显示字符的方式重新显示球和蛋。 当检测到有键子按下时,判断是什么键子,如果是 esc,退出游戏,如果是方向键,按 正确的方向走(如果方向键与球运动方向相反,不理会按键),如果按下的时其它键, 不理会。 设置一个等待时间,如果超过等待时间仍没有按键,球自动前行一步。否则,重新比较 时间。 每次球运动或有键子被按下时,判断是否撞到了自身和边界。 如果吃到了一个蛋,更新完球的位置后,将原球的位置加入球中。 如果球的长度达到了 20(设置的球的最大大小),判断后面是否还有关,没有了,就结 束程序,还有,就跳到下一关卡。 ② 算法说明 设置两个标记变量,分别记录球的大小 ssize 和球上次的大小 befor。设置标记变量, 分别记录蛋的横纵座标 xlabel 和 ylabel,设置标记变量,记录球的位置 tailx 和 taily。设置 snake 记录球各个部分的位置,设置球的最大大小为 20。设置变量 TIME 为等待按键时间。 关卡的选择:程序开始时,从键盘读入一个数字,当作关卡,根据读入的数据,设置等 待时间,也就实现了对球的速度的控制。 清屏和显示小球和蛋。调用 bios 中断可以实现。每次输出 1 个球,下面说一下如何实现小球的手工移动(有按键输入时)。可以知道,如果把球看成一个 个单元,球每移动一次,它的身体的位置都等于它的前一个身体单元的上一步 的位置,因此,可以从尾部进行循环,把前一节的位置给后一节。这样循环 ssize-1 次 就更新了身体,再根据输入的按键判断如何如移动头部,如果按键是左或者右, 只需将球的列加减 1,如果按键是上或者下,只需将球的行加减 1。至此,完成了 对球的显示位置的更新,之后重新清屏、显示,可以使球移动了。 在判断球是否向相反方向走时,可以采用如下算法:已知按键了(以向上为例),检查 球和身体第一节的行号,如果球行号大,说明此时设在向下运动,按键无效。 判断球撞到边界的算法如下(以向上键为例):判断球此时的行号是否为 0,如果是 0, 又按下了向上键,结束游戏,输出“I AM DEAD!!!”。如果球运动过程中撞到了自己, 也同撞到边界的操作。算法是这样的:取出球的位置,依次和每个身体和尾巴的位置 进行比较(从球开始比较),如果相等,说明撞上了,结束游戏。 如何实现球的自动移动。可以用 INT 10H 的 1 号功能检测是否有按键输入,如果有,转 到手工移动模块,否则,调用 INT 1AH 中的 00 号功能,读取当前时间。与上次读的时 间相比,如果小于设定的时间,重新比较,否则,球自动前移。实现前移的算法与手工 移动相似,也是将身体的某一单元的位置置成塔前一单元上一次的位置,之后判断球 方向。 产生并输出蛋。相当于产生一个随机数,我已经读去了当前时间,可以利用 DX 移位(防 止溢出)以后,对 80 和 25 取余,获得位置的随机数。之后判断球的大小 ssize 和 befor, 先让 ssize 为 14,befor 为 13,每产生一个随机数,befor 加 1,每吃一个蛋,ssize 加 1。比较 ssize 和 befor,如果相等,证明球没有吃蛋,不用产生新的随机数,仍在 原位置输出随机数,否则,产生新的随机数。球的大小的变化。每次吃到一个蛋后,ssize加1,并且将更新前球的位置加入到snake, 这样下次输出就能够多输出一个球,实现了大小的增加。 关卡的切换:每当球吃了一个蛋以后,判断是否达到了球的最大大小20,如果达到了, 继续判断是否的达到了等待时间的最小值(也就是最高的一关),如果没有达到,就更 新等待时间,进入下一关卡之前,还要将球的大小 ssize 和初始大小befor 分别设为 14 和 13。将记录球位置的内存 snake 的前 14 个字更新到屏幕中央。之后,就可以进入下 一关了。如果已经达到了最高关,并且通过了,就结束程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值