飞机大战小游戏项目

        文末附可执行程序。

        这是一个飞机大战小游戏项目。说起这个项目,还要从我大二时候说起,距今已经五年了。大二暑假老师布置了一个实习项目使用C语言开发一个小游戏。我当时觉得很激动,最近因为一些原因翻到了这个,所以就分享出来,希望这个项目能对同样有学校课设要求的同学提供些许帮助。

        "现在再来看这个项目,感触很深。我是自动化专业的,当时没有系统学过计算机专业知识,只是有一门C语言的课,和老师提供的一个在控制台打印字符的函数,使用这两个基础知识,加上当时的热情,手攒(cuan,二声)了一个小游戏。虽然现在看来这些代码有很多不规范的地方。但是我还是能想起那时的喜悦。"

        这个项目运行在windows 32位环境下,作者使用VS2019可以正常编译运行该程序。

        该小游戏使用键盘操作,并支持:

        1.登陆界面显示(1,建立存档 2.读取存档 3.退出  ad选择 空格确定 )

        2.敌机随机生产,玩家上下左右移动,炮弹显示刷新

        3.击杀敌机特效,攻击特效,血条显示

        4.暂停和存档

        5.其它还有啥忘记了

部分界面显示

        

       

 可执行程序

默认登录名:admin

密码:admin123

/*逐步完善算法设计和游戏模式.上次修改:09-09-2018*/
/*核心步骤由make_enemoy(arguments .etc)实现,其他函数均为格式输出和流程控制*/
/*welcome()函数为接口,若想调用此程序,调用此函数即可,返回值*/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#include<math.h>
#include<time.h>
#include <mmsystem.h>
#pragma comment( lib, "winmm.lib" ) 

#define MAX 20
#define MS 20

struct enemoy
{
	int X;
	int Y;
};

struct allay
{
	int X;
	int Y;
};

struct state1
{
	int level;
	int life;
	int flag;
	int end;
	int load;
	int lv;
	int new_m;
	int shot;
};


struct bullet
{
	int X;
	int flag;
	int record;
	int p;
	int sx;
	int sy;
};

struct enemoy_bullect
{
	int X;
	int f;
	int f1;
};

struct enemoy_speed
{
	int speed;
	int speed_flag;
};

struct shot
{
	int bx;
	int by;
	int bf;
	int bn;
	int gap;
};

void login();
void fire_aircraft(int x, int y, int form, struct bullet* state);
void welcome_menu();
void core_function(struct state1* data, struct bullet* state, struct allay* posit, struct enemoy* place, struct enemoy_bullect* d, struct enemoy_speed* s, struct shot* sh);
void welcome();
void fire_enemoy(struct enemoy* p, int n);
void show_enemoy(char(*ch)[7], int x, int y);
void gotoxy(int x, int y);
void HideCursor();
void platform();
void lifebar();
void show_aircraft_print(char(*ch)[11], int x, int y);
void show_aircraft(int x, int y, int form);
void clear_local(int x, int y);
void update_bar(struct state1* data);
void control_aircraft(int* p_x, int* p_y, int form, struct state1* data, struct bullet* state, struct enemoy* place, struct enemoy_bullect* d, struct allay* posit, struct enemoy_speed* s, struct shot* sh);
void target(int x, int y);
void update_platform();
void update_menu(struct state1* data, struct bullet* state);
void fire_power2(struct state1* data, struct bullet* state, struct enemoy* place, struct enemoy_bullect* d);
void fire_power(struct state1* data, struct bullet* state, struct enemoy* place, struct enemoy_bullect* d, struct allay* posit);

void make_enemoy(int* flag, int level, struct state1* data, struct bullet* state, struct enemoy* place, struct enemoy_bullect* d, struct enemoy_speed* s, struct allay* posit, struct shot* sh);
void load_maxmak(struct state1* data);
void shot(struct shot* sh, struct allay* posit, struct state1* data);

int is_get(struct enemoy* p, struct bullet* state, struct allay* posit);
int is_faild(struct enemoy* p, struct enemoy_bullect* p1, struct allay* posit);
int save(struct enemoy* place, struct enemoy_speed* s, struct bullet* state, struct state1* data, struct allay* posit);
int load(struct enemoy* place, struct enemoy_speed* s, struct bullet* state, struct state1* data, struct allay* posit);
int save_maxmak(struct bullet* state, struct state1* data);


void login()
{
	char account[] = { "admin" };
	char password[] = { "admin123" };
	char account1[10];
	char password1[10];
	int i = 0;

	do
	{
		printf("please enter your account:");
		scanf("%s", account1);
		printf("please enter your password:");
		scanf("%s", password1);
		if (strcmp(account, account1) == 0 && strcmp(password, password1) == 0)
		{
			system("cls");
			printf("loading......\n按任意键继续");
			_getch();
			welcome();
		}
		else
		{
			i++;
			if (i == 3)
			{
				printf("Sorry , please try again later.\n");
				exit(0);
			}

			else
			{
				printf("Your user account/password combination was not correct. Please try again.\n");

			}
		}
	} while (i < 3);


}
int save_maxmak(struct bullet* state, struct state1* data)
{
	FILE* fp;
	int n;
	if (state->record > data->new_m)
	{
		fp = fopen("d:\\datamark", "wb");
		if (fp == NULL)
			return 0;
		n = fwrite(&state->record, sizeof(state->record), 1, fp);
		if (n != 1)
		{
			fclose(fp);
			return 0;
		}
		fclose(fp);
	}
	return 1;

}
void load_maxmak(struct state1* data)
{
	FILE* fp;
	int n;
	fp = fopen("d:\\datamark", "rb");
	if (fp == NULL)
		return;
	n = fread(&data->new_m, sizeof(data->new_m), 1, fp);
	if (n != 1)
	{
		data->new_m = 0;

		fclose(fp);
		return;
	}
	fclose(fp);

	return;
}

void welcome_menu()
{
	int i;
	gotoxy(0, 0); printf("-------------------------------------------------------------------------------------------------------------------");
	for (i = 0; i < 40; i++)
	{
		gotoxy(0, 1 + i);
		printf("||");
		gotoxy(113, i + 1);
		printf("||");
	}

	gotoxy(0, 41); printf("-------------------------------------------------------------------------------------------------------------------");
	gotoxy(0, 42); printf("\t\t开始新游戏\t\t导入存档\t\t 退出            a/d键选择 空格确定");
	gotoxy(0, 43); printf("-------------------------------------------------------------------------------------------------------------------");
	gotoxy(14, 42); printf("*");

}


void welcome()
{


	char ch;
	int i, n = 1, p = 14, num = 0, p_x = rand() % 70 + 10, p_y = rand() % 20 + 10, xr = 1, yr = 1;

	struct enemoy place[MAX] = { 0 };
	struct allay posit = { 63,31 };
	struct state1 data = { 0,100,0,0,0,0,0,0 };
	struct bullet state = { 0,0,0,0,0,0 };
	struct enemoy_bullect d[MAX] = { 0 };
	struct enemoy_speed s[MAX] = { 0 };
	struct shot sh[MS];

	for (i = 0; i < MS; i++)
	{
		sh[i].bf = 0;
		sh[i].bn = 1;
		sh[i].bx = 0;
		sh[i].by = 1;
		sh[i].gap = 7;
	}
	system("mode con cols=116 lines=44");
	system("cls");
	welcome_menu();
	load_maxmak(&data);
	while (1)
	{
		HideCursor();
		num++;
		if (_kbhit())
		{
			ch = _getch();
			if (ch == 'a' || ch == 'd' || ch == ' ' || ch == 'z' || ch == 'A' || ch == 'D' || ch == 'Z')
			{
				switch (ch)
				{
				case 'A':
				case 'a':if (p - 25 > 0) { gotoxy(0, 42); printf("                                                                                                                   ");	gotoxy(0, 42); printf("\t\t开始新游戏\t\t导入存档\t\t 退出            a/d键选择 空格确定"); gotoxy(p - 25, 42); printf("*"); n--; p -= 25; }
						break;
				case 'D':
				case 'd':if (p + 25 < 80) { gotoxy(0, 42); printf("                                                                                                                   ");	gotoxy(0, 42); printf("\t\t开始新游戏\t\t导入存档\t\t 退出            a/d键选择 空格确定"); gotoxy(p + 25, 42); printf("*"); n++; p += 25; }
						break;
				case 'Z':
				case 'z':system("cls"); welcome_menu(); continue; break;
				}
				if (ch == ' ')
				{
					if (n == 1)
					{
						for (i = 0; i < MAX; i++)
						{
							place[i].Y = 0;
							place[i].X = 0;
						}
						data.level = 0;
						data.life = 100;
						data.flag = 0;
						state.record = 0;
						data.lv = 0;
						data.load = 0;
						data.end = 0;
						system("cls");
						core_function(&data, &state, &posit, place, d, s, sh);
					}
					else if (n == 2)
					{
						if (load(place, s, &state, &data, &posit))
						{
							gotoxy(0, 42); printf("                                                                                          ");
							gotoxy(30, 42);	printf("导入成功!按任意键进入游戏"); _getch(); data.end = 0; data.load = 1; system("cls"); core_function(&data, &state, &posit, place, d, s, sh);

						}
						else
						{
							gotoxy(0, 42);
							printf("                                                                                          ");
							gotoxy(30, 42);	printf("导入失败!按任意键返回"); _getch(); welcome();
						}
					}
					else if (n == 3)
						exit(0);
					else;
				}
			}
			gotoxy(0, 43); printf("-------------------------------------------------------------------------------------------------------------------");
			gotoxy(0, 41); printf("-------------------------------------------------------------------------------------------------------------------");
		}
		if (num % 5000 == 0)
		{
			update_platform();

			if (rand() % 2)
				xr = -xr;
			if (rand() % 2)
				yr = -yr;
			if (p_x >= 92)
				xr = -1;
			if (p_y >= 34)
				yr = -1;
			if (p_x <= 4)
				xr = 1;
			if (p_y <= 4)
				yr = 1;
			p_x += xr;
			p_y += yr;
			show_aircraft(p_x, p_y, rand() % 4 + 1);

		}
	}
}

void gotoxy(int x, int y)
{
	COORD coord = { x,y };
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void HideCursor()
{
	CONSOLE_CURSOR_INFO cursor_info = { 1,0 };
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

void shot(struct shot* sh, struct allay* posit, struct state1* data)
{
	static  int y[MS], x[MS];
	int i, t = 0;

	for (i = 0; i < MS; i++)
	{
		sh[i].gap--;
		if ((sh + i)->bf == 1)
		{
			if ((sh + i)->bn == 1)
			{
				y[i] = posit->Y;
				x[i] = posit->X;
				(sh + i)->bx = x[i] + 5;
				(sh + i)->by = y[i] - 1;
				gotoxy(x[i] + 5, y[i] - 1);
				printf("!");
				(sh + i)->bn = 0;

			}
			if ((sh + i)->gap <= 0)
			{
				gotoxy(x[i] + 5, y[i]);
				printf(" ");
				y[i]--;
				if (y[i] >= 3)
				{
					gotoxy(x[i] + 5, y[i]);
					(sh + i)->by = y[i];
					printf("!");

				}
				else
				{
					(sh + i)->bf = 0;
					(sh + i)->bn = 1;
					(sh + i)->gap = 7;
				}
				(sh + i)->gap = 7;
			}

		}
		t += (sh + i)->bf;
	}
	data->shot = t;
}

int save(struct enemoy* place, struct enemoy_speed* s, struct bullet* state, struct state1* data, struct allay* posit)
{
	int i, n;
	FILE* fp;
	fp = fopen("d:\\data", "wb");

	if (fp == NULL)
		return 0;
	for (i = 0; i < MAX; i++)
	{
		n = 0;
		n = fwrite(&place[i], sizeof(struct enemoy), 1, fp);
		if (n != 1)
			break;
		n = 0;
		n = fwrite(&s[i], sizeof(struct enemoy_speed), 1, fp);
		if (n != 1)
			break;
	}

	if (i != MAX)
	{
		fclose(fp);
		return 0;
	}
	n = fwrite(&data->level, sizeof(data->level), 1, fp) + fwrite(&data->life, sizeof(data->life), 1, fp) + fwrite(&data->end, sizeof(data->end), 1, fp) + fwrite(&data->flag, sizeof(data->flag), 1, fp) + fwrite(&data->load, sizeof(data->load), 1, fp) + fwrite(&data->lv, sizeof(data->lv), 1, fp) + fwrite(&state->record, sizeof(state->record), 1, fp) + fwrite(&posit->X, sizeof(posit->X), 1, fp) + fwrite(&posit->Y, sizeof(posit->Y), 1, fp);

	if (n != 9)
	{
		fclose(fp);
		return 0;

	}


	fclose(fp);

	return 1;

}


int load(struct enemoy* place, struct enemoy_speed* s, struct bullet* state, struct state1* data, struct allay* posit)
{
	int i, n;
	FILE* fp;
	fp = fopen("d:\\data", "rb");
	if (fp == NULL)
		return 0;
	for (i = 0; i < MAX; i++)
	{
		n = 0;
		n = fread(&place[i], sizeof(struct enemoy), 1, fp);
		if (n != 1)
			break;
		n = 0;
		n = fread(&s[i], sizeof(struct enemoy_speed), 1, fp);
		if (n != 1)
			break;
	}
	if (i != MAX)
	{
		fclose(fp);
		return 0;
	}
	n = fread(&data->level, sizeof(data->level), 1, fp) + fread(&data->life, sizeof(data->life), 1, fp) + fread(&data->end, sizeof(data->end), 1, fp) + fread(&data->flag, sizeof(data->flag), 1, fp) + fread(&data->load, sizeof(data->load), 1, fp) + fread(&data->lv, sizeof(data->lv), 1, fp) + fread(&state->record, sizeof(state->record), 1, fp) + fread(&posit->X, sizeof(posit->X), 1, fp) + fread(&posit->Y, sizeof(posit->Y), 1, fp);
	if (n != 9)
	{
		fclose(fp);
		return 0;
	}
	fclose(fp);
	return 1;
}
void platform()
{
	int i;

	gotoxy(0, 0);
	printf("-------------------------------------------------------------------------------------------------------------------");
	for (i = 0; i < 40; i++)
	{
		gotoxy(0, 1 + i); printf("||"); gotoxy(113, i + 1); printf("||");
	}
	gotoxy(0, 41);

	printf("-------------------------------------------------------------------------------------------------------------------");

	gotoxy(0, 43);
	printf("-------------------------------------------------------------------------------------------------------------------");

}

void update_platform()
{
	int i;
	for (i = 1; i < 41; i++)
	{
		gotoxy(3, i);
		printf("                                                                                                              ");
	}

}

void update_menu(struct state1* data, struct bullet* state)
{
	int i, n = 1, gap = 0, flag = 1;

	switch (data->level)
	{
	case 1:
	case 2:
	case 3:gap = data->level * 100 - state->record * 10; break;
	case 4:flag = 0;
	};

	gotoxy(115, 0);
	printf("||===============|");
	for (i = 0; i < 6; i++)
	{
		gotoxy(115, n++); printf("||");
		gotoxy(132, n - 1); printf("|");
	}
	gotoxy(115, n++); printf("||level:%4d    |", data->level);
	gotoxy(115, n++); printf("||               |");
	gotoxy(115, n++); printf("||               |");
	gotoxy(115, n++); printf("||               |");
	gotoxy(115, n++); printf("||gold:%4d      |", state->record);
	gotoxy(115, n++); printf("||               |");
	gotoxy(115, n++);

	if (flag == 1)
		printf("||level up:%4d  |", data->level * 100 - state->record * 10);
	else
		printf("||level up:max   |");

	gotoxy(115, n++); printf("||               |");
	gotoxy(115, n++); printf("||life:%4d      |", data->life);

	for (i = 0; i < 26; i++)
	{
		gotoxy(115, n++); printf("||");
		gotoxy(132, n - 1); printf("|");
	}

	gotoxy(115, n++); printf("||===============|");
	gotoxy(118, 3); printf("历史最高;%d", data->new_m);
	gotoxy(118, 17); printf("按z键刷新界面");
	gotoxy(118, 19); printf("按m键发射射线");
	gotoxy(118, 21); printf("按n键召唤攻击");
	gotoxy(118, 22); printf("自动定位");
	gotoxy(118, 23); printf("会减少10血量");
	gotoxy(118, 26); printf("按q键返回菜单");
	gotoxy(118, 27); printf("并存档");
	gotoxy(118, 30); printf("按p键暂停");
	gotoxy(118, 31); printf("按b键大招");
	gotoxy(118, 32); printf("需要10金币");
	gotoxy(118, 35); printf("当金币增加10时");
	gotoxy(118, 36); printf("血量+10无上限");
	gotoxy(118, 38); printf("当等级小于4时");
	gotoxy(118, 39); printf("使用金币会降级");
	gotoxy(118, 40); printf("当顶级4时");
	gotoxy(118, 41); printf("无此限制");
}

void show_aircraft_print(char(*ch)[11], int x, int y)
{
	int i, j;

	for (i = 0; i < 5; i++) {
		gotoxy(x, y + i);
		for (j = 0; j < 11; j++)
			printf("%c", *(*(ch + i) + j));

	}
}

void show_aircraft(int x, int y, int form)         // x is a horizontal direction, y is a vertical direction
{
	char form_1[5][11] = {
		{' ',' ',' ',' ',' ','*',' ',' ',' ',' ',' '},
		{' ',' ',' ',' ',' ','*',' ',' ',' ',' ',' '},
		{'*','*','*','*','*','*','*','*','*','*','*'},
		{' ',' ',' ',' ',' ','*',' ',' ',' ',' ',' '},
		{' ',' ',' ','*','*','*','*','*',' ',' ',' '},
	};
	char form_2[5][11] = {
		{' ',' ',' ',' ',' ','*',' ',' ',' ',' ',' '},
		{' ',' ',' ','*',' ','*',' ','*',' ',' ',' '},
		{'*','*','*','*','*','*','*','*','*','*','*'},
		{' ','*',' ',' ','*','*','*',' ',' ','*',' '},
		{' ',' ',' ','*','*','*','*','*',' ',' ',' '},
	};
	char form_3[5][11] = {
		{' ',' ',' ',' ',' ','*',' ',' ',' ',' ',' '},
		{' ',' ',' ','*',' ','*',' ','*',' ',' ',' '},
		{'*','*','*','*','*','*','*','*','*','*','*'},
		{' ','*',' ',' ','*','*','*',' ',' ','*',' '},
		{' ',' ',' ','*','*','*','*','*',' ',' ',' '},
	};
	char form_4[5][11] = {
		{' ',' ',' ',' ',' ','*',' ',' ',' ',' ',' '},
		{' ','*',' ',' ',' ','*',' ',' ',' ','*',' '},
		{'*','*','*','*','*','*','*','*','*','*','*'},
		{' ','*',' ','*',' ','*',' ','*',' ','*',' '},
		{' ',' ',' ','*',' ','*',' ','*',' ',' ',' '},
	};

	switch (form)
	{
	case 1:show_aircraft_print(form_1, x, y); break;
	case 2:show_aircraft_print(form_2, x, y); break;
	case 3:show_aircraft_print(form_3, x, y); break;
	case 4:show_aircraft_print(form_4, x, y); break;

	};


}

void lifebar()
{

	int j;

	for (j = 0; j < 100; j++)
	{
		gotoxy(j, 42);
		printf(" ");


	}
	gotoxy(105, 42);
	printf("life");

}

void clear_local(int x, int y)
{

	int i, j;
	char cl[5][11] = {
		{' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
		{' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
		{' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
		{' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
		{' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
	};

	for (i = 0; i < 5; i++) {
		gotoxy(x, y + i);
		for (j = 0; j < 11; j++)
			printf("%c", cl[i][j]);
	}
}


void fire_power(struct state1* data, struct bullet* state, struct enemoy* place, struct enemoy_bullect* d, struct allay* posit)
{
	int i, r, j, s;
	char enemoy_1[3][7] = {
		{' ','*','*','*','*','*',' '},
		{'*','*','*','*','*','*','*'},
		{' ',' ',' ','*',' ',' ',' '},

	};

	if (state->record >= 10)
	{
		clear_local(posit->X, posit->Y);
		for (i = 3; i < 41; i++)
			if (i % 2 == 0)
			{

				r = rand() % 100 + 3;
				for (j = 111; j > r; j--)
				{
					gotoxy(j, i);
					if (rand() % 2)
						printf("<");
				}

			}
			else
			{

				r = rand() % 100 + 3;
				for (j = 3; j < r; j++)
				{
					gotoxy(j, i);
					if (rand() % 2)
						printf(">");

				}


			}
		Sleep(200);

		update_platform();
		for (s = 0; s < MAX; s++)
			if (place[s].X != 0)
				show_enemoy(enemoy_1, place[s].X, place[s].Y);



		Sleep(700);

		for (i = 0; i < data->lv; i++)
		{
			if (place[i].X != 0)
			{

				target(place[i].X, place[i].Y);
				place[i].X = 0;
				place[i].Y = 0;
				d[i].X = 0;
				d[i].f1 = 0;
				state->record++;
			}
		}

		Sleep(500);
		update_platform();
		state->record -= 10;
	}
	return;
}

void fire_power2(struct state1* data, struct bullet* state, struct enemoy* place, struct enemoy_bullect* d)
{
	int i, r, c, n[MAX], j = 0, yy[MAX], cou = 0, f = 0, speed[MAX], speed2[MAX];
	char p[3][5] = {
		{' ',' ','*',' ',' '},
		{'*','*','*','*','*'},
		{' ','*',' ','*',' '}
	};

	for (i = 0; i < data->lv; i++)
	{
		if (place[i].X != 0)
		{
			for (r = 0; r < 3; r++)
			{

				for (c = 0; c < 5; c++)
					if (p[r][c] == '*')
					{
						gotoxy(place[i].X + 1 + c, 38 + r);
						printf("%c", p[r][c]);
					}
			}
		}

	}
	for (i = 0; i < data->lv; i++)
		if (place[i].X != 0)
			n[j++] = i;

	if (j != 1)
		for (i = 0; i < j; i++)
		{
			yy[i] = 37;
			speed[i] = rand() % 50 + 20;
			speed2[i] = speed[i];
		}
	else
	{
		yy[0] = 37;
		speed[0] = 800;
		speed2[0] = speed[0];
	}
	do {
		for (i = 0; i < j; i++)
		{
			if (yy[i] >= place[n[i]].Y + 1 && yy[i] != -1)
			{

				gotoxy(place[n[i]].X + 3, yy[i]);
				printf("^");
				if (speed[i] <= 0)
				{
					gotoxy(place[n[i]].X + 3, yy[i]);
					printf(" ");
					yy[i]--;
					speed[i] = speed2[i];
				}
				speed[i]--;
			}
			if (yy[i] < place[n[i]].Y + 1 && yy[i] >= 0)
			{
				target(place[n[i]].X, place[n[i]].Y);
				place[n[i]].Y = 0;
				place[n[i]].X = 0;
				d[n[i]].X = 0;
				d[n[i]].f1 = 0;
				state->record++;
				yy[i] = -1;
			}
		}


		for (i = 0; i < j; i++)
			if (yy[i] >= place[n[i]].Y + 1)
				break;
		if (i == j)
			break;

	} while (1);
	update_platform();
}
void fire_aircraft(int x, int y, int form, struct bullet* state)
{

	int t;
	char c;

	t = y;
	switch (form)
	{
	case 1:c = '!'; break;
	case 2:c = '^'; break;
	case 3:c = '+'; break;
	case 4:c = '|'; break;

	}

	switch (form)
	{
	case 1:c = '!';
	case 2:c = '^';
		while (y >= 2)
		{
			gotoxy(x + 5, y--); printf("%c", c);
		}
		Sleep(30);
		state->X = x + 5;

		while (t >= 2)
		{
			gotoxy(x + 5, t--);
			printf(" ");
		}break;
	case 3:c = '+';
		while (y >= 2)
		{
			gotoxy(x + 7, y); printf("%c", c);
			gotoxy(x + 3, y); printf("%c", c);
			y--;
		}
		Sleep(24);
		state->X = x + 5;

		while (t >= 2)
		{
			gotoxy(x + 7, t); printf(" ");
			gotoxy(x + 3, t); printf(" ");
			t--;
		}
		break;


	case 4:c = '|';
		while (y >= 2)
		{
			gotoxy(x + 5, y); printf("%c", c);
			gotoxy(x + 4, y); printf("%c", c);
			gotoxy(x + 6, y); printf("%c", c);
			y--;
		}
		Sleep(24);
		state->X = x + 5;

		while (t >= 2)
		{
			gotoxy(x + 5, t); printf(" ");
			gotoxy(x + 4, t); printf(" ");
			gotoxy(x + 6, t); printf(" ");
			t--;
		}
		break;

	}
}
void fire_enemoy(struct enemoy* p, int n)
{

	int x, y, t;

	x = p->X;
	y = p->Y + 4;
	t = y;

	while (y <= 38)
	{
		gotoxy(x + 3, y++); printf("o");

	}

	Sleep(50);
	while (t <= 38)
	{
		gotoxy(x + 3, t++); printf(" ");
	}
}
void control_aircraft(int* p_x, int* p_y, int form, struct state1* data, struct bullet* state, struct enemoy* place, struct enemoy_bullect* d, struct allay* posit, struct enemoy_speed* s, struct shot* sh)
{
	char ch;
	int s1 = 60;
	static int n = 0;
	show_aircraft(*p_x, *p_y, form);

	if (_kbhit())
	{
		ch = _getch();
		switch (ch)
		{
		case 'A':
		case 'a':if (*p_x - 3 >= 2) { clear_local(*p_x, *p_y); (*p_x) -= 3; show_aircraft(*p_x, *p_y, form); }; break;
		case 'D':
		case 'd':if (*p_x + 3 <= 100) { clear_local(*p_x, *p_y); (*p_x) += 3; show_aircraft(*p_x, *p_y, form); }; break;
		case 'W':
		case 'w':if (*p_y - 3 >= 2) { clear_local(*p_x, *p_y); (*p_y) -= 3; show_aircraft(*p_x, *p_y, form); }; break;
		case 'S':
		case 's':if (*p_y + 3 <= 35) { clear_local(*p_x, *p_y); (*p_y) += 3; show_aircraft(*p_x, *p_y, form); }; break;
		case ' ':if (n < MS) { (sh + n)->bf = 1; n++; }if (n == MS && data->shot == 0)n = 0; break;
		case 'M':
		case 'm':state->flag = 1; fire_aircraft(*p_x, *p_y, form, state); break;
		case 'B':
		case 'b':fire_power(data, state, place, d, posit); break;
		case 'C':
		case 'c':data->life = 100; break;
		case 'N':
		case 'n':fire_power2(data, state, place, d); data->life -= 10; break;
		case 'X':
		case 'x':fire_power2(data, state, place, d); break;
		case 'Z':
		case 'z':system("cls"); platform(); update_bar(data); lifebar(); update_menu(data, state); break;
		case 'Q':
		case 'q':data->end = 0; update_platform(); if (save(place, s, state, data, posit) && save_maxmak(state, data)) { gotoxy(40, 20); printf("存档成功!按任意键返回主菜单.."); _getch(); system("cls"); }
				else { gotoxy(40, 20); printf("存档失败!按任意键返回主菜单.."); _getch(); system("cls"); }
				welcome(); break;
		case 'P':
		case 'p':while (_kbhit())_getch();
			gotoxy(22, 20); printf("game pasue...  second back...press any key to continue.");
			while (s1--) { if (_kbhit())break; Sleep(1000);	gotoxy(34, 20); printf("%d ", s1); }gotoxy(22, 20);	printf("                                                       ");
			break;

		}
		while (_kbhit())_getch();
	}
}

void show_enemoy(char(*ch)[7], int x, int y)
{
	int i, j;

	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 7; j++)
		{
			gotoxy(x + j, y + i);
			if (*(*(ch + i) + j) == '*')
				printf("%c", *(*(ch + i) + j));
		}



	}
}

void make_enemoy(int* flag, int level, struct state1* data, struct bullet* state, struct enemoy* place, struct enemoy_bullect* d, struct enemoy_speed* s, struct allay* posit, struct shot* sh)
{
	static int n = 0;
	int j = 0, i, k = 1, n1, p, p1, px, f[MAX] = { 0 }, t, maxy = -1;


	char enemoy_1[3][7] = {
		{' ','*','*','*','*','*',' '},
		{'*','*','*','*','*','*','*'},
		{' ',' ',' ','*',' ',' ',' '},

	};

	for (i = 0; i < MAX; i++)
		if (place[i].Y != 0 && place[i].X != 0)
			break;

	if (i == MAX)
	{
		for (j = 0; j < MAX; j++)
		{
			s[j].speed = 0;
			s[j].speed_flag = 0;

		}
		data->load = 0;
		n = 0;
	}
	if (n == 0 && data->load == 0)
	{
		switch (level)
		{
		case 1:data->lv = 1; break;
		case 2:data->lv = 3; break;
		case 3:data->lv = 6; break;
		case 4:data->lv = MAX; break;
		}
		if (level == 1)
		{
			do
			{
				place[0].X = rand() % 93 + 6;
				place[0].Y = 3;
				d[0].X = place[0].X;
				f[0] = place[0].X * 10 / 100;
				s[0].speed = rand() % 100 + 50;
			} while (f[0] == 0);
			show_enemoy(enemoy_1, place[0].X, place[0].Y);
		}
		else
		{
			if (level <= 3)
			{

				for (p = 0; p < data->lv; p++)
				{
					px = rand() % 95 + 1;
					px = px * 10 / 100;
					f[p] = px;
				}

				for (p = 0; p < 5; p++)
					for (p1 = p + 1; p1 < 6; p1++)
						if (f[p] == f[p1])
						{
							f[p1] = 0;
							f[p] = 0;
						}

				for (p = 0; p < data->lv; p++)
					if (f[p] != 0)
					{
						place[p].X = f[p] * 10 + rand() % 3;
						place[p].Y = rand() % 3 + 3;
						if (data->level == 2)
							s[p].speed = rand() % 80 + 20;
						if (data->level == 3)
							s[p].speed = rand() % 60 + 10;
						show_enemoy(enemoy_1, place[p].X, place[p].Y);
						d[p].X = place[p].X;
					}
			}
			else
			{
				for (p = 0; p < MAX; p++)
				{
					if (rand() % 2)
					{
						px = rand() % 93 + 6;
						px = px * 10 / 100;
						f[p] = px;
					}
				}
				for (p = 0; p < MAX; p++)
					if (f[p] != 0)
					{
						place[p].X = f[p] * 10 + rand() % 10;
						place[p].Y = rand() % 10 + 3;
						s[p].speed = rand() % 20 + 5;
						show_enemoy(enemoy_1, place[p].X, place[p].Y);
						d[p].X = place[p].X;
					}

			}
		}
	}
	else {
		for (n1 = 0; n1 < data->lv; n1++)
		{
			if (place[n1].Y + 1 >= 37)
			{
				clear_local(place[n1].X, place[n1].Y);
				place[n1].X = 0;
				place[n1].Y = 0;
				d[n1].X = 0;
				d[n1].f = 0;
				d[n1].f1 = 0;

			}
			else if (place[n1].X != 0)
			{

				for (t = 0; t < MAX; t++)
					if (is_get(&place[t], state, posit))
						if (place[t].Y > maxy)
							maxy = place[t].Y;
				if (state->flag == 1 && is_get(&place[n1], state, posit))
				{


					if (maxy == place[n1].Y)
					{

						target(place[n1].X, place[n1].Y);
						clear_local(place[n1].X - 3, place[n1].Y - 2);
						place[n1].X = 0;
						place[n1].Y = 0;
						d[n1].X = 0;
						d[n1].f1 = 0;
						state->record++;
						state->flag = 0;
						maxy = -1;
					}
					maxy = -1;
				}
				else
				{
					s[n1].speed_flag++;
					if (s[n1].speed_flag == s[n1].speed)
					{
						s[n1].speed_flag = 0;
						clear_local(place[n1].X, place[n1].Y);
						show_enemoy(enemoy_1, place[n1].X, place[n1].Y += 1);
					}
					d[n1].f = rand() % (100 - 9 * data->level);
					if (d[n1].f == 0 && rand() % 2 == 1)
					{
						d[n1].f1 = 1;
						fire_enemoy(&place[n1], n1);
					}
				}
			}
			else;
			for (i = 0; i < MS; i++)
				if ((sh + i)->bf == 1 && abs((sh + i)->bx - place[n1].X - 3) <= 3 && abs((sh + i)->by - place[n1].Y - 1) <= 1)
				{
					target(place[n1].X, place[n1].Y);
					clear_local(place[n1].X - 3, place[n1].Y - 2);
					place[n1].X = 0;
					place[n1].Y = 0;
					d[n1].X = 0;
					d[n1].f1 = 0;
					(sh + i)->bf = 0;
					(sh + i)->bn = 1;
					(sh + i)->gap = 7;
					state->record++;
				}
			if (place[n1].Y != 0 && place[n1].X != 0 && is_faild(&place[n1], &d[n1], posit))
				data->life--;
			d[n1].f1 = 0;
		}
		if (state->flag == 1)
			state->flag = 0;

	}
	n++;

}



int is_get(struct enemoy* p, struct bullet* state, struct allay* posit)
{
	return abs(p->X + 3 - state->X) <= 3 && p->Y < posit->Y ? 1 : 0;
}

int is_faild(struct enemoy* p, struct enemoy_bullect* p1, struct allay* posit)
{

	if ((abs(p->X + 3 - (posit->X + 5)) <= 5 && abs(p->Y + 1 - (posit->Y + 2)) <= 3))
		return 1;
	else if (abs(posit->X + 2 - p1->X) <= 5 && p1->f1 == 1 && posit->Y > p->Y)
		return 1;
	else
		return 0;
}

void update_bar(struct state1* data)
{
	int i;
	for (i = 0; i < data->life; i++)
	{
		gotoxy(i, 42); printf("#");
	}

}


void core_function(struct state1* data, struct bullet* state, struct allay* posit, struct enemoy* place, struct enemoy_bullect* d, struct enemoy_speed* s, struct shot* sh)
{
	char c;
	int* px = &posit->X, * py = &posit->Y, flag = 0, t = 0;
	platform();
	lifebar();
	update_bar(data);
	system("cls");
	system("mode con cols=134 lines=44");
	while (data->end == 0)
	{
		if (t % 100 == 0)
		{
			if (data->life < 100 && state->record % 10 == 0)
			{
				if (data->life + 10 > 100)
					data->life = 100;
				else
					data->life += 10;
				state->record++;
			}
			platform();
			lifebar();
			update_bar(data);
		}
		if (data->flag == 0 && data->load == 0)
			switch (state->record / 10)
			{
			case 0:data->level = 1; break;
			case 1:data->level = 2; break;
			case 2:data->level = 3; break;
			case 3:data->level = 4; data->flag = 1; break;

			}
		update_menu(data, state);
		HideCursor();
		shot(sh, posit, data);
		shot(sh, posit, data);
		shot(sh, posit, data);
		shot(sh, posit, data);
		shot(sh, posit, data);
		shot(sh, posit, data);
		shot(sh, posit, data);
		make_enemoy(&flag, data->level, data, state, place, d, s, posit, sh);
		control_aircraft(px, py, data->level, data, state, place, d, posit, s, sh);
		if (data->life <= 0)
		{
			system("cls");
			platform();
			gotoxy(30, 20);
			printf("游戏结束!!!最终积分%d", state->record);
			gotoxy(30, 21);
			printf("按b返回主菜单,其他键退出程序");
			c = _getch();
			if (c == 'b' || c == 'B')
			{
				system("cls");
				welcome();
			}
			else
				exit(0);

		}
		t++;
	}
}
void target(int x, int y)
{
	char element[5][11] = { 0 };
	int randch, i, j;

	for (i = 0; i < 5; i++)
		for (j = 0; j < 11; j++) {
			randch = rand() % 2;
			if (randch == 1)
				element[i][j] = '*';
			else
				element[i][j] = ' ';
		}
	for (i = 0; i < 5; i++) {
		gotoxy(x - 3, y + i - 2);
		for (j = 0; j < 11; j++)
			printf("%c", element[i][j]);

	}
	Sleep(22);
}


int main()
{
	//PlaySound("D:\\mass", NULL, SND_FILENAME | SND_ASYNC);
	login();
	return 0;
}

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值