飞扬的小鸟1.0测试版
为了实战一下图形库的绘制所以尝试了一次动态游戏的制作,事实上这个游戏的代码实现十分简单,只要花时间多加入几个功能就可以了,下面先把1.0测试版放上来,后续再完善功能。
注1:VC++6.0IDE 没有自带图形绘制相关头文件和插件,如果要实现图形绘制需要自行下载EASYX,这个东西的安装十分容易,去百度搜一下EASYX下载就行了,按着步骤安装,然后编写代码的时候加上#include
因为我更喜欢使用vscode,但是我还没搞明白怎么让VS code适配EASYX,如果有人知道可以告诉我一下。。。。
注2:因为图片素材什么的做的不好,等后续找到适合图片的时候再一起上传。
代码如下:
#include
#include
#include
#include
#include
#include
#define BGIMAGE_WIDH 300 //屏幕宽度
#define BGIMAGE_HEIGH 500 //屏幕高度
#define piper_high 1664 //水管最大高度
using namespace std;
void personactions(); //用户操作
void Next(); //更新水管
int isbreak();
IMAGE bgimage; //背景
IMAGE birdsimage; //鸟
IMAGE F_birdsimage; //反补鸟
IMAGE pipersimage; //水管
IMAGE D_pipersimage; //反补水管
IMAGE gameoverimage; //游戏结束图片
int bird_x=100,bird_y=300;
int piper_x=150,piper_y=-1400,D_piper_y=400;
int gameover_x=50,gameover_y=200;
int next_x=1,next_y=1;
int lenth;
int speed_of_screan=50;
int situation;
int main(void)
{
//绘制屏幕
initgraph(BGIMAGE_WIDH,BGIMAGE_HEIGH);
//显示背景 、鸟、上下水管
loadimage(&bgimage,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\背景\\1.png",BGIMAGE_WIDH,800);
loadimage(&birdsimage,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\鸟\\1.png",42,30);
// loadimage(&F_birdsimage,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\鸟\\1-1.png",NOTSRCERASE);
loadimage(&pipersimage,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\水管\\1.png",30);
loadimage(&D_pipersimage,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\水管\\2.png",30);
//打印图片和水管和鸟
putimage(0,-300,&bgimage);
putimage(piper_x,piper_y,&pipersimage);
putimage(piper_x,D_piper_y,&D_pipersimage);
putimage(bird_x,bird_y,&birdsimage);
putimage(bird_x,bird_y,&F_birdsimage);
// 更改种子
srand(time(0));
while (1)
{
bird_y+=5;
piper_x-=5;
//开始绘制
BeginBatchDraw();
putimage(0,-300,&bgimage);
putimage(piper_x,piper_y,&pipersimage);
putimage(piper_x,D_piper_y,&D_pipersimage);
putimage(bird_x,bird_y,&F_birdsimage);
putimage(bird_x,bird_y,&birdsimage);
EndBatchDraw();
//减速屏幕
Sleep(speed_of_screan);
//多项操作
personactions();
Next();
situation=isbreak();
switch (situation)
{
case 0:
loadimage(&gameoverimage,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\文字\\gameover.png",208,48);
putimage(gameover_x,gameover_y,&gameoverimage);
Sleep(3000);
return 0;
break;
default:
break;
}
}
return 0;
}
//用户操作
void personactions(){
if(kbhit()){
if(GetAsyncKeyState(VK_SPACE)||GetAsyncKeyState(VK_LBUTTON)){
bird_y-=10;
}
}
}
//更新水管
void Next(){
if(piper_x<0){
piper_x=BGIMAGE_WIDH;
piper_y=rand()%piper_high;
piper_y=-piper_y;
D_piper_y=rand()%450;
while(piper_y>-(piper_high-BGIMAGE_HEIGH+30)||D_piper_y<(piper_high+piper_y+50)){
piper_y=rand()%piper_high;
piper_y=-piper_y;
D_piper_y=rand()%450;
}
}
}
//碰撞检测
int isbreak(){
if((bird_x+30==piper_x)&&(bird_y<=(piper_high+piper_y)||bird_y+30>=D_piper_y)||bird_x<0||bird_y>BGIMAGE_HEIGH){
return 0;
}
}
几个函数可以自己去EASYX的帮助文档里面看看包含参数是什么,这里先不多做过多解释。
代码实现的图片如下:(话说怎么截动图来着)
飞扬的小鸟2.0测试版
经过昨天半天的补充测试,基本上能够正常的玩这个游戏,但是得分系统还没有完善,并且界面还不是很友好,素材也存在一些问题,但是基本上游戏的基础以及完成,接下来只要进行一些完善就行了。
虽然游戏已经完成了,但是没办法移植到别人的电脑上,目前不知道怎么解决,如果有知道的请告诉我一下。。。
代码如下:
#include
#include
#include
#include
#include
#include
#define BGIMAGE_WIDH 300 //屏幕宽度
#define BGIMAGE_HEIGH 500 //屏幕高度
#define piper_high 1664 //水管最大高度
#define COINS_WIDTH 32
#define COINS_HIGH 32
using namespace std;
void personactions(); //用户操作
void Next(); //更新水管
int isbreak();
void coinsadd();
void show_coins();
IMAGE bgimage; //背景
IMAGE birdsimage; //鸟
IMAGE F_birdsimage; //反补鸟
IMAGE pipersimage; //水管
IMAGE D_pipersimage; //反补水管
IMAGE gameoverimage; //游戏结束图片
IMAGE coins_First,coins_Second,coins_Third;
IMAGE coins_all;
RECT getscore={0,0,0,0};
int bird_x=100,bird_y=300;
int piper_x=150,piper_y=-1400,D_piper_y=400;
int gameover_x=50,gameover_y=200;
int coins_x=piper_x,coins_y=300;
int next_x=1,next_y=1;
int speed_of_screan=50;
int situation;
int choose=1,real=0;
char point='0';
int main(void)
{
//绘制屏幕
initgraph(BGIMAGE_WIDH,BGIMAGE_HEIGH,SHOWCONSOLE);
//显示背景 、鸟、上下水管
loadimage(&bgimage,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\背景\\1.png",BGIMAGE_WIDH,800);
loadimage(&birdsimage,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\鸟\\1.png",42,30);
//loadimage(&F_birdsimage,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\鸟\\1-1.png",NOTSRCERASE);
loadimage(&pipersimage,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\水管\\1.png",30);
loadimage(&D_pipersimage,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\水管\\2.png",30);
loadimage(&coins_First,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\金币\\1.png",24,24);
loadimage(&coins_Second,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\金币\\2.png",24,24);
loadimage(&coins_Third,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\金币\\2.png",24,24);
loadimage(&coins_all,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\金币\\6.png");
//打印图片和水管和鸟
putimage(0,-300,&bgimage);
putimage(piper_x,piper_y,&pipersimage);
putimage(piper_x,D_piper_y,&D_pipersimage);
putimage(bird_x,bird_y,&birdsimage);
putimage(bird_x,bird_y,&F_birdsimage);
/*putimage(coins_x,coins_y,&coins_Second);
putimage(coins_x,coins_y,&coins_First);
putimage(coins_x,coins_y,&coins_Third);
putimage(coins_x,coins_y,&coins_First);*/
putimage(0,0,&coins_all);
show_coins();
// 更改种子
srand(time(0));
while (1)
{
bird_y+=5;
piper_x-=5;
coins_x=piper_x;
//开始绘制
BeginBatchDraw();
putimage(0,-300,&bgimage);
putimage(piper_x,piper_y,&pipersimage);
putimage(piper_x,D_piper_y,&D_pipersimage);
putimage(bird_x,bird_y,&F_birdsimage);
putimage(bird_x,bird_y,&birdsimage);
if(piper_x<0)
choose=1;
if(choose&&piper_x>=0)
show_coins();//putimage(coins_x,coins_y,&coins_Second);
EndBatchDraw();
//减速屏幕
Sleep(speed_of_screan);
//多项操作
personactions();
Next();
situation=isbreak();
coinsadd();
switch (situation)
{
case 0:
loadimage(&gameoverimage,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\文字\\gameover.png",208,48);
putimage(gameover_x,gameover_y,&gameoverimage);
cout<-(piper_high-BGIMAGE_HEIGH+30)||D_piper_y<(piper_high+piper_y+50)){
piper_y=rand()%piper_high;
piper_y=-piper_y;
D_piper_y=rand()%450;
}
}
while(coins_y<=(piper_high+piper_y)||coins_y+24>=D_piper_y)
coins_y=rand()%500;
}
//碰撞检测
int isbreak(){
if((bird_x+30==piper_x)&&(bird_y+10 <(piper_high+piper_y)||bird_y+20>=D_piper_y)
||bird_x<0
||bird_y>BGIMAGE_HEIGH
||((bird_x==piper_x)&&(bird_y+10<(piper_high+piper_y)))
||((bird_x>piper_x&&bird_xD_piper_y))){
cout<=coins_x && bird_x<=coins_x+24 && bird_y>=coins_y && bird_y<=coins_y+24)
||(bird_x+42>=coins_x &&bird_x+42<=coins_x+24 && bird_y>=coins_y && bird_y<=coins_y+24)
||(bird_x+42>=coins_x &&bird_x+42<=coins_x+24 && bird_y+30>=coins_y && bird_y+30<=coins_y+24)
||(bird_x>=coins_x && bird_x<=coins_x+24 && bird_y+30>=coins_y && bird_y+30<=coins_y+24)){
real=1;
return 1;
}
}
//判断增加金币
void coinsadd(){
if(real&&bird_x==coins_x){
point++;
cout<coins_x+30)
real=0;
}
//显示金币
void show_coins(){
static int i=1;
putimage(coins_x,coins_y,COINS_WIDTH,32,&coins_all,(i-1)*COINS_WIDTH,0);
i++;
if(i>=4)
i=1;
}
飞扬的小鸟2.8测试版
2.8测试版完善并优化了界面,整体界面变得比较友好,但是金币的颜色稍微有点问题,如果背景的颜色和金币的颜色冲突的话,金币会变成难看的紫色,这个问题解决方案是用能适配的背景,游戏界面变大,一次界面中能看到两根柱子,两个金币,连贯度提高了,基本上游戏的基础已经出现了,接下来的一段时间先优化开始界面和结束界面,等完善功能以后再开发金币商城,2.8测试版本的代码如下,(这样似乎页面有点冗长,但是这也是没有办法的了)
注:这次写的代码确实不好,但是实在懒得修改算法,一改很多东西都得一起改,下次有时间再做,这次的代码还是过程性编程,没有使用oop思想,可以改进一下如何使用oop思想进行编程,从而能衍生出相类似的游戏。
#include
#include
#include
#include
#include
#include
#define BGIMAGE_WIDH 600 //屏幕宽度
#define BGIMAGE_HEIGH 500 //屏幕高度
#define piper_high 1664 //水管最大高度
#define COINS_WIDTH 32
#define COINS_HIGH 32
using namespace std;
void personactions(); //用户操作
void Next(); //更新水管
int isbreak(); //碰撞检测
void coinsadd(); //金币增加判断
void show_coins(); //打印金币
void show_coins_T();
void show_image(); //打印图片
void loadphotos(); //加载图片
void show(); //打印综合图片
void move(); //人物移动
void gameover(); //游戏结束判断
void control_speed(); //控制速度
IMAGE bgimage; //背景
IMAGE bgimage_T;
IMAGE birdsimage; //鸟
IMAGE F_birdsimage; //反补鸟
IMAGE pipersimage; //上水管
IMAGE D_pipersimage; //下水管
IMAGE gameoverimage; //游戏结束图片
IMAGE coins_allbg; //金币背景
IMAGE coins_all; //金币
RECT getscore={0,0,0,0};//矩形坐标
int bird_x=100,bird_y=300;
int piper_x=250,piper_y=-1400,D_piper_y=400;
int piper_x_T=550,piper_y_T=-1500,D_piper_y_T=450;
int coins_x=piper_x,coins_y=300;
int coins_x_T=piper_x_T,coins_y_T=200;
int gameover_x=50,gameover_y=200;
int next_x=1,next_y=1;
int speed_of_screan=50;
int situation;
int choose=1,choose_T=1,real=0,real_T=0;
int point=0;
int main(void)
{
show();
while (1)
{
//人物移动
move();
//打印综合图片
show_image();
//多项操作
personactions();
Next();
situation=isbreak();
coinsadd();
//碰撞结果的判定
switch (situation)
{
case 0:
gameover();
return 0;
break;
case 1:
choose=0;
break;
case 2:
choose_T=0;
default:
break;
}
control_speed();
}
closegraph();
return 0;
}
//用户操作
void personactions(){
if(kbhit()){
if(GetAsyncKeyState(VK_SPACE)||GetAsyncKeyState(VK_LBUTTON)){
bird_y-=10;
}
}
}
//更新水管 和金币
void Next(){
if(piper_x<0){
piper_x=BGIMAGE_WIDH;
coins_x=piper_x;
piper_y=rand()%piper_high;
piper_y=-piper_y;
D_piper_y=rand()%450;
coins_y=rand()%500;
while(piper_y>-(piper_high-BGIMAGE_HEIGH+30)||D_piper_y<(piper_high+piper_y+50)){
piper_y=rand()%piper_high;
piper_y=-piper_y;
D_piper_y=rand()%450;
}
}
if(piper_x_T<0){
piper_x_T=BGIMAGE_WIDH;
coins_x_T=piper_x_T;
piper_y_T=rand()%piper_high;
piper_y_T=-piper_y_T;
D_piper_y_T=rand()%450;
coins_y_T=rand()%500;
while(piper_y_T>-(piper_high-BGIMAGE_HEIGH+30)||D_piper_y_T<(piper_high+piper_y_T+50)){
piper_y_T=rand()%piper_high;
piper_y_T=-piper_y_T;
D_piper_y_T=rand()%450;
}
}
while(coins_y<=(piper_high+piper_y)||coins_y+24>=D_piper_y)
coins_y=rand()%500;
while(coins_y_T<=(piper_high+piper_y_T)||coins_y_T+24>=D_piper_y_T)
coins_y_T=rand()%500;
}
//碰撞检测
int isbreak(){
if((bird_x+30==piper_x)&&(bird_y+10 <(piper_high+piper_y)||bird_y+20>=D_piper_y)
||bird_x<0
||bird_y>BGIMAGE_HEIGH
||((bird_x==piper_x)&&(bird_y+10<(piper_high+piper_y)))
||((bird_x>piper_x&&bird_xD_piper_y))){
cout<=D_piper_y_T)
||bird_x<0
||bird_y>BGIMAGE_HEIGH
||((bird_x==piper_x_T)&&(bird_y+10<(piper_high+piper_y_T)))
||((bird_x>piper_x_T&&bird_xD_piper_y_T))){
cout<=coins_x && bird_x<=coins_x+24 && bird_y>=coins_y && bird_y<=coins_y+24)
||(bird_x+42>=coins_x &&bird_x+42<=coins_x+24 && bird_y>=coins_y && bird_y<=coins_y+24)
||(bird_x+42>=coins_x &&bird_x+42<=coins_x+24 && bird_y+30>=coins_y && bird_y+30<=coins_y+24)
||(bird_x>=coins_x && bird_x<=coins_x+24 && bird_y+30>=coins_y && bird_y+30<=coins_y+24)){
real=1;
return 1;
}
if((bird_x>=coins_x_T && bird_x<=coins_x_T+24 && bird_y>=coins_y_T && bird_y<=coins_y_T+24)
||(bird_x+42>=coins_x_T &&bird_x+42<=coins_x_T+24 && bird_y>=coins_y_T && bird_y<=coins_y_T+24)
||(bird_x+42>=coins_x_T &&bird_x+42<=coins_x_T+24 && bird_y+30>=coins_y_T && bird_y+30<=coins_y_T+24)
||(bird_x>=coins_x_T && bird_x<=coins_x_T+24 && bird_y+30>=coins_y_T && bird_y+30<=coins_y_T+24)){
real_T=1;
return 2;
}
}
//判断增加金币
void coinsadd(){
if(real&&(bird_x==coins_x+30)){
point++;
cout<coins_x+30)
real=0;
if(bird_x>coins_x_T+30)
real_T=0;
}
//显示金币
void show_coins(){
static int i=1;
putimage(coins_x,coins_y,COINS_WIDTH,32,&coins_allbg,(i-1)*COINS_WIDTH,0,NOTSRCERASE);
putimage(coins_x,coins_y,COINS_WIDTH,32,&coins_all,(i-1)*COINS_WIDTH,0,SRCINVERT);
i++;
if(i>=8)
i=1;
}
void show_coins_T(){
static int j=1;
putimage(coins_x_T,coins_y_T,COINS_WIDTH,32,&coins_allbg,(j-1)*COINS_WIDTH,0,NOTSRCERASE);
putimage(coins_x_T,coins_y_T,COINS_WIDTH,32,&coins_all,(j-1)*COINS_WIDTH,0,SRCINVERT);
j++;
if(j>=8)
j=1;
}
//打印图片
void show_image(){
//开始绘制
BeginBatchDraw();
//绘制背景
if(point<10)
putimage(0,-300,&bgimage);
else
putimage(0,-300,&bgimage_T);
//绘制水管
putimage(piper_x,piper_y,&pipersimage);
putimage(piper_x,D_piper_y,&D_pipersimage);
putimage(piper_x_T,piper_y_T,&pipersimage);
putimage(piper_x_T,D_piper_y_T,&D_pipersimage);
//绘制鸟
putimage(bird_x,bird_y,&F_birdsimage,NOTSRCERASE);
putimage(bird_x,bird_y,&birdsimage,SRCINVERT);
//判断并绘制金币
if(piper_x<0)
choose=1;
if(choose&&piper_x>=0)
show_coins();
if(piper_x_T<0)
choose_T=1;
if(choose_T&&piper_x_T>=0)
show_coins_T();
EndBatchDraw();
//减速屏幕
Sleep(speed_of_screan);
}
//加载图片
void loadphotos(){
//背景图片
loadimage(&bgimage,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\背景\\1.png",BGIMAGE_WIDH,800);
loadimage(&bgimage_T,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\背景\\2.png",BGIMAGE_WIDH,800);
//鸟
loadimage(&birdsimage,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\鸟\\1.png",42,30);
loadimage(&F_birdsimage,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\鸟\\1-2.png",42,30);
//水管
loadimage(&pipersimage,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\水管\\1.png",30);
loadimage(&D_pipersimage,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\水管\\2.png",30);
//金币
loadimage(&coins_allbg,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\金币\\7.png");
loadimage(&coins_all,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\金币\\6.png");
//游戏结束图片
loadimage(&gameoverimage,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\文字\\gameover.png",208,48);
}
//综合打印
void show(){
//绘制屏幕
initgraph(BGIMAGE_WIDH,BGIMAGE_HEIGH,SHOWCONSOLE);
//显示背景 、鸟、上下水管
loadphotos();
//打印图片和水管和鸟
show_image();
// 更改种子
srand(time(NULL));
}
//人物移动
void move(){
bird_y+=5;
piper_x-=5;
piper_x_T-=5;
coins_x=piper_x;
coins_x_T=piper_x_T;
}
//游戏结束操作
void gameover(){
putimage(gameover_x,gameover_y,&gameoverimage);
cout<=10)
speed_of_screan=30;
if(point>=20)
speed_of_screan=10;
}