知乎我玩的比较少,应不少同学的要求,开始试着开一个系列的教程:做游戏,学编程。有问题大家可以反馈给我改进。
首先,这个教程不会讲解C语言的基础知识,大家可以找些经典的教材,在每次教程前,我会写上所需的基础语法知识,大家可以事先学习。主要会给多个步骤的代码,每个步骤提供对应的要求,以及相应的参考代码。大家可以先在前一个步骤代码的基础上,自己尝试实现下一个步骤的要求;如果有困难的话,再参考我们给出的代码。
这次教程,我们实现一个弹跳小球。缺省编译器为VC,需要学习完基础的变量、运算符、表达式,printf、scanf输入输出函数的用法,if-else、while、for语句的用法。
第1步,显示静止的小球。效果为:
//在坐标(x,y)处输出一个小球
#include
voidmain()
{inti,j;int x = 5;int y = 10;//输出小球上面的空行
for(i=0;i
printf("\n");//输出小球左边的空格
for (j=0;j
printf(" ");
printf("o"); //输出小球o
printf("\n");
}
第二步,通过改变小球坐标的变量,让小球下落
#include #include
voidmain()
{inti,j;int x = 1;int y = 10;for (x=1;x<10;x++)
{
system("cls"); //清屏函数//输出小球上面的空行
for(i=0;i
printf("\n");//输出小球左边的空格
for (j=0;j
printf(" ");
printf("o"); //输出小球o
printf("\n");
}
}
这里利用了一个清屏函数system("cls");,只需要加上头文件#include 即可。
第三步,实现小球的上下弹跳,在上面一步代码的基础上,增加记录速度的变量,小球的新位置=旧位置+速度。判断小球到达上下边界时,速度改变方向,即改变正负号。
#include #include
voidmain()
{inti,j;int x = 5;int y = 10;int hight = 20;int velocity = 1;while (1)
{
x=x+velocity;
system("cls"); //清屏函数//输出小球前的空行
for(i=0;i
printf("\n");for (j=0;j
printf(" ");
printf("o"); //输出小球o
printf("\n");if (x==hight)
velocity= -velocity;if (x==0)
{
velocity= -velocity;
}
}
}
第四步,让程序更有趣,让小球斜着弹跳。主要思路是增加x,y两个方向的速度控制变量,一个碰到上下边界后改变正负号,一个碰到左右边界后改变正负号。
#include #include
voidmain()
{inti,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
printf("\n");for (j=0;j
printf(" ");
printf("o"); //输出小球o
printf("\n");if ((x==top)||(x==bottom))
velocity_x= -velocity_x;if ((y==left)||(y==right))
velocity_y= -velocity_y;
}
}
大家尽量养成良好的编码习惯,上面的边界坐标尽量不要在程序中写数字,可以用定义的变量或常量。这样程序可读性更好,后面也更容易调整。
第五步,介绍一个Sleep函数,可以让游戏中间等待,从而可以控制小球弹跳的速度。使用这个函数,需要#include
#include #include#include
voidmain()
{inti,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
printf("\n");for (j=0;j
printf(" ");
printf("o"); //输出小球o
printf("\n");
Sleep(50); //等待若干毫秒
if ((x==top)||(x==bottom))
velocity_x= -velocity_x;if ((y==left)||(y==right))
velocity_y= -velocity_y;
}
}
这里出个思考题,如果没有sleep函数的话,能否利用循环,实现小球速度变慢的效果?
结果:
#include #include#include#includemain() {inti, 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("\n");for (j = 0; j < y; j++)
{
printf(" ");
}
printf("o");
printf("\n");/*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"); 实现小球碰到边界时响铃。