首先我要表示抱歉,很长一段时间都没有更新博客了,这次回来我又带着我的新型升级版游戏见大家,希望你们喜欢!!!
暴击single敌人版
这里我添加了血条值,还实现了飞机连续射子弹的功能,敌机也可以向下移动随机出现,使游戏更加真实,代码里我还添加了更多的注释,更加便于大家对代码的理解
效果如下:
击杀Single敌机版(C代码实现)
详细代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#define high 20 //游戏画面尺寸
#define width 36 //如果不把这两个变量设为符号常量而设为全局变量,编译器就会报错
//至于为什么大家可以在评论区下讨论,我想看看大家对这个的想法
//问题:符号常量与全局变量有什么区别?
//最后我会公布答案
int x, y; //飞机坐标
int enemy_x, enemy_y; //敌机坐标
int score; //得分
int life; //飞机生命值
int canvas[high][width + 17] = {0}; //二维数组存储游戏画布中对应的元素
//1为飞机,2为子弹,3为敌机
//width + 17 是为了保证飞机右翼不会超出右线
//而之后的enemy_y = rand() * 100 % width + 9;是
//为了保证敌机在左边线以右9个单位的距离
//这是间接的控制飞机左翼不超过左边界的方法
int digit(int s)
{
int ne, t, bi;
ne = s;
int num = 0;
while(ne)
{
t = ne % 10;
ne /= 10;
num++;
}
return num;
}
void startup()
{
x = high / 2;
y = width / 2;
canvas[x][y] = 1;
enemy_x = 0;
enemy_y = y;
life = 3;
canvas[enemy_x][enemy_y] = 3;
score = 0;
}
void gotoxy(int x, int y) //将光标移动到(x,y)位置
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle, pos);
}
void HideCursor()
{
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void show()
{
gotoxy(0, 0);
HideCursor();
int i, j;
for(i = 0; i < high; i++)
{
for(j = 0; j < width + 17; j++)
{
if((i == x) && (j == y))
{
printf("*");
}
else if((i == x + 1) && (j == y - 2))
{
printf(" * *");
j += 3;
}
else if((i == x + 2) && (j == y - 2))
{
printf("* * *");
j += 4;
}
else if((i == x + 3) && (j == y - 6))
{
printf("* * * * * * *");
j += 12;
}
else if((i == x + 4) && (j == y - 8))
{
printf("* * * * * * * * *");
j += 16;
}
else if((i == x + 5) && (j == y - 1))
{
printf("* * ");
j += 3;
}
else if(canvas[i][j] == 3)
printf("@");
else if(canvas[i][j] == 2)
printf("|");
else
printf(" ");
}
printf("#\n");
}
printf("生命值:%d", life);
int space = digit(life);
if(space == 1)
{
for(i = 0; i < width + 8; i++)
printf(" ");
}
else
{
for(i = 0; i < width + 8 - (space - 1); i++)
printf(" ");
}
printf("#\n");
printf("得分:%d", score);
int space2 = digit(score);
if(space2 == 1)
{
for(i = 0; i < width + 9; i++)
printf(" ");
}
else
{
for(i = 0; i < width + 9 - (space2 - 1); i++)
printf(" ");
}
printf("#\n");
for(i = 0; i < width + 17; i++)
printf("#");
}
void updateWithoutInput() //与用户输入无关的更新
{
int i, j;
for(i = 0; i < high; i++)
{
for(j = 0; j < width + 17; j++)
{
if(canvas[i][j] == 2)
{
if((i - 1 == enemy_x) && (j == enemy_y))
{
score++; //得分
canvas[enemy_x][enemy_y] = 0; //敌机已被消灭
enemy_x = 0;
enemy_y = rand() * 100 % width + 9;
canvas[enemy_x][enemy_y] = 3; //产生敌机
canvas[i][j] = 0; //子弹消耗掉
}
canvas[i][j] = 0;
if(i > 0)
canvas[i - 1][j] = 2; //子弹向上移动
}
}
}
if(enemy_x > high) //防线被突破
{
canvas[enemy_x][enemy_y] = 0;
enemy_x = 0;
enemy_y = rand() * 100 % width + 9;
canvas[enemy_x][enemy_y] = 3;
score--; //减分
life--;
}
if(enemy_x >= x)
{
life--;
score--;
if(life == 0)
{
printf("\n任务失败!!!\n");
system("pause");
exit(0);
}
canvas[enemy_x][enemy_y] = 0;
enemy_x = 0;
enemy_y = rand() * 100 % width + 9;
canvas[enemy_x][enemy_y] = 3;
}
static int speed = 0; //控制敌机下落速度
if(speed < 10)
speed++;
if(speed == 10)
{
canvas[enemy_x][enemy_y] = 0;
enemy_x++;
speed = 0;
canvas[enemy_x][enemy_y] = 3;
}
}
void updateWithInput() //与用户输入有关的更新
{
char input;
if(kbhit())
{
input = getch();
if(input == 'a')
{
canvas[x][y] = 0;
y--;
canvas[x][y] = 1;
}
if(input == 'd')
{
canvas[x][y] = 0;
y++;
canvas[x][y] = 1;
}
if(input == 'w')
{
canvas[x][y] = 0;
x--;
canvas[x][y] = 1;
}
if(input == 's')
{
canvas[x][y] = 0;
x++;
canvas[x][y] = 1;
}
if(input == ' ')
{
// bullet_x = x - 1;
// bullet_y = y;
canvas[x - 1][y] = 2;
}
}
}
int main()
{
startup();
while(1)
{
show();
updateWithoutInput();
updateWithInput();
}
return 0;
}
炫酷出场方式版
我才是电脑玩家之酷炫出场飞机(C代码实现)
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#define high 20 //游戏画面尺寸
#define width 36 //如果不把这两个变量设为符号常量而设为全局变量,编译器就会报错
//至于为什么大家可以在评论区下讨论,我想看看大家对这个的想法
//问题:符号常量与全局变量有什么区别?
//最后我会公布答案
int x, y; //飞机坐标
int enemy_x, enemy_y; //敌机坐标
int score; //得分
int life; //飞机生命值
int canvas[high][width] = {0}; //二维数组存储游戏画布中对应的元素
//1为飞机,2为子弹,3为敌机
void startup()
{
x = high / 2;
y = width / 2;
canvas[x][y] = 1; //我方位置
enemy_x = 0;
enemy_y = y;
life = 3;
canvas[enemy_x][enemy_y] = 3; //敌机位置
score = 0;
}
void gotoxy(int x, int y) //将光标移动到(x,y)位置
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle, pos);
}
void HideCursor()
{
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void show()
{
gotoxy(0, 0);
HideCursor();
int i, j;
for(i = 0; i < high; i++)
{
for(j = 0; j < width + 6; j++)
{
if((i == x) && (j == y))
{
printf("*");
}
else if((i == x + 1) && (j == y - 2))
{
printf(" * *");
j += 3;
}
else if((i == x + 2) && (j == y - 2))
{
printf("* * *");
j += 4;
}
else if((i == x + 3) && (j == y - 6))
{
printf("* * * * * * *");
j += 12;
}
else if((i == x + 4) && (j == y - 8))
{
printf("* * * * * * * * *");
j += 16;
}
else if((i == x + 5) && (j == y - 1))
{
printf("* * ");
j += 3;
}
else if(canvas[i][j] == 3) //显示敌机
printf("@");
else if(canvas[i][j] == 2) //显示子弹
printf("|");
else
printf(" ");
}
printf("\n");
}
printf("生命值:%d", life);
printf("\n得分:%d\n", score);
for(i = 0; i < width; i++)
printf("-");
}
void updateWithoutInput() //与用户输入无关的更新
{
int i, j;
for(i = 0; i < high; i++)
{
for(j = 0; j < width + 6; j++)
{
if(canvas[i][j] == 2) //子弹位置
{
if((i - 1 == enemy_x) && (j == enemy_y))
{
score++; //得分
canvas[enemy_x][enemy_y] = 0;
enemy_x = 0;
enemy_y = rand() * 100 % width + 9;
canvas[enemy_x][enemy_y] = 3;
canvas[i][j] = 0;
}
canvas[i][j] = 0;
if(i > 0)
canvas[i - 1][j] = 2;
}
}
}
if(enemy_x > high) //防线被突破
{
canvas[enemy_x][enemy_y] = 0;
enemy_x = 0;
enemy_y = rand() * 100 % width + 9;
canvas[enemy_x][enemy_y] = 3;
score--; //减分
life--;
}
if(enemy_x >= x)
{
life--;
score--;
if(life == 0)
{
printf("\n任务失败!!!\n");
system("pause");
exit(0);
}
canvas[enemy_x][enemy_y] = 0;
enemy_x = 0;
enemy_y = rand() * 100 % width + 9;
canvas[enemy_x][enemy_y] = 3;
}
static int speed = 0; //控制敌机下落速度
if(speed < 10)
speed++;
if(speed == 10)
{
canvas[enemy_x][enemy_y] = 0;
enemy_x++;
speed = 0;
canvas[enemy_x][enemy_y] = 3;
}
}
void updateWithInput() //与用户输入有关的更新
{
char input;
if(kbhit())
{
input = getch();
if(input == 'a')
{
canvas[x][y] = 0;
y--;
canvas[x][y] = 1;
}
if(input == 'd')
{
canvas[x][y] = 0;
y++;
canvas[x][y] = 1;
}
if(input == 'w')
{
canvas[x][y] = 0;
x--;
canvas[x][y] = 1;
}
if(input == 's')
{
canvas[x][y] = 0;
x++;
canvas[x][y] = 1;
}
if(input == ' ')
{
// bullet_x = x - 1;
// bullet_y = y;
canvas[x - 1][y] = 2;
}
}
}
int main()
{
startup();
while(1)
{
show();
updateWithoutInput();
updateWithInput();
}
return 0;
}
吊打多数敌机版
这里我默认5个敌机,你们也可以按你们的想法多设几个都没问题
单枪匹马干对面敌机(C代码实现)
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#define high 30 //游戏画面尺寸
#define width 36 //如果不把这两个变量设为符号常量而设为全局变量,编译器就会报错
//至于为什么大家可以在评论区下讨论,我想看看大家对这个的想法
//问题:符号常量与全局变量有什么区别?
//最后我会公布答案
#define EnemyNum 5 //敌机数目
int x, y; //飞机坐标
int enemy_x[EnemyNum], enemy_y[EnemyNum]; //敌机位置
int score; //得分
int life; //飞机生命值
int canvas[high][width + 17] = {0}; //二维数组存储游戏画布中对应的元素
//1为飞机,2为子弹,3为敌机
//width + 17 是为了保证飞机右翼不会超出右线
//而之后的enemy_y = rand() * 100 % width + 9;是
//为了保证敌机在左边线以右9个单位的距离
//这是间接的控制飞机左翼不超过左边界的方法
int digit(int s)
{
int ne, t, bi;
ne = s;
int num = 0;
while(ne)
{
t = ne % 10;
ne /= 10;
num++;
}
return num;
}
void startup()
{
x = high - 6;
y = width / 2;
canvas[x][y] = 1;
int k;
for(k = 0; k < EnemyNum; k++)
{
enemy_x[k] = rand() * 100 % 5;
enemy_y[k] = rand() * 100 % width + 9;
canvas[enemy_x[k]][enemy_y[k]] = 3;
}
life = 3;
score = 0;
}
void gotoxy(int x, int y) //将光标移动到(x,y)位置
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle, pos);
}
void HideCursor()
{
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void show()
{
gotoxy(0, 0);
HideCursor();
int i, j;
for(i = 0; i < high; i++)
{
for(j = 0; j < width + 17; j++)
{
if((i == x) && (j == y))
{
printf("*");
}
else if((i == x + 1) && (j == y - 2))
{
printf(" * *");
j += 3;
}
else if((i == x + 2) && (j == y - 2))
{
printf("* * *");
j += 4;
}
else if((i == x + 3) && (j == y - 6))
{
printf("* * * * * * *");
j += 12;
}
else if((i == x + 4) && (j == y - 8))
{
printf("* * * * * * * * *");
j += 16;
}
else if((i == x + 5) && (j == y - 1))
{
printf("* * ");
j += 3;
}
else if(canvas[i][j] == 3)
printf("@");
else if(canvas[i][j] == 2)
printf("|");
else
printf(" ");
}
printf("#\n");
}
printf("生命值:%d", life);
int space = digit(life);
if(space == 1)
{
for(i = 0; i < width + 8; i++)
printf(" ");
}
else
{
for(i = 0; i < width + 8 - (space - 1); i++)
printf(" ");
}
printf("#\n");
printf("得分:%d", score);
int space2 = digit(score);
if(space2 == 1)
{
for(i = 0; i < width + 9; i++)
printf(" ");
}
else
{
for(i = 0; i < width + 9 - (space2 - 1); i++)
printf(" ");
}
printf("#\n");
for(i = 0; i < width + 17; i++)
printf("#");
}
void updateWithoutInput() //与用户输入无关的更新
{
int i, j, k;
for(i = 0; i < high; i++)
{
for(j = 0; j < width + 17; j++)
{
if(canvas[i][j] == 2)
{
for(k = 0; k < EnemyNum; k++)
{
if((i - 1 == enemy_x[k]) && (j == enemy_y[k]))
{
score++; //得分
canvas[enemy_x[k]][enemy_y[k]] = 0; //敌机已被消灭
enemy_x[k] = rand() % 100 % 5;
enemy_y[k] = rand() * 100 % width + 9;
canvas[enemy_x[k]][enemy_y[k]] = 3; //产生敌机
canvas[i][j] = 0; //子弹消耗掉
}
canvas[i][j] = 0;
if(i > 0)
canvas[i - 1][j] = 2; //子弹向上移动
}
}
}
}
static int speed = 0; //控制敌机下落速度
for(k = 0; k < EnemyNum; k++)
{
if(enemy_x[k] > high) //敌机跑出边界
{
canvas[enemy_x[k]][enemy_y[k]] = 0;
enemy_x[k] = rand() * 100 % 5;
enemy_y[k] = rand() * 100 % width + 9;
canvas[enemy_x[k]][enemy_y[k]] = 3;
score--; //减分
life--;
}
if(enemy_x[k] >= x) //敌机撞上我方
{
life--;
score--;
sleep(1);
if(life == 0)
{
printf("\n任务失败!!!\n");
system("pause");
exit(0);
}
canvas[enemy_x[k]][enemy_y[k]] = 0;
enemy_x[k] = rand() * 100 % 5;
enemy_y[k] = rand() * 100 % width + 9;
canvas[enemy_x[k]][enemy_y[k]] = 3;
}
if(speed < 20)
speed++;
if(speed == 20)
{
canvas[enemy_x[k]][enemy_y[k]] = 0;
enemy_x[k]++;
speed = 0;
canvas[enemy_x[k]][enemy_y[k]] = 3;
}
}
}
void updateWithInput() //与用户输入有关的更新
{
char input;
if(kbhit())
{
input = getch();
if(input == 'a')
{
canvas[x][y] = 0;
y--;
canvas[x][y] = 1;
}
if(input == 'd')
{
canvas[x][y] = 0;
y++;
canvas[x][y] = 1;
}
if(input == 'w')
{
canvas[x][y] = 0;
x--;
canvas[x][y] = 1;
}
if(input == 's')
{
canvas[x][y] = 0;
x++;
canvas[x][y] = 1;
}
if(input == ' ')
{
canvas[x - 1][y] = 2;
}
}
}
int main()
{
startup();
while(1)
{
show();
updateWithoutInput();
updateWithInput();
}
return 0;
}
吊打多数敌机改良版(让敌机不规则分散)
吊打多数敌机改良版(让敌机不规则分散)
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#define high 30 //游戏画面尺寸
#define width 36 //如果不把这两个变量设为符号常量而设为全局变量,编译器就会报错
//至于为什么大家可以在评论区下讨论,我想看看大家对这个的想法
//问题:符号常量与全局变量有什么区别?
//最后我会公布答案
#define EnemyNum 5 //敌机数目
int x, y; //飞机坐标
int enemy_x[EnemyNum], enemy_y[EnemyNum]; //敌机位置
int score; //得分
int life; //飞机生命值
int canvas[high][width + 17] = {0}; //二维数组存储游戏画布中对应的元素
//1为飞机,2为子弹,3为敌机
//width + 17 是为了保证飞机右翼不会超出右线
//而之后的enemy_y = rand() * 100 % width + 9;是
//为了保证敌机在左边线以右9个单位的距离
//这是间接的控制飞机左翼不超过左边界的方法
int digit(int s)
{
int ne, t, bi;
ne = s;
int num = 0;
while(ne)
{
t = ne % 10;
ne /= 10;
num++;
}
return num;
}
void startup()
{
x = high - 6;
y = width / 2;
canvas[x][y] = 1;
int k;
for(k = 0; k < EnemyNum; k++)
{
enemy_x[k] = rand() * 100 % 13;
enemy_y[k] = rand() * 100 % width + 9;
canvas[enemy_x[k]][enemy_y[k]] = 3;
}
life = 3;
score = 0;
}
void gotoxy(int x, int y) //将光标移动到(x,y)位置
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle, pos);
}
void HideCursor()
{
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void show()
{
gotoxy(0, 0);
HideCursor();
int i, j;
for(i = 0; i < high; i++)
{
for(j = 0; j < width + 17; j++)
{
if((i == x) && (j == y))
{
printf("*");
}
else if((i == x + 1) && (j == y - 2))
{
printf(" * *");
j += 3;
}
else if((i == x + 2) && (j == y - 2))
{
printf("* * *");
j += 4;
}
else if((i == x + 3) && (j == y - 6))
{
printf("* * * * * * *");
j += 12;
}
else if((i == x + 4) && (j == y - 8))
{
printf("* * * * * * * * *");
j += 16;
}
else if((i == x + 5) && (j == y - 1))
{
printf("* * ");
j += 3;
}
else if(canvas[i][j] == 3)
printf("@");
else if(canvas[i][j] == 2)
printf("|");
else
printf(" ");
}
printf("#\n");
}
printf("生命值:%d", life);
int space = digit(life);
if(space == 1)
{
for(i = 0; i < width + 8; i++)
printf(" ");
}
else
{
for(i = 0; i < width + 8 - (space - 1); i++)
printf(" ");
}
printf("#\n");
printf("得分:%d", score);
int space2 = digit(score);
if(space2 == 1)
{
for(i = 0; i < width + 9; i++)
printf(" ");
}
else
{
for(i = 0; i < width + 9 - (space2 - 1); i++)
printf(" ");
}
printf("#\n");
for(i = 0; i < width + 17; i++)
printf("#");
}
void updateWithoutInput() //与用户输入无关的更新
{
int i, j, k;
for(i = 0; i < high; i++)
{
for(j = 0; j < width + 17; j++)
{
if(canvas[i][j] == 2)
{
for(k = 0; k < EnemyNum; k++)
{
if((i - 1 == enemy_x[k]) && (j == enemy_y[k]))
{
score++; //得分
canvas[enemy_x[k]][enemy_y[k]] = 0; //敌机已被消灭
enemy_x[k] = rand() % 100 % 13;
enemy_y[k] = rand() * 100 % width + 9;
canvas[enemy_x[k]][enemy_y[k]] = 3; //产生敌机
canvas[i][j] = 0; //子弹消耗掉
}
canvas[i][j] = 0;
if(i > 0)
canvas[i - 1][j] = 2; //子弹向上移动
}
}
}
}
static int speed = 0; //控制敌机下落速度
if(speed < 20)
speed++;
for(k = 0; k < EnemyNum; k++)
{
if(enemy_x[k] > high) //敌机跑出边界
{
canvas[enemy_x[k]][enemy_y[k]] = 0;
enemy_x[k] = rand() * 100 % 13;
enemy_y[k] = rand() * 100 % width + 9;
canvas[enemy_x[k]][enemy_y[k]] = 3;
score--; //减分
life--;
}
if(enemy_x[k] >= x) //敌机撞上我方
{
life--;
score--;
sleep(1);
if(life == 0)
{
printf("\n任务失败!!!\n");
system("pause");
exit(0);
}
canvas[enemy_x[k]][enemy_y[k]] = 0;
enemy_x[k] = rand() * 100 % 13;
enemy_y[k] = rand() * 100 % width + 9;
canvas[enemy_x[k]][enemy_y[k]] = 3;
}
if(speed == 20) //敌机下落
{
for(k = 0; k < EnemyNum; k++)
{
canvas[enemy_x[k]][enemy_y[k]] = 0;
enemy_x[k]++;
speed = 0;
canvas[enemy_x[k]][enemy_y[k]] = 3;
}
}
}
}
void updateWithInput() //与用户输入有关的更新
{
char input;
if(kbhit())
{
input = getch();
if(input == 'a')
{
canvas[x][y] = 0;
y--;
canvas[x][y] = 1;
}
if(input == 'd')
{
canvas[x][y] = 0;
y++;
canvas[x][y] = 1;
}
if(input == 'w')
{
canvas[x][y] = 0;
x--;
canvas[x][y] = 1;
}
if(input == 's')
{
canvas[x][y] = 0;
x++;
canvas[x][y] = 1;
}
if(input == ' ')
{
canvas[x - 1][y] = 2;
}
}
}
int main()
{
startup();
while(1)
{
show();
updateWithoutInput();
updateWithInput();
}
return 0;
}
终极版
这里可以随着击杀敌机数目越多,飞机子弹不断得到升级延展,敌机速度也会变快,游戏难度也会上升,这些都可以在代码内调整,我在相关的地方都有注释,便于你们更好理解
打飞机小游戏终极版
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#define high 30 //游戏画面尺寸
#define width 33 //如果不把这两个变量设为符号常量而设为全局变量,编译器就会报错
//至于为什么大家可以在评论区下讨论,我想看看大家对这个的想法
//问题:符号常量与全局变量有什么区别?
//最后我会公布答案
#define EnemyNum 5 //敌机数目
int x, y; //飞机坐标
int enemy_x[EnemyNum], enemy_y[EnemyNum]; //敌机位置
int score; //得分
int life; //飞机生命值
int bulletwidth; //子弹宽度
int enemy_speed; //敌机速度
int canvas[high][60] = {0}; //二维数组存储游戏画布中对应的元素
//1为飞机,2为子弹,3为敌机
//width + 17 是为了保证飞机右翼不会超出右线
//而之后的enemy_y = rand() * 100 % width + 9;是
//为了保证敌机在左边线以右9个单位的距离
//这是间接的控制飞机左翼不超过左边界的方法
int digit(int s)
{
int ne, t, bi;
ne = s;
int num = 0;
while(ne)
{
t = ne % 10;
ne /= 10;
num++;
}
return num;
}
void startup()
{
x = high - 6;
y = width / 2;
canvas[x][y] = 1;
int k;
for(k = 0; k < EnemyNum; k++)
{
enemy_x[k] = rand() * 100 % 13;
enemy_y[k] = rand() * 100 % width + 9;
canvas[enemy_x[k]][enemy_y[k]] = 3;
}
life = 3;
score = 0;
enemy_speed = 20;
bulletwidth = 0;
}
void gotoxy(int x, int y) //将光标移动到(x,y)位置
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle, pos);
}
void HideCursor()
{
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void show()
{
gotoxy(0, 0);
HideCursor();
int i, j;
for(i = 0; i < high; i++)
{
for(j = 0; j < width + 17; j++)
{
if((i == x) && (j == y))
{
printf("*");
}
else if((i == x + 1) && (j == y - 2))
{
printf(" * *");
j += 3;
}
else if((i == x + 2) && (j == y - 2))
{
printf("* * *");
j += 4;
}
else if((i == x + 3) && (j == y - 6))
{
printf("* * * * * * *");
j += 12;
}
else if((i == x + 4) && (j == y - 8))
{
printf("* * * * * * * * *");
j += 16;
}
else if((i == x + 5) && (j == y - 1))
{
printf("* * ");
j += 3;
}
else if(canvas[i][j] == 3)
printf("@");
else if(canvas[i][j] == 2)
printf("|");
else
printf(" ");
}
printf("#\n");
}
printf("生命值:%d", life);
int space = digit(life);
if(space == 1)
{
for(i = 0; i < width + 8; i++)
printf(" ");
}
else
{
for(i = 0; i < width + 8 - (space - 1); i++)
printf(" ");
}
printf("#\n");
printf("得分:%d", score);
int space2 = digit(score);
if(space2 == 1)
{
for(i = 0; i < width + 9; i++)
printf(" ");
}
else
{
for(i = 0; i < width + 9 - (space2 - 1); i++)
printf(" ");
}
printf("#\n");
for(i = 0; i < width + 17; i++)
printf("#");
}
void updateWithoutInput() //与用户输入无关的更新
{
int i, j, k;
for(i = 0; i < high; i++)
{
for(j = 0; j < width + 17; j++)
{
if(canvas[i][j] == 2)
{
for(k = 0; k < EnemyNum; k++)
{
if((i - 1 == enemy_x[k]) && (j == enemy_y[k]))
{
score++; //得分
if(score % 5 == 0 && enemy_speed > 6)
{
enemy_speed--; //敌机变快
}
if(score % 5 == 0)
bulletwidth++; //子弹变强
canvas[enemy_x[k]][enemy_y[k]] = 0; //敌机已被消灭
enemy_x[k] = rand() % 100 % 13;
enemy_y[k] = rand() * 100 % width + 9;
canvas[enemy_x[k]][enemy_y[k]] = 3; //产生敌机
canvas[i][j] = 0; //子弹消耗掉
}
canvas[i][j] = 0;
if(i > 0)
canvas[i - 1][j] = 2; //子弹向上移动
}
}
}
}
static int speed = 0; //控制敌机下落速度
if(speed < enemy_speed)
speed++;
for(k = 0; k < EnemyNum; k++)
{
if(enemy_x[k] > high) //敌机跑出边界
{
canvas[enemy_x[k]][enemy_y[k]] = 0;
enemy_x[k] = rand() * 100 % 13;
enemy_y[k] = rand() * 100 % width + 9;
canvas[enemy_x[k]][enemy_y[k]] = 3;
score--; //减分
life--;
}
if(enemy_x[k] >= x) //敌机撞上我方
{
life--;
score--;
sleep(1);
if(life == 0)
{
printf("\n任务失败!!!\n");
system("pause");
exit(0);
}
canvas[enemy_x[k]][enemy_y[k]] = 0;
enemy_x[k] = rand() * 100 % 13;
enemy_y[k] = rand() * 100 % width + 9;
canvas[enemy_x[k]][enemy_y[k]] = 3;
}
if(speed == enemy_speed) //敌机下落
{
for(k = 0; k < EnemyNum; k++)
{
canvas[enemy_x[k]][enemy_y[k]] = 0;
enemy_x[k]++;
speed = 0;
canvas[enemy_x[k]][enemy_y[k]] = 3;
}
}
}
}
void updateWithInput() //与用户输入有关的更新
{
char input;
if(kbhit())
{
input = getch();
if(input == 'a')
{
canvas[x][y] = 0;
y--;
canvas[x][y] = 1;
}
if(input == 'd')
{
canvas[x][y] = 0;
y++;
canvas[x][y] = 1;
}
if(input == 'w')
{
canvas[x][y] = 0;
x--;
canvas[x][y] = 1;
}
if(input == 's')
{
canvas[x][y] = 0;
x++;
canvas[x][y] = 1;
}
if(input == ' ')
{
int left = y - bulletwidth;
int right = y + bulletwidth;
if(left < 0)
left = 0;
if(right > width + 16)
right = width + 16;
int k;
for(k = left; k <= right; k++)
canvas[x - 1][k] = 2;
}
}
}
int main()
{
startup();
while(1)
{
show();
updateWithoutInput();
updateWithInput();
}
return 0;
}