• 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"); 实现小球碰到边界时响铃。

  • 相关阅读:
    图像处理---平滑处理(柔化效果)
    图像处理---椒盐噪声(杂点效果)
    图像处理--曝光、霓虹(照亮边缘效果)
    图像处理---灰度处理(黑白效果)
    图像处理---染色
    javascript基础篇:表达式
    javascript基础篇:函数
    前端开发神器罗列
    杂谈篇:阅读优秀代码是提高开发人员修为的一种捷径
    杂谈篇:JavaScript开发规范要求
  • 原文地址:https://www.cnblogs.com/HuangDaDa/p/10374672.html
Copyright © 2020-2023  润新知