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

  • 相关阅读:
    Ryzom简易汉化教程
    在Windows上编译运行Ryzom客户端
    在Windows(x86)上编译、配置并运行Ryzom Core(服务器/客户端)
    引擎设计与商业模式
    总结了一下新手学习Windows 8 Metro App 开发的捷径
    开始研究Ryzom Core!
    和Ryzom相关的项目简介
    关于Ryzom游戏开发的路线图
    根据 yyyymmdd格式日期取得当前日期所在周的开始和结束日期
    asp数组中REDIM的用法(动态数组)
  • 原文地址:https://www.cnblogs.com/HuangDaDa/p/10374672.html
Copyright © 2011-2022 走看看