C语言之1 实现弹跳小球

做游戏,学编程(C语言) 1 实现弹跳小球

原文链接:https://zhuanlan.zhihu.com/p/24633092

知乎我玩的比较少,应不少同学的要求,开始试着开一个系列的教程:做游戏,学编程。有问题大家可以反馈给我改进。

首先,这个教程不会讲解C语言的基础知识,大家可以找些经典的教材,在每次教程前,我会写上所需的基础语法知识,大家可以事先学习。主要会给多个步骤的代码,每个步骤提供对应的要求,以及相应的参考代码。大家可以先在前一个步骤代码的基础上,自己尝试实现下一个步骤的要求;如果有困难的话,再参考我们给出的代码。

这次教程,我们实现一个弹跳小球。缺省编译器为VC,需要学习完基础的变量、运算符、表达式,printf、scanf输入输出函数的用法,if-else、while、for语句的用法。

第1步,显示静止的小球。效果为:

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

第二步,通过改变小球坐标的变量,让小球下落

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

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



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

#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("
");
        for (j=0;j<y;j++)
            printf(" ");
        printf("o");  // 输出小球o
        printf("
"); 
        
        if (x==hight)
            velocity = -velocity;
        if (x==0)
        {
            velocity = -velocity;
        }        
    }    
}

第四步,让程序更有趣,让小球斜着弹跳。主要思路是增加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("
");
        for (j=0;j<y;j++)
            printf(" ");
        printf("o");  // 输出小球o
        printf("
"); 
        
        if ((x==top)||(x==bottom))
            velocity_x = -velocity_x;
        if ((y==left)||(y==right))
            velocity_y = -velocity_y;        
    }    
}

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



第五步,介绍一个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("
");
        for (j=0;j<y;j++)
            printf(" ");
        printf("o");  // 输出小球o
        printf("
"); 
        Sleep(50);  // 等待若干毫秒
        
        if ((x==top)||(x==bottom))
            velocity_x = -velocity_x;
        if ((y==left)||(y==right))
            velocity_y = -velocity_y;        
    }
}

这里出个思考题,如果没有sleep函数的话,能否利用循环,实现小球速度变慢的效果?

结果:

#include <math.h>
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
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("
");
        for (j = 0; j < y; j++)
        {
            printf("  ");
        }
        printf("o");
        printf("
");
    /*    for (int  k = 0; k < 1000000000; k++)
        {
            continue;
        }*/     //拖慢小球运行速度
        Sleep(50);  //等待若干毫秒
        if ((x == top) || (x == bottom))
            velocity_x = -velocity_x;
        if ((y == left || y == right))
            velocity_y = -velocity_y;
    }
}

另外,大家可以尝试下 printf("a"); 实现小球碰到边界时响铃。

原文地址:https://www.cnblogs.com/HuangDaDa/p/10374672.html