zoukankan      html  css  js  c++  java
  • 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"); 实现小球碰到边界时响铃。

  • 相关阅读:
    poj3278 Catch That Cow
    poj2251 Dungeon Master
    poj1321 棋盘问题
    poj3083 Children of the Candy Cor
    jvm基础知识—垃圾回收机制
    jvm基础知识1
    java面试基础必备
    java soket通信总结 bio nio aio的区别和总结
    java scoket aIO 通信
    java scoket Blocking 阻塞IO socket通信四
  • 原文地址:https://www.cnblogs.com/HuangDaDa/p/10374672.html
Copyright © 2011-2022 走看看