文末附可执行程序。
这是一个飞机大战小游戏项目。说起这个项目,还要从我大二时候说起,距今已经五年了。大二暑假老师布置了一个实习项目使用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;
}