这次教程,我们实现一个弹跳小球。缺省编译器为VC,需要学习完基础的变量、运算符、表达式,printf、scanf输入输出函数的用法,if-else、while、for语句的用法。
第1步,显示静止的小球。效果为:
<img src="https://pic4.zhimg.com/v2-1f926dd9524451c859cf17de9675a273_b.png" data-rawwidth="391" data-rawheight="283" class="content_image" width="391">// 在坐标(x,y)处输出一个小球
#include <stdio.h>
void main()
{
int i,j;
int x = 5;
int y = 10;
// 输出小球上面的空行
for(i=0;i<x;i++)
printf("\n");
// 输出小球左边的空格
for (j=0;j<y;j++)
printf(" ");
printf("o"); // 输出小球o
printf("\n");
}
第二步,通过改变小球坐标的变量,让小球下落
#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("\n");
// 输出小球左边的空格
for (j=0;j<y;j++)
printf(" ");
printf("o"); // 输出小球o
printf("\n");
}
}
这里利用了一个清屏函数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("\n");
for (j=0;j<y;j++)
printf(" ");
printf("o"); // 输出小球o
printf("\n");
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("\n");
for (j=0;j<y;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<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("\n");
for (j=0;j<y;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函数的话,能否利用循环,实现小球速度变慢的效果?
另外,大家可以尝试下 printf("\a"); 实现小球碰到边界时响铃。