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();
	}	
}
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐