做游戏,学编程(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"); 实现小球碰到边界时响铃。