上代码:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int main() {
int i, j;
int x = 0, y = 5,xy=5;
char in;
int is = 0,isk=0;
while(1)
{
system("cls");
if (isk == 0){
for (j = 0; j < xy; j++) {
printf(" ");
}
printf(" +\n");
}
if (is == 0) {
for (i = 0; i < x; i++) {
printf("\n");
}
}
else {
for (i = 0; i < x; i++) {
for (j = 0; j < y; j++)
printf(" ");
printf(" |\n");
if (y == xy) isk = 1;
}
is = 0;
}
for (j = 0; j < y; j++) {
printf(" ");
}
printf(" O\n");
for (j = 0; j < y; j++) {
printf(" ");
}
printf("00000\n");
for (j = 0; j < y; j++) {
printf(" ");
}
printf(" 0 0\n");
in=_getch();
if (in == 'a') y--;
if (in == 'd') y++;
if (in == 'w') x--;
if (in == 's') x++;
if (in == ' ') is = 1;
}
return 0;
}
解释:
for (i = 0; i < x; i++) {
for (j = 0; j < y; j++)
printf(" ");
printf(" |\n");
if (y == xy) isk = 1;
}
is = 0;
}
for (j = 0; j < y; j++) {
printf(" ");
}
printf(" O\n");
for (j = 0; j < y; j++) {
printf(" ");
}
printf("00000\n");
for (j = 0; j < y; j++) {
printf(" ");
}
printf(" 0 0\n");
}
大概思路就是先设定一个画布,坐标为x,y。通过两层for循环实现画布的创建。在画布创建完成的同时,我在左上角除制作出一个由“O”组成的一个简易飞机。这样一个初始化就完成了。
in=_getch();
if (in == 'a') y--;
if (in == 'd') y++;
if (in == 'w') x--;
if (in == 's') x++;
if (in == ' ') is = 1;
那么这个飞机要如何移动呢?这里是通过按键完成的,我用四个if语句完成飞机的移动,在这里,x是代表的纵轴,y代表的是横轴,当按下“a”的时候,y--,这里的意思就是说当我按下a的时候整个画布就向左缩减(画布是通过空格实现的),但是飞机按照画布的比例来说位置不变,空格减少,那么飞机也就相应的向左移动了。那么w,s,d的原理也是和上述方法一样。上述代码中出现了一段“in=_getch()”,这行代码相当于代替了scanf语句,如果不使用_getch()而是用scanf的话,就会发现每摁一次移动键你就需要按一次回车并且出现摁下的键位对应的字母,但是getch()就不需要按下回车并且不会出现字母,_getch()需要用到“#include<conio.h>”这个头文件。虽然移动确实完成了,但是运行之后会发现每次移动之后,屏幕上就会多出一个飞机,这是因为没有“清屏”的原因,要完成“清屏”的操作,就需要用到“system("cls");”这串代码了,这串代码的作用就是每进行一次操作,就清屏一次。但是想要程序正常运行的话就需要用到“#include<conio.h>”这个头文件。
if (is == 0) {
for (i = 0; i < x; i++) {
printf("\n");
}
}
else {
for (i = 0; i < x; i++) {
for (j = 0; j < y; j++)
printf(" ");
printf(" |\n");
飞机的移动已经完成,那么要怎么完成飞机的射击呢?这里还是通过循环和判断语句完成。通过循环,在飞机顶点的位置输出“|”来模拟飞机发射子弹。但是飞机的子弹要怎么消失呢?就需要通过判断语句来实现。我们设置一个变量“is”,将它赋初值为0,当“is”为零的时候,不进行输出,但是当我们按下空格的时候(也就是“ ”),那么“is”的值就变为1,则输出“|”。但是当飞机射中靶子之后,“|”又要怎么消失?接着往后看。
if (isk == 0){
for (j = 0; j < xy; j++) {
printf(" ");
}
printf(" +\n");
}
if (is == 0) {
for (i = 0; i < x; i++) {
printf("\n");
}
}
else {
for (i = 0; i < x; i++) {
for (j = 0; j < y; j++)
printf(" ");
printf(" |\n");
if (y == xy) isk = 1;
}
is = 0;
}
要让“|”消失,首先需要判断是否打到靶子,那么要如何设置靶子呢?没错,还是用的循环和判断语句。我们依旧设置一个变量“isk”,将它赋初值为0,当isk的值为零的时候,靶子出现,当我们射击出来的“|”的x轴位置与靶子的位置相同时(也就是if (y == xy) isk = 1;),那么isk的变为1,当我们进行下一步操作时,靶子就会消失啦。而要“|”消失的话就是将is继续赋值为1,那么下一步操作后子弹也会消失啦。
这个极其简单的飞机大战就完成了,但是有一个很大的漏洞就是靶子只能出现一次而且不能随机出现。