首页 > 编程语言 > C++实现彩色飞机大战
2020
10-30

C++实现彩色飞机大战

本文实例为大家分享了C++实现彩色飞机大战的具体代码,供大家参考,具体内容如下

1.基本的能够实现键盘按上下左右进行控制飞机,击杀敌人飞机,记录得分,(缺点:死亡后不能从新玩,需要重新启动程序,),缺点将在2中解决

/*隐藏光标的代码
#include <stdio.h>
#include <windows.h>
int main()
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息
CursorInfo.bVisible = false; //隐藏控制台光标
SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态
 
 
getchar();
}*/
/* 
 明白两个事实,
 敌人飞机和自己的飞机的横坐标和纵坐标相同时 表示死亡
 敌人飞机和自己的子弹碰撞即 子弹坐标和自己子弹的坐标相同时,飞机死亡并且加分,
*/

#include "stdio.h"
#include <windows.h>
#include <conio.h>
#include <time.h>
#define Esc 27 //退出
#define Up 72 //上,下,左,右
#define Down 80
#define Left 75
#define Right 77
#define Kong 32 //发射子弹


int x = 10; //飞机坐标
int y = 18;

int d2 = 10;//敌机坐标
int d1 = 10;
int d = 10;//d 和r 用来进行碰撞检测
int r = 1;
int r1 = 1;
int r2 = 1;


int t = 1; // 游戏结束
int f = 0; // 计分数
int m = 5; // 敌机数
int j = 0; // 歼敌数
char p; // 接受按键


void kongzhi(int bx, int by);//声明函数
void huatu();


void gotoxy(int x, int y) //移动坐标
{
 COORD coord;
 coord.X = x;
 coord.Y = y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),3);
 
}
void gotoxy_red(int x, int y) //移动坐标
{
 COORD coord;
 coord.X = x;
 coord.Y = y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),4);
 
}
void gotoxy_blue(int x, int y) //移动坐标
{
 COORD coord;
 coord.X = x;
 coord.Y = y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),1);
 
}
void gotoxy_green(int x, int y) //移动坐标
{
 COORD coord;
 coord.X = x;
 coord.Y = y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),2);
 
}
void hidden()//隐藏光标,不让光标显示
{
 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
 CONSOLE_CURSOR_INFO cci;
 GetConsoleCursorInfo(hOut, &cci);
 cci.bVisible = 0;//赋1为显示,赋0为隐藏
 SetConsoleCursorInfo(hOut, &cci);
}
//**************************************************************************************


//说明
void shuoming()
{
 printf("\t\t\t\n\n\n\n");
 gotoxy_blue(0, 0);
 printf("\t\t\t\t\t\t\tPlane Control\n\n"
 "\t\t\t\t\t\t\t\tUP\n\n"
 "\t\t\t\t\t\t\tDown\n\n"
 "\t\t\t\t\t\t\tLeft \n\n"
 "\t\t\t\t\t\t\tRight \n\n"
 "\t\t\t\t\t\t\t bullet space\n\n\n"
 "\t\t\t\t\t\t\tQuit Esc\n");
 

 gotoxy_red(0, 0);
}


//****************************************************************************************


//判断我机死没死/游戏结束
void byebye()
{
 if (((x == d && y == r) || (x == d1 && y == r1) || (x == d2 && y == r2))||( (d>=19||r>=19)||(d1>=19||r1>=19)||(d1>=19||r1>=19) ))
 {
 gotoxy(1, 3);
 printf(" !!! 游戏结束 !!!\n"
 "*******************\n"
 " 您的总得分: %d\n\n"
 " 敌机数: %d\n"
 " 歼敌数: %d\n"
 " 命中率: %.0f %%\n"
 "*******************\n", f, m, j, ((float)j / (float)m) * 100);
 while (!_kbhit())
 {
 Sleep(500);
 gotoxy(1, 12);
 printf(" 继续请按任意键...\n\n\n");
 Sleep(900);
 gotoxy(1, 12);
 printf(" ");
 }
 gotoxy_red(0, 0);
 huatu();
 f = 0; m = 0; j = 0;
 if (x >= 18) x--;
 else x++;
 gotoxy(x, y);
 printf("A");
 }
}
// 计分/更新敌机
void jifan()
{ //x,y是子弹的坐标
 if (x == d && y == r) // d=10, r=1, d,d1,d2 是敌机的x轴, 为10 ,r为敌机的纵坐标
 {
 gotoxy(d, r); printf("3");
 Sleep(200);
 gotoxy(d, r); printf(" "); f += 2; r = 0; j++;//让r=0,即是让敌人的飞机消失
 }
 if (x == d1 && y == r1)
 {
 gotoxy(d1, r1); printf("1");
 Sleep(200);
 gotoxy(d1, r1); printf(" "); f += 3; r1 = 0; j++;
 }
 if (x == d2 && y == r2)
 {
 gotoxy(d2, r2); printf("0");
 Sleep(200);
 gotoxy(d2, r2); printf(" "); f += 1; r2 = 0; j++;
 }

 gotoxy(57, 2);
 printf("%d\n", f);

}
//画图
void huatu()
{
 int i, n;

 for (i = 0; i <= 20; i++)
 {
 for (n = 0; n <= 20; n++)
 {
 printf("*");
 }
 printf("\n");
 }
 for (i = 1; i <= 19; i++)
 {
 for (n = 1; n <= 19; n++)
 {
 gotoxy_red(i, n);
 printf(" ");
 }
 }
}


//随机产生敌机
void dfeiji()
{
 while (t)
 {
 if (!r) { d = rand() % 17 + 1; m++; } //r,r1,r2 初始值都为1,当变为0的时候开始产生随机数
 if (!r1) { d1 = rand() % 17 + 1; m++; }
 if (!r2) { d2 = rand() % 17 + 1; m++; }

 while (t)
 { 
 r=r+2; r1=r1+2; r2=r2+2;
 gotoxy(d, r); printf("b");//d,d1, d2 为敌机产生的位置,都为10
 gotoxy(d1, r1); printf("c");
 gotoxy(d2, r2); printf("d");
 Sleep(900);
 gotoxy(d, r); printf(" ");
 gotoxy(d1, r1); printf(" ");
 gotoxy(d2, r2); printf(" ");


 kongzhi(0, 0);//控制飞机后,要立即进行判断
 byebye();//判断飞机有没有死亡
 if (r == 19) r = 0;
 if (r1 == 19) r1 = 0;
 if (r2 == 19) r2 = 0;
 if (r == 0 || r1 == 0 || r2 == 0) break;
 }
 }
}


//操控飞机
void kongzhi(int bx, int by)//调用的时候传入了 0, 0
{
 int a;


 while (_kbhit())
 {
 if ((p = _getch()) == -32) p = _getch();
 a = p;
 gotoxy(22, 5);

 switch (a)
 {//控制方向
 case Up:if (y != 1)
 {
 gotoxy(x, y); printf(" ");
 y--;
 gotoxy(x, y); printf("A");
 }break;
 case Down:if (y != 18)
 {
 gotoxy(x, y); printf(" ");
 y++;
 gotoxy(x, y); printf("A");
 }break;
 case Left:if (x != 1)
 {
 gotoxy(x, y); printf(" ");
 x--;
 gotoxy(x, y); printf("A");
 }break;
 case Right:if (x != 18)
 {
 gotoxy(x, y); printf(" ");
 x++;
 gotoxy(x, y); printf("A");
 }break;
 case Kong: { bx = y;//先把y的值存起来,存到bx
 for (by = y; by > 1;) //发射子弹, y轴坐标一直减减,打印 |
 {
 by--;//y的坐标
 gotoxy(x, by); printf("|");
 Sleep(10);
 gotoxy(x, by); printf(" ");
 y = by;//记录子弹打到哪了,好进行碰撞检测
 jifan();//计分数
 if (r == 0 || r1 == 0 || r2 == 0) break;
 }
 y = bx;//恢复y的值
 }break;

 case Esc:t = 0; break; //退出

 default:break;
 }
 }
}

int main()
{
 srand(time(NULL));
 shuoming();//打印游戏说明,之后让光标进入0,0
 hidden();//隐藏光标,不让光标显示
 huatu();//画出墙壁
 gotoxy(x, y);//x=10,y=8, x 和y 是自己飞机的坐标,是全局变量
 printf("A");

 gotoxy(50, 2);
 printf("Score:");
 while (t) //t是一个全局变量 初始值为1
 {
 kongzhi(0, 0);//调用控制飞机函数, (操作飞机后并记分数)
 if (t) //如果游戏没有结束,则 产生敌机
 dfeiji();//产生敌机 ,并判断飞机有没有死亡
 }

}

2.(封装了一个函数)结束游戏后能够重新开始进行下一局

/*隐藏光标的代码
#include <stdio.h>
#include <windows.h>
int main()
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息
CursorInfo.bVisible = false; //隐藏控制台光标
SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态
 
 
getchar();
}*/
/* 
 明白两个事实,
 敌人飞机和自己的飞机的横坐标和纵坐标相同时 表示死亡
 敌人飞机和自己的子弹碰撞即 子弹坐标和自己子弹的坐标相同时,飞机死亡并且加分,
*/

#include "stdio.h"
#include <windows.h>
#include <conio.h>
#include <time.h>
#define Esc 27 //退出
#define Up 72 //上,下,左,右
#define Down 80
#define Left 75
#define Right 77
#define Kong 32 //发射子弹


int x = 10; //飞机坐标
int y = 18;

int d2 = 10;//敌机坐标
int d1 = 10;
int d = 10;//d 和r 用来进行碰撞检测
int r = 1;
int r1 = 1;
int r2 = 1;


int t = 1; // 游戏结束
int f = 0; // 计分数
int m = 5; // 敌机数
int j = 0; // 歼敌数
char p; // 接受按键


void kongzhi(int bx, int by);//声明函数
void huatu();


void gotoxy(int x, int y) //移动坐标
{
 COORD coord;
 coord.X = x;
 coord.Y = y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),3);
 
}
void gotoxy_red(int x, int y) //移动坐标
{
 COORD coord;
 coord.X = x;
 coord.Y = y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),4);
 
}
void gotoxy_blue(int x, int y) //移动坐标
{
 COORD coord;
 coord.X = x;
 coord.Y = y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),1);
 
}
void gotoxy_green(int x, int y) //移动坐标
{
 COORD coord;
 coord.X = x;
 coord.Y = y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),2);
 
}
void hidden()//隐藏光标,不让光标显示
{
 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
 CONSOLE_CURSOR_INFO cci;
 GetConsoleCursorInfo(hOut, &cci);
 cci.bVisible = 0;//赋1为显示,赋0为隐藏
 SetConsoleCursorInfo(hOut, &cci);
}
//**************************************************************************************


//说明
void shuoming()
{
 printf("\t\t\t\n\n\n\n");
 gotoxy_blue(0, 0);
 printf("\t\t\t\t\t\t\tPlane Control\n\n"
 "\t\t\t\t\t\t\t\tUP\n\n"
 "\t\t\t\t\t\t\tDown\n\n"
 "\t\t\t\t\t\t\tLeft \n\n"
 "\t\t\t\t\t\t\tRight \n\n"
 "\t\t\t\t\t\t\t bullet space\n\n\n"
 "\t\t\t\t\t\t\tQuit Esc\n");
 

 gotoxy_red(0, 0);
}


//****************************************************************************************


//判断我机死没死/游戏结束
void byebye()
{
 if (((x == d && y == r) || (x == d1 && y == r1) || (x == d2 && y == r2))||( (d>=19||r>=19)||(d1>=19||r1>=19)||(d1>=19||r1>=19) ))
 {
 gotoxy(1, 3);
 printf(" !!! game over !!!\n"
 "*******************\n"
 " score: %d\n\n"
 " di ji shu: %d\n"
 " jian di shu: %d\n"
 " ming zhong lv: %.0f %%\n"
 "*******************\n", f, m, j, ((float)j / (float)m) * 100);
 t=0;
 
 }
}
// 计分/更新敌机
void jifan()
{ //x,y是子弹的坐标
 if (x == d && y == r) // d=10, r=1, d,d1,d2 是敌机的x轴, 为10 ,r为敌机的纵坐标
 {
 gotoxy(d, r); printf("3");
 Sleep(200);
 gotoxy(d, r); printf(" "); f += 2; r = 0; j++;//让r=0,即是让敌人的飞机消失
 }
 if (x == d1 && y == r1)
 {
 gotoxy(d1, r1); printf("1");
 Sleep(200);
 gotoxy(d1, r1); printf(" "); f += 3; r1 = 0; j++;
 }
 if (x == d2 && y == r2)
 {
 gotoxy(d2, r2); printf("0");
 Sleep(200);
 gotoxy(d2, r2); printf(" "); f += 1; r2 = 0; j++;
 }

 gotoxy(57, 2);
 printf("%d\n", f);

}
//画图
void huatu()
{
 int i, n;

 for (i = 0; i <= 20; i++)
 {
 for (n = 0; n <= 20; n++)
 {
 printf("*");
 }
 printf("\n");
 }
 for (i = 1; i <= 19; i++)
 {
 for (n = 1; n <= 19; n++)
 {
 gotoxy_red(i, n);
 printf(" ");
 }
 }
}


//随机产生敌机
void dfeiji()
{
 while (t)
 {
 if (!r) { d = rand() % 17 + 1; m++; } //r,r1,r2 初始值都为1,当变为0的时候开始产生随机数
 if (!r1) { d1 = rand() % 17 + 1; m++; }
 if (!r2) { d2 = rand() % 17 + 1; m++; }

 while (t)
 { 
 r=r+2; r1=r1+2; r2=r2+2;
 gotoxy(d, r); printf("b");//d,d1, d2 为敌机产生的位置,都为10
 gotoxy(d1, r1); printf("c");
 gotoxy(d2, r2); printf("d");
 Sleep(900);
 gotoxy(d, r); printf(" ");
 gotoxy(d1, r1); printf(" ");
 gotoxy(d2, r2); printf(" ");


 kongzhi(0, 0);//控制飞机后,要立即进行判断
 byebye();//判断飞机有没有死亡
 if (r == 19) r = 0;
 if (r1 == 19) r1 = 0;
 if (r2 == 19) r2 = 0;
 if (r == 0 || r1 == 0 || r2 == 0) break;
 }
 }
}


//操控飞机
void kongzhi(int bx, int by)//调用的时候传入了 0, 0
{
 int a;


 while (_kbhit())
 {
 if ((p = _getch()) == -32) p = _getch();
 a = p;
 gotoxy(22, 5);

 switch (a)
 {//控制方向
 case Up:if (y != 1)
 {
 gotoxy(x, y); printf(" ");
 y--;
 gotoxy(x, y); printf("A");
 }break;
 case Down:if (y != 18)
 {
 gotoxy(x, y); printf(" ");
 y++;
 gotoxy(x, y); printf("A");
 }break;
 case Left:if (x != 1)
 {
 gotoxy(x, y); printf(" ");
 x--;
 gotoxy(x, y); printf("A");
 }break;
 case Right:if (x != 18)
 {
 gotoxy(x, y); printf(" ");
 x++;
 gotoxy(x, y); printf("A");
 }break;
 case Kong: { bx = y;//先把y的值存起来,存到bx
 for (by = y; by > 1;) //发射子弹, y轴坐标一直减减,打印 |
 {
 by--;//y的坐标
 gotoxy(x, by); printf("|");
 Sleep(10);
 gotoxy(x, by); printf(" ");
 y = by;//记录子弹打到哪了,好进行碰撞检测
 jifan();//计分数
 if (r == 0 || r1 == 0 || r2 == 0) break;
 }
 y = bx;//恢复y的值
 }break;

 case Esc:t = 0; break; //退出

 default:break;
 }
 }
}

void zuzhong(){
 x = 10; //飞机坐标
  y = 18;

 d2 = 10;//敌机坐标
 d1 = 10;
 d = 10;//d 和r 用来进行碰撞检测
 r = 1;
 r1 = 1;
 r2 = 1;


 t = 1; // 游戏结束
 f = 0; // 计分数
 m = 5; // 敌机数
 j = 0; // 歼敌数
char p; // 接受按键

 srand(time(NULL));
 shuoming();//打印游戏说明,之后让光标进入0,0
 hidden();//隐藏光标,不让光标显示
 huatu();//画出墙壁
 gotoxy(x, y);//x=10,y=8, x 和y 是自己飞机的坐标,是全局变量
 printf("A");

 gotoxy(50, 2);
 printf("Score:");
 while (t) //t是一个全局变量 初始值为1
 {
 kongzhi(0, 0);//调用控制飞机函数, (操作飞机后并记分数)
 if (t) //如果游戏没有结束,则 产生敌机
 dfeiji();//产生敌机 ,并判断飞机有没有死亡
 }

}
int main()
{
 while(1){
 system("cls");
 zuzhong();
 printf("please enter Enter key contine");
 getchar();
 } 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自学编程网。

编程技巧