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.  

 

posted @ 2017-01-14 21:50  whc的博客  阅读(1196)  评论(0编辑  收藏  举报