C语言用封装方法实现飞机大战游戏
本文实例为大家分享了C语言用封装方法实现飞机大战游戏的具体代码,供大家参考,具体内容如下
这是上一次的飞机大战游戏的项目。项目: 最简单的飞机大战游戏
上次没有用函数进行的封装。这次在上次的基础上进行封装和一些功能的优化。
一、项目描述和最终的成果展示
项目描述: 在上一次的基础上用函数进行了封装,对于一些功能也进行了一些优化。
最终效果图如下:
二、用函数进行封装
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<coNIO.h>
//全局变量
int position_x,position_y;//飞机位置
int high,width;//游戏画面尺寸
void startup()//数据的初始化
{
high = 20;
width = 30;
position_x = high/2;//飞机的上下位置
position_y = width/2;//飞机的左右·位置
}
void show()//显示画面
{
system("cls");
int i,j;
for(i=0;i<high;i++)
{
for(j=0;j<width;j++)
{
if( (i == position_x) && (j== position_y))//输出飞机
printf("☆");
else
printf(" ");
}
printf("\n");
}
}
void updateWithoutInput()//与用户输入无关的更新
{
}
void updateWithInput()//与用户输入有关的更新
{
char input;
if(kbhit())//判断有无输入
{
input=getch();
if( input == 'a' || input == 'A')
position_y--;//左移
if( input == 'd' || input == 'D')
position_y++;//右移
if( input == 'w' || input == 'W')
position_x--;//上移
if( input == 's' || input == 'S')
position_x++;//下移
}
}
int main(void)
{
startup(); //数据的初始化
while(1)
{
show();//显示画面
updateWithoutInput();//与用户输入无关的更新
updateWithInput();//与用户输入有关的更新
}
return 0;
}
三、新型的发射子弹功能
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<conio.h>
//全局变量
int position_x,position_y;//飞机位置
int high,width;//游戏画面尺寸
int bullet_x,bullet_y;//子弹位置
//定义隐藏光标函数
void HideCursor()
{
CONSOLE_CURSOR_INFO cursor;
cursor.bVisible = FALSE;
cursor.dwSize = sizeof(cursor);
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorInfo(handle, &cursor);
}
void startup()//数据的初始化
{
high = 120;
width = 100;
position_x = high/2;//飞机的上下位置
position_y = width/2;//飞机的左右·位置
bullet_x = 0;
bullet_y = position_y;
}
void show()//显示画面
{
system("cls");
int i,j;
for(i=0;i<high;i++)
{
for(j=0;j<width;j++)
{
if( (i == position_x) && (j== position_y))//输出飞机
printf("☆");
else if( (i == bullet_x)&&(j == bullet_y))
printf("|");//输出子弹
else
printf(" ");
}
printf("\n");
}
}
void updateWithoutInput()//与用户输入无关的更新
{
if(bullet_x>-1)
bullet_x--;
}
void updateWithInput()//与用户输入有关的更新
{
char input;
if(kbhit())
{
input=getch();
if( input == 'a' || input == 'A')
position_y--;//左移
if( input == 'd' || input == 'D')
position_y++;//右移
if( input == 'w' || input == 'W')
position_x--;//上移
if( input == 's' || input == 'S')
position_x++;//下移
if( input == ' ')
{
bullet_x=position_x-1;
bullet_y=position_y;
}
}
}
int main(void)
{
startup();//数据的初始化
while(1)
{
show();//显示画面
HideCursor();//隐藏光标,防止光标乱闪。
updateWithoutInput();//与用户输入无关的更新
updateWithInput();//与用户输入有关的更新
}
return 0;
}
效果图如下:
发射子弹的功能和上次有了明显的改进,有了一个动态发射的一个效果。
四、实现移动的敌机功能和更正屏幕闪烁,清除光标功能
代码如下;
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<conio.h>
//全局变量
int position_x,position_y;//飞机位置
int high,width;//游戏画面尺寸
int bullet_x,bullet_y;//子弹位置
int enemy_x,enemy_y;//敌机的位置
int score;//得分
//定义隐藏光标函数
void HideCursor()
{
CONSOLE_CURSOR_INFO cursor;
cursor.bVisible = FALSE;
cursor.dwSize = sizeof(cursor);
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorInfo(handle, &cursor);
}
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 startup()//数据的初始化
{
system("color 09");
high = 30;
width =50;
position_x = high/2;//飞机的上下位置
position_y = width/2;//飞机的左右位置
bullet_x = 0;
bullet_y = position_y;
enemy_x=0;
enemy_y=position_y;
score=0;
}
void show()//显示画面
{
//system("cls");
gotoxy(0,0);
int i,j;
for(i=0;i<high;i++)
{
for(j=0;j<width;j++)
{
if( (i == position_x) && (j== position_y))//输出飞机
printf("☆");
else if( (i == bullet_x)&&(j == bullet_y))
printf("|");//输出子弹
else if( (i== enemy_x) && ( j==enemy_y))
printf("*");//输出敌机
else
printf(" ");//输出空格
}
printf("\n");
}
printf("得分:%d\n",score);
}
void updateWithoutInput()//与用户输入无关的更新
{
static int speed=0;
if(bullet_x>-1)
bullet_x--;
if( (bullet_x == enemy_x) && (bullet_y ==enemy_y) )//子弹击中飞机
{
score++;//分数无效
enemy_x=-1;//产生新的敌机
enemy_y=rand()%width;
bullet_x=-2;//子弹无效
}
// 用来控制敌机向下移动的速度,每隔几次循环才移动一次敌机
// 这样修改,虽然用户按键的交互速度还是很快,但是NPC的移动显示可以降速
if(speed<10)
speed++;
if(speed == 10 )
{
enemy_x++;
speed = 0;
}
}
void updateWithInput()//与用户输入有关的更新
{
char input;
if(kbhit())
{
input=getch();
if( input == 'a' || input == 'A')
position_y--;//左移
if( input == 'd' || input == 'D')
position_y++;//右移
if( input == 'w' || input == 'W')
position_x--;//上移
if( input == 's' || input == 'S')
position_x++;//下移
if( input == ' ')
{
bullet_x=position_x-1;
bullet_y=position_y;
}
}
}
int main(void)
{
startup();//数据的初始化
while(1)
{
show();//显示画面
HideCursor();//隐藏光标,防止光标乱闪。
updateWithoutInput();//与用户输入无关的更新
updateWithInput();//与用户输入有关的更新
}
return 0;
}
效果图如下:
五、订正一些BUG和完成一些美化
我们的项目基本是已经完成了。但是还有很多的漏洞。
比如: 飞机控制越界问题,以及敌机越界问题。
而且界面不够好看我们要再美化一下。
以及增加游戏暂停功能。
游戏结束功能。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<conio.h>
//全局变量
int position_x,position_y;//飞机位置
int high,width;//游戏画面尺寸
int bullet_x,bullet_y;//子弹位置
int enemy_x,enemy_y;//敌机的位置
int score;//得分
//定义隐藏光标函数
void HideCursor()
{
CONSOLE_CURSOR_INFO cursor;
cursor.bVisible = FALSE;
cursor.dwSize = sizeof(cursor);
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorInfo(handle, &cursor);
}
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 startup()//数据的初始化
{
system("color 09");
high = 30;
width =50;
position_x = high/2;//飞机的上下位置
position_y = width/2;//飞机的左右位置
bullet_x = 0;
bullet_y = position_y;
enemy_x=0;
enemy_y=position_y;
score=0;
}
void show()//显示画面
{
//system("cls");
gotoxy(0,0);
int i,j;
for(i=0;i<high;i++)
{
for(j=0;j<width;j++)
{
if( (i == position_x) && (j== position_y))//输出飞机
printf("☆");
else if( (i == bullet_x)&&(j == bullet_y))
printf("|");//输出子弹
else if( (i== enemy_x) && ( j==enemy_y))
printf("*");//输出敌机
else if(j==width-1&&i==position_x)
//飞机那一行,因为有飞机多占一格,所以要删除前面的一个空格
printf("\b+");
else if(j==width-1)
printf("+");
else if(i==high-1)
printf("-");
else
printf(" ");//输出空格
}
printf("\n");
}
printf("得分:%d\n",score);
printf("按1键游戏暂停\n");
}
void updateWithoutInput()//与用户输入无关的更新
{
static int speed=0;
if(bullet_x>-1)
bullet_x--;
if( (bullet_x == enemy_x) && (bullet_y ==enemy_y) )//子弹击中飞机
{
score++;//分数无效
enemy_x=-1;//产生新的敌机
enemy_y=rand()%width+1;
bullet_x=-2;//子弹无效
}
// 用来控制敌机向下移动的速度,每隔几次循环才移动一次敌机
// 这样修改,虽然用户按键的交互速度还是很快,但是NPC的移动显示可以降速
if(speed<6)
speed++;
if(speed == 6 )
{
enemy_x++;
if(enemy_x==high-1)//如果飞机越界再次生成
{
enemy_x=-1;//产生新的敌机
enemy_y=rand()%width+1;
}
if( enemy_x==position_x-1)//撞机了 游戏结束
{
system("cls");
printf("飞机坠毁了,游戏结束\n");
printf("分数为:%d\n",score);
printf("请重启再开始新的一局\n");
while(1)
{
}
}
speed = 0;
}
}
void updateWithInput()//与用户输入有关的更新
{
char input;
if(kbhit())
{
input=getch();
if( input == 'a' || input == 'A')
{
position_y--;//左移
if(position_y==0)//判断是否越界
{
position_y++;
}
}
if( input == 'd' || input == 'D')
{
position_y++;//右移
if(position_y==width-2)//判断是否越界
{
position_y--;
}
}
if( input == 'w' || input == 'W')
{
position_x--;//上移
if(position_x==1)//判断是否越界
{
position_x++;
}
}
if( input == 's' || input == 'S')
{
position_x++;//下移
if(position_x==high-1)//判断是否越界
{
position_x--;
}
}
if( input == ' ')//发射子弹
{
bullet_x=position_x-1;
bullet_y=position_y;
}
if( input == '1')//按1键游戏暂停
{
while(1)
{
input=getch();
if(input == '1')//再按1键游戏继续
break;
}
}
}
}
int main(void)
{
startup();//数据的初始化
while(1)
{
show();//显示画面
HideCursor();//隐藏光标,防止光标乱闪。
updateWithoutInput();//与用户输入无关的更新
updateWithInput();//与用户输入有关的更新
}
return 0;
}
效果图如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
相关文章