在进行这个教程的学习前,强烈建议大家先尝试下教程2中的思考题,大概要一百多行代码,是对C语言基本语法、逻辑能力的一个很好的锻炼。
没有学习函数,以上功能都在main中实现,是有点痛苦的。学了函数后,这个教程我们会模块化重构飞机游戏,大家经历过上面的痛苦后才能真正理解函数的好处。如果只是被动地学习语法知识,做些简单的算法题,是很难体会到函数封装的重要性的。要写了足够复杂的代码,才有较深的体会。
还有,随着程序越来越复杂,程序调试的能力也越来越重要。大家都要学会断点单步、变量跟踪、分块调试等常用方法。这方面的教程很多,大家可以网上搜索下。
另外,在实现飞机游戏时,可能会遇到子弹运动时没法控制、键盘控制比较卡、不按键时敌人不会自动移动等问题。为了简化大家的开发难度,这里给一个简化的游戏框架:
// 函数外全局变量定义
void main()
{
startup(); // 数据初始化
while(1) // 游戏循环执行
{
show(); // 显示画面
updateWithoutInput(); // 与用户输入无关的更新
updateWithInput(); // 与用户输入有关的更新
}
}
大家的相应功能,都需要放到startup()、show()、updateWithoutInput()、updateWithInput()这四个函数中实现,主函数尽量保持以上的形式,不要修改。
第一步,利用函数和上面的框架对空战游戏进行重构,实现控制飞机的移动。另外,输出部分也改进了,通过直接二重循环,输出所有的空格回车等内容,可以进行更复杂的输出。
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
// 全局变量
int position_x,position_y; // 飞机位置
int high,width; // 游戏画面尺寸
void startup() // 数据初始化
{
high = 20;
width = 30;
position_x = high/2;
position_y = width/2;
}
void show() // 显示画面
{
system("cls"); // 清屏
int i,j;
for (i=0;i<high;i++)
{
for (j=0;j<width;j++)
{
if ((i==position_x) && (j==position_y))
printf("*"); // 输出飞机*
else
printf(" "); // 输出空格
}
printf("\n");
}
}
void updateWithoutInput() // 与用户输入无关的更新
{
}
void updateWithInput() // 与用户输入有关的更新
{
char input;
if(kbhit()) // 判断是否有输入
{
input = getch(); // 根据用户的不同输入来移动,不必输入回车
if (input == 'a')
position_y--; // 位置左移
if (input == 'd')
position_y++; // 位置右移
if (input == 'w')
position_x--; // 位置上移
if (input == 's')
position_x++; // 位置下移
}
}
void main()
{
startup(); // 数据初始化
while (1) // 游戏循环执行
{
show(); // 显示画面
updateWithoutInput(); // 与用户输入无关的更新
updateWithInput(); // 与用户输入有关的更新
}
}
第二步,实现一个正规子弹,子弹发射后自动向上移动。
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
// 全局变量
int position_x,position_y; // 飞机位置
int bullet_x,bullet_y; // 子弹位置
int high,width; // 游戏画面尺寸
void startup() // 数据初始化
{
high = 20;
width = 30;
position_x = high/2;
position_y = width/2;
bullet_x = 0;
bullet_y = position_y;
}
void show() // 显示画面
{
system("cls"); // 清屏
int i,j;
for (i=0;i<high;i++)
{
for (j=0;j<width;j++)
{
if ((i==position_x) && (j==position_y))
printf("*"); // 输出飞机*
else if ((i==bullet_x) && (j==bullet_y))
printf("|"); // 输出子弹|
else
printf(" "); // 输出空格
}
printf("\n&#