以下两种代码均适用于初学者:
先上第一种粗糙的代码,讲解都在代码中了。
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
//定义全局变量
int position_x,position_y ;//飞机所在的初始位置
int zidan_x,zidan_y;//子弹所在位置
int diji_x,diji_y;//敌机所在位置
int high,wide;//画面大小
int score;//得分
void chushi(){//数据初始化
high=20;
wide=30;
position_x=10;
position_y=15;
zidan_x=-2;//子弹开始时失效
zidan_y=15;
diji_x=0;//开始时敌机的位置可以自定义
diji_y=15;
score=0;
}
void show(){//显示画面
system("cls");
int i,j;
for(i=0;i<high;i++){
for(j=0;j<wide;j++){
if(i==position_x&&j==position_y)
printf("*");//飞机显示
else if(i==diji_x&&j==diji_y)
printf("o");//敌机显示
else if(i==zidan_x&&j==zidan_y)
printf("|");//子弹显示
else
printf(" ");
}
printf("\n");//换行
}
printf("得分为:%d",score);
}
void x1(){
if(zidan_x>-1)
zidan_x--;//子弹飞行
if(zidan_x==diji_x&&zidan_y==diji_y){//击中敌机
score++;
diji_x=-1;//敌机消失,至于为什么等于-1后面会讲
diji_y=rand()%wide;//生成新的位置
zidan_x=-2;//子弹失效
}
if(diji_x>high) {
diji_x=-1;
diji_y=rand()%wide;//敌机飞出界面了重新生成
}
static int speed=0;
if(speed<10){
speed++;
}
if(speed==10){
speed=0;
diji_x++;//每过10次循环,敌机才往下移动一次,不然刷新会太快
}
}
void x2(){//开始输入
char shuru;
if(kbhit()){
shuru=getch();
if(shuru=='a')
position_y--;
if(shuru=='d')
position_y++;
if(shuru=='w')
position_x--;
if(shuru=='s')
position_x++;//控制飞机移动
if(shuru==' '){
zidan_x=position_x-1;//子弹应该从飞机上面那一行射出
zidan_y=position_y;
}
}
}
int main(){//整合函数
chushi();
while(1){
show();
x1();
x2();
}
}
这里我们运行后会发现光标乱闪和频闪严重的问题,但是不影响程序运行,不追求界面上面这个就可以了 。
下面的是界面优化后的效果:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
//定义全局变量
int position_x,position_y ;//飞机所在的初始位置
int zidan_x,zidan_y;//子弹所在位置
int diji_x,diji_y;//敌机所在位置
int high,wide;//画面大小
int score;//得分
void chushi(){//数据初始化
high=20;
wide=30;
position_x=high/2;
position_y=wide/2;
zidan_x=-2;//子弹开始时失效
zidan_y=15;
diji_x=0;//开始时敌机的位置可以自定义
diji_y=position_y;
score=0;
}
void gotxy(int x,int y){//解决频闪问题
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(handle,pos);
}
void yincang(){//隐藏光标
CONSOLE_CURSOR_INFO cursor_info={1,0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
void show(){//显示画面
gotxy(0,0);
int i,j;
for(i=0;i<high;i++){
for(j=0;j<wide;j++){
if(i==position_x&&j==position_y)
printf("*");//飞机显示
else if(i==diji_x&&j==diji_y)
printf("o");//敌机显示
else if(i==zidan_x&&j==zidan_y)
printf("|");//子弹显示
else
printf(" ");
}
printf("\n");//换行
}
printf("得分为:%d",score);
}
void x1(){
if(zidan_x>-1)
zidan_x--;//子弹飞行
if(zidan_x==diji_x&&zidan_y==diji_y){//击中敌机
score++;
diji_x=-1;//敌机消失,至于为什么等于-1后面会讲
diji_y=rand()%wide;//生成新的位置
zidan_x=-2;//子弹失效
}
if(diji_x>high) {
diji_x=-1;
diji_y=rand()%wide;//敌机飞出界面了重新生成
}
static int speed=0;
if(speed<10){
speed++;
}
if(speed==10){
speed=0;
diji_x++;//每过10次循环,敌机才往下移动一次,不然刷新会太快
}
}
void x2(){//开始输入
char shuru;
if(kbhit()){
shuru=getch();
if(shuru=='a')
position_y--;
if(shuru=='d')
position_y++;
if(shuru=='w')
position_x--;
if(shuru=='s')
position_x++;//控制飞机移动
if(shuru==' '){
zidan_x=position_x-1;//子弹应该从飞机上面那一行射出
zidan_y=position_y;
}
}
}
int main(){//整合函数
chushi();
yincang();
while(1){
show();
x1();
x2();
}
}
这里面主要加了两段函数:
void gotxy(int x,int y){//解决频闪问题
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(handle,pos);
}
void yincang(){//隐藏光标
CONSOLE_CURSOR_INFO cursor_info={1,0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
但这里需要注意的是如果打印复杂的飞机图案就不能直接改动了,光标的移动会导致画面出现重复,建议用 system(“cls”)来清屏。
其他的地方就请发挥想象力,修改弹道或者飞机图案等等。
希望能给你们带来帮助!!!!