作业要求:
1.游戏多种类型的敌人(boss,简单敌人等)
2.游戏使用结构体
3.游戏能否进行写档读档
4.游戏画面颜色
//system(“color 5f”);
//0 = 黑色 8 = 灰色
//1 = 蓝色 9 = 淡蓝色
//2 = 绿色 a = 淡绿色
//3 = 湖蓝色 b = 淡浅绿色
//4 = 红色 c = 淡红色
//5 = 紫色 d = 淡紫色
//6 = 黄色 e = 淡黄色
//7 = 白色 f = 亮白色
5.游戏声效
注意:mp3要转成wav型文件!!!(刚在桌面!)
//PlaySound(“C://Users//Administrator//Desktop//1.wav”, NULL, SND_FILENAME | SND_ASYNC | SND_LOOP); //格式工厂
6.游戏难度变化是否合理
7.飞机是否帅气
8.游戏bug多不多
9.游戏是否设置边框
10.其他个性化设定
成效:
代码 :
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h>
#include<time.h>
#define high 28
#define width 41
#define EnemyNum 5 //敌机数目
#define BossNum 2
#include <mmsystem.h>//导入声音头文件
#pragma comment(lib,"Winmm.lib")
int position_x, position_y; //飞机位置
int bullet_x, bullet_y; //子弹位置
int flag; // 飞机的生命条
struct enemy{
int x;
int y;
int life;
}enemy[EnemyNum], boss[BossNum];
int score; //成绩
int canvas[high][width] = {0}; // 二维数组存储游戏画布中对应的元素
// 0为空格,1为飞机Ж,2为子弹!,3为敌机o,4为Boss M
int BulletWidth; //子弹宽度
int EnemyMoveSpeed; //敌机移动速度
int BossMoveSpeed; //Boss移动速度
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() { // 用于隐藏光标b
CONSOLE_CURSOR_INFO cursor_info = {1, 0}; // 第二个值为0表示隐藏光标
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void startup() {
int k;
PlaySound("C://Users//Administrator//Desktop//1.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP); //格式工厂
position_x = high-3;
position_y = width/2;
canvas[position_x][position_y] = 1;
canvas[position_x+1][position_y-1] = 1;
canvas[position_x+1][position_y+1] = 1;
for (k=0;k<EnemyNum;k++){
enemy[k].x = rand() % 3 +1;
enemy[k].y = 2+ (rand()%(width-2));
canvas[enemy[k].x][enemy[k].y] = 3;
}
for (k=0;k<BossNum;k++){
boss[k].x = rand() % 3 +1;
boss[k].y = 2+ (rand()%(width-2));
canvas[boss[k].x][boss[k].y] = 4;
boss[k].life = 2;
}
BulletWidth = 3;
bullet_x = 0;
bullet_y = position_y;
score = 0;
flag = 3;
EnemyMoveSpeed = 25;
}
void show1() {
for(int i=0; i<high; i++)
{
for(int j=0; j<width; j++)
{
if(flag)
{
if (canvas[i][j]==1)
printf("o"); // 输出飞机*
else if (canvas[i][j]==2)
printf("!"); //输出子弹
else if (canvas[i][j]==3)
printf("Y"); //输出敌机Y
else if (canvas[i][j]==4)
printf("M"); //输出敌机Y
else if ( (j == width-1 ) || (i == high-1) || (j==0) || (i==0))
printf("#");
else
printf(" "); //输出空格
}
}
printf("\n");
}
if(flag<=0) {
gotoxy(44,2);
printf("您的得分%d",score);
gotoxy(44,4);
printf("飞机生命值:%d\n",flag);
gotoxy(44,6);
printf("游戏结束");
Sleep(300000);
}
else {
gotoxy(44,2);
printf("您的得分%d",score);
gotoxy(44,4);
printf("飞机生命值:%d\n",flag);
gotoxy(44,8);
printf("//说明:");
gotoxy(44,10);
printf("Space:发射子弹");
gotoxy(44,12);
printf("用W.S.A.D控制飞机");
gotoxy(44,14);
printf("//个性化设计:");
gotoxy(44,16);
printf("Enter:暂停");
gotoxy(44,18);
printf("ESC:退出游戏");
gotoxy(44,20);
printf("//Boss M需要打两次~");
gotoxy(44,22);
printf("//难度变化:");
gotoxy(44,24);
printf("当score超过20分后");
gotoxy(44,26);
printf(" 子弹数减少");
}
}
void FileWrite()
{
FILE* fp;
//int score=20;
fp = fopen("myfile.bin" , "wb");
int i,j;
for (i=0;i<EnemyNum;i++)
{
fwrite(&enemy[i], sizeof(struct enemy), 1, fp);//27字节大小
}
for (j=0;j<BossNum;j++)
{
fwrite(&boss[j], sizeof(struct enemy), 1, fp);//27字节大小
}
fwrite(&position_x, sizeof(int),1,fp);
fwrite(&position_y, sizeof(int),1,fp);
fwrite(&score, sizeof(int),1,fp);
fclose(fp);
printf("\n保存成功\n");
}
void FileRead()
{
for(int i=0; i<high; i++)
{
for(int j=0; j<width; j++)
{
canvas[i][j]=0;
}
printf("\n");
}
FILE *fp;
fp = fopen("myfile.bin","rb"); //打开文件 "w": write写入文件;"r":read读取文件
//C://Users//Administrator//Desktop//419450238秦祉尉.data
if(fp == NULL)
startup();
else
{
int i,j;
for (i=0;i<EnemyNum;i++)
{
fread(&enemy[i], sizeof(struct enemy), 1, fp);//27字节大小
}
for (j=0;j<BossNum;j++)
{
fread(&boss[j], sizeof(struct enemy), 1, fp);//27字节大小
}
fread(&position_x, sizeof(int ), 1, fp);
fread(&position_y, sizeof(int), 1, fp);
fread(&score, sizeof(int), 1, fp);
//printf("%d",score);
}
fclose(fp); // 关闭文件
canvas[position_x][position_y] = 1;
canvas[position_x+1][position_y-1] = 1;
canvas[position_x+1][position_y+1] = 1;
int k;
for (k = 0; k < EnemyNum; k++)
{
canvas[enemy[k].x][enemy[k].y] = 3;
}
for (k = 0; k < BossNum; k++)
{
canvas[boss[k].x][boss[k].y] = 4;
boss[k].life=2;
}
//设置子弹宽度、敌机的速度
BulletWidth = 3;
EnemyMoveSpeed = 25;
HideCursor();
}
void withoutInpute() {
int k;
static int speed =15; //敌机自动下落
if (speed<EnemyMoveSpeed)
speed++;
//if (speed<BossMoveSpeed)
//speed++;
if (speed==EnemyMoveSpeed ){
speed=0;
for(k=0;k<EnemyNum;k++)
{
canvas[enemy[k].x][enemy[k].y] = 0; //残影问题
(enemy[k].x)++;
canvas[enemy[k].x][enemy[k].y] = 3;
}
for(k=0;k<BossNum;k++)
{
canvas[boss[k].x][boss[k].y] = 0; //残影问题
(boss[k].x)++;
canvas[boss[k].x][boss[k].y] = 4;
}
}
for (int i=0;i<high;i++){
for (int j=0;j<width;j++){
if (canvas[i][j]==2) {
for(k=0;k<EnemyNum;k++){
if(i==enemy[k].x && j==enemy[k].y){ //子弹击中敌机
if (score%5==0 && EnemyMoveSpeed>3) // 达到一定积分后,敌机变快
EnemyMoveSpeed--;
if(score>=20)
{
BulletWidth=1;
}
canvas[enemy[k].x][enemy[k].y] = 0; //残影问题
enemy[k].x = 0;
enemy[k].y =2+ (rand()%(width-2));
canvas[enemy[k].x][enemy[k].y] = 3;
score++;
}
}
// 改boss
for(k=0;k<BossNum;k++){
if(i==boss[k].x && j==boss[k].y){ //子弹击中BOss
boss[k].life--;
if(boss[k].life==0)
{
if (score%5==0 && BossMoveSpeed>3) // 达到一定积分后,Boss变快
BossMoveSpeed--;
if(score>=20)
{
BulletWidth=1;
}
canvas[boss[k].x][boss[k].y] = 0; //残影问题
boss[k].x = 0;
boss[k].y =2+ (rand()%(width-2));
canvas[boss[k].x][boss[k].y] = 4;
score++;
boss[k].life=2;
}
}
}
//子弹向上移动
canvas[i][j] = 0;
if (i>0)
canvas[i-1][j] = 2;
}
}
}
//飞机与敌机相撞
for(k=0;k<EnemyNum;k++)
{
if(position_x==enemy[k].x && position_y==enemy[k].y)
{ //子弹击中敌机
canvas[enemy[k].x][enemy[k].y] = 0; //残影问题
enemy[k].x = 0;
enemy[k].y =2+ (rand()%(width-2));
canvas[enemy[k].x][enemy[k].y] = 3;
canvas[enemy[k].x][enemy[k].y] = 0; //残影问题
position_x = high-2;
position_y = width/2;
canvas[enemy[k].x][enemy[k].y] = 1;
flag--;
}
}
for(k=0;k<BossNum;k++){
if(position_x==boss[k].x && position_y==boss[k].y){ //子弹击中Boss
canvas[boss[k].x][boss[k].y] = 0; //残影问题
boss[k].x = 0;
boss[k].y =2+ (rand()%(width-2));
canvas[boss[k].x][boss[k].y] = 4;
canvas[boss[k].x][boss[k].y] = 0; //残影问题
position_x = high-2;
position_y = width/2;
canvas[boss[k].x][boss[k].y] = 1;
flag--;
}
}
for(k=0;k<EnemyNum;k++){
if (enemy[k].x>high){ //敌机跑出下边界
canvas[enemy[k].x][enemy[k].y] = 0; //残影问题
enemy[k].x = 0;
enemy[k].y = 2+ (rand()%(width-2));
canvas[enemy[k].x][enemy[k].y] = 3;
flag--;
}
}
for(k=0;k<BossNum;k++){
if (boss[k].x>high){ //Boss跑出下边界
canvas[boss[k].x][boss[k].y] = 0; //残影问题
boss[k].x = 0;
boss[k].y = 2+ (rand()%(width-2));
canvas[boss[k].x][boss[k].y] = 4;
flag--;
}
}
}
void withInpute()
{
char input;//需要导入 #include<conio.h> 头文件
if(kbhit())
{
input = getch();
if( (input == 'w' ||input == 'W') && position_x > 1 )
{
canvas[position_x][position_y] = 0; //解决拖影问题
canvas[position_x+1][position_y-1] = 0;
canvas[position_x+1][position_y+1] = 0;
position_x--; // 位置上移
}
if( (input == 's' ||input == 'S') && position_x < high-2)
{
canvas[position_x][position_y] = 0; //解决拖影问题
canvas[position_x+1][position_y-1] = 0;
canvas[position_x+1][position_y+1] = 0;
position_x++; // 位置下移
}
if( (input == 'a' ||input == 'A') && position_y > 1)
{
canvas[position_x][position_y] =0; //解决拖影问题
canvas[position_x+1][position_y-1] = 0;
canvas[position_x+1][position_y+1] = 0;
position_y--; // 位置左移
}
if( (input == 'd' ||input == 'D') && position_y < width-2)
{
canvas[position_x][position_y] = 0; //解决拖影问题
canvas[position_x+1][position_y-1] = 0;
canvas[position_x+1][position_y+1] = 0;
position_y++; // 位置右移
}
canvas[position_x][position_y] = 1; //解决拖影问题
canvas[position_x+1][position_y-1] = 1;
canvas[position_x+1][position_y+1] = 1;
if( input == ' ')
{
int left, right;
left = position_y - BulletWidth;
right = position_y + BulletWidth;
for (int k=left; k<=right; k++)
{
if(k>0 || k<width)
{
canvas[position_x-1][k] = 2;
}
}
}
if (input == 'k' ||input == 'K')
{
FileWrite();
}
if (input == 'l' ||input == 'L')
{
system("cls");
FileRead();
}
if(GetAsyncKeyState(VK_RETURN))
{
while(1)
{
Sleep(100);
if(GetAsyncKeyState(VK_RETURN))
{
break;
}
}
}
if(GetAsyncKeyState(VK_ESCAPE))
{
flag=0;
}
}
}
int main()
{
system("color 5f");
//0 = 黑色 8 = 灰色
//1 = 蓝色 9 = 淡蓝色
//2 = 绿色 a = 淡绿色
//3 = 湖蓝色 b = 淡浅绿色
//4 = 红色 c = 淡红色
//5 = 紫色 d = 淡紫色
//6 = 黄色 e = 淡黄色
//7 = 白色 f = 亮白色
HideCursor();
startup(); // 数据初始化
while(1)
{ // 游戏循环执行
gotoxy(0,0); //光标移动到(x,y)位置
show1(); // 显示画面
withoutInpute(); // 与用户输入无关的更新
withInpute(); // 与用户输入有关的更新
}
return 0;
}