欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++实现彩色飞机大战

程序员文章站 2022-03-25 11:07:45
本文实例为大家分享了c++实现彩色飞机大战的具体代码,供大家参考,具体内容如下1.基本的能够实现键盘按上下左右进行控制飞机,击杀敌人飞机,记录得分,(缺点:死亡后不能从新玩,需要重新启动程序,),缺点...

本文实例为大家分享了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();
 } 
}

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

相关标签: C++ 飞机大战