正式版的飞扬的小鸟能基本完成一个游戏需要的流程,能输出分数,除了一些小瑕疵,基本上可以正常的推出了,代码如下:
#include<iostream>
#include<graphics.h>
#include<stdio.h>
#include<conio.h>
#include<time.h>
#include<stdlib.h>
#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(); //控制速度
void show_begin_game();
void score_low10(int a);
void score_power10(int score);
int to_text_isbreak(int x,int y,int D_y);
int to_text_coins_isbreak(int x,int y);
IMAGE beginimage;
IMAGE beginimagebg;
IMAGE bgimage; //背景
IMAGE bgimage_T;
IMAGE bgimage_S;
IMAGE birdsimage; //鸟
IMAGE F_birdsimage; //反补鸟
IMAGE pipersimage; //上水管
IMAGE D_pipersimage; //下水管
IMAGE D_pipersimagebg;
IMAGE gameoverimage; //游戏结束图片
IMAGE gameoverimagebg;
IMAGE coins_allbg; //金币背景
IMAGE coins_all; //金币
IMAGE numimage0,numimage1,numimage2,numimage3,numimage4,numimage5,numimage6,numimage7,numimage8,numimage9;
RECT getscore={100,200,200,300};//矩形坐标
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 next_x=1,next_y=1;
int speed_of_screan=50;
int choose=1,choose_T=1,real=0,real_T=0;
int point=0;
int main(void)
{
int situation,flag=0;
show();
while (1)
{
//人物移动
move();
//打印综合图片
show_image();
//多项操作
personactions();
Next();
situation=isbreak();
coinsadd();
//碰撞结果的判定
switch (situation)
{
case 0:
gameover();
flag=1;
break;
case 1:
choose=0;
break;
case 2:
choose_T=0;
default:
break;
}
if(flag){
while(1){
if(kbhit()){
if(GetAsyncKeyState(VK_SPACE)){
bird_x=100,bird_y=300;
piper_x=250,piper_y=-1400,D_piper_y=400;
piper_x_T=550,piper_y_T=-1500,D_piper_y_T=450;
coins_x=piper_x,coins_y=300;
coins_x_T=piper_x_T,coins_y_T=200;
next_x=1,next_y=1;
speed_of_screan=50;
choose=1,choose_T=1,real=0,real_T=0;
point=0;
flag=0;
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 (to_text_isbreak(piper_x ,piper_y,D_piper_y))
return 0;
if(to_text_isbreak(piper_x_T, piper_y_T, D_piper_y_T))
return 0;
if(to_text_coins_isbreak(coins_x,coins_y)==1){
real=1;
return 1;
}
if(to_text_coins_isbreak(coins_x_T,coins_y_T)==1){
real_T=1;
return 2;
}
}
//判断增加金币
void coinsadd(){
if(real&&(bird_x==coins_x+30)){
point++;
cout<<point<<endl;
real=0;
}
if(real_T&&(bird_x==coins_x_T+30)){
point++;
cout<<point<<endl;
real_T=0;
}
if(bird_x>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,0,(i-1)*COINS_WIDTH,NOTSRCERASE);
putimage(coins_x,coins_y,COINS_WIDTH,32,&coins_all,0,(i-1)*COINS_WIDTH,SRCINVERT);
i++;
if(i>=9)
i=1;
}
void show_coins_T(){
static int j=1;
putimage(coins_x_T,coins_y_T,COINS_WIDTH,32,&coins_allbg,0,(j-1)*COINS_WIDTH,NOTSRCERASE);
putimage(coins_x_T,coins_y_T,COINS_WIDTH,32,&coins_all,0,(j-1)*COINS_WIDTH,SRCINVERT);
j++;
if(j>=9)
j=1;
}
//打印图片
void show_image(){
//开始绘制
BeginBatchDraw();
//绘制背景
if(point<10)
putimage(0,-300,&bgimage);
if(point>=10)
putimage(0,-300,&bgimage_T);
if(point>=35)
putimage(0,0,&bgimage_S);
//绘制水管
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();
if(point==0) putimage(576,0,&numimage0);
else if(point<10){
score_low10(point);
}
else if(point>=10&&point<=99){
score_power10(point);
}
EndBatchDraw();
//减速屏幕
Sleep(speed_of_screan);
}
//加载图片
void loadphotos(){
loadimage(&beginimage,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\文字\\game.png",313,72);
loadimage(&beginimagebg,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\文字\\game-1.png",313,72);
//背景图片
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");
loadimage(&bgimage_S,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\背景\\11.png",600,500);
//鸟
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\\金币\\9-1.png",32,288);
loadimage(&coins_all,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\金币\\9.png",32,288);
//游戏结束图片
loadimage(&gameoverimage,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\文字\\gameover.png",313,72);
loadimage(&gameoverimagebg,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\文字\\gameover-1.png",313,72);
loadimage(&numimage0,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\文字\\num0.png");
loadimage(&numimage1,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\文字\\num1.png");
loadimage(&numimage2,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\文字\\num2.png");
loadimage(&numimage3,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\文字\\num3.png");
loadimage(&numimage4,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\文字\\num4.png");
loadimage(&numimage5,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\文字\\num5.png");
loadimage(&numimage6,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\文字\\num6.png");
loadimage(&numimage7,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\文字\\num7.png");
loadimage(&numimage8,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\文字\\num8.png");
loadimage(&numimage9,"D:\\TeqGin\\development\\code\\c c++\\program\\飞扬的小鸟\\素材\\image\\文字\\num9.png");
}
//综合打印
void show(){
//绘制屏幕
initgraph(BGIMAGE_WIDH,BGIMAGE_HEIGH);
//显示背景 、鸟、上下水管
loadphotos();
//游戏开始界面
show_begin_game();
//打印图片和水管和鸟
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(){
const int gameover_x=100;
const int gameover_y=150;
// putimage(gameover_x,gameover_y,&gameoverimagebg,NOTSRCERASE);
putimage(gameover_x,gameover_y,&gameoverimage/*,SRCINVERT*/);
Sleep(1000);
}
//速度控制
void control_speed(){
if(point>=10)
speed_of_screan=30;
if(point>=35)
speed_of_screan=10;
if(point>=60)
speed_of_screan=5;
}
//传入水管的x坐标和上水管的y坐标,下水管的y坐标进行碰撞检测
int to_text_isbreak(int x,int y,int D_y){
if((bird_x+30==x)&&(bird_y+10 <(piper_high+y)||bird_y+20>=D_y)
||bird_y+35<0
||bird_y>BGIMAGE_HEIGH
||((bird_x==x)&&(bird_y+10<(piper_high+y)))
||((bird_x>x&&bird_x<x+28)&&(bird_y+22>D_y))){
cout<<bird_y<<" "<<y+1664<<" "<<bird_y-(1664+y)<<endl;
return 1;
}
else
return 0;
}
int to_text_coins_isbreak(int x,int y){
if((bird_x>=x && bird_x<=x+24 && bird_y>=y && bird_y<=y+24)
||(bird_x+42>=x &&bird_x+42<=x+24 && bird_y>=y && bird_y<=y+24)
||(bird_x+42>=x &&bird_x+42<=x+24 && bird_y+30>=y && bird_y+30<=y+24)
||(bird_x>=x && bird_x<=x+24 && bird_y+30>=y && bird_y+30<=y+24)){
return 1;
}
}
//游戏开始界面
void show_begin_game(){
const int game_begin_x=125;
const int game_begin_y=200;
while(1){
BeginBatchDraw();
putimage(0,-300,&bgimage);
putimage(game_begin_x,game_begin_y,&beginimagebg,NOTSRCERASE);
putimage(game_begin_x,game_begin_y,&beginimage,SRCINVERT);
EndBatchDraw();
if(kbhit())
if(GetAsyncKeyState(VK_SPACE))
break;
}
}
void score_low10(int a){
switch (a)
{
case 1:
putimage(576,0,&numimage1);
break;
case 2:
putimage(576,0,&numimage2);
break;
case 3:
putimage(576,0,&numimage3);
break;
case 4:
putimage(576,0,&numimage4);
break;
case 5:
putimage(576,0,&numimage5);
break;
case 6:
putimage(576,0,&numimage6);
break;
case 7:
putimage(576,0,&numimage7);
break;
case 8:
putimage(576,0,&numimage8);
break;
case 9:
putimage(576,0,&numimage9);
break;
}
}
void score_power10(int score){
int a=score%10;
int b=score/10;
if(a==0) putimage(576,0,&numimage0);
else score_low10(a);
switch (b)
{
case 1:
putimage(550,0,&numimage1);
break;
case 2:
putimage(550,0,&numimage2);
break;
case 3:
putimage(550,0,&numimage3);
break;
case 4:
putimage(550,0,&numimage4);
break;
case 5:
putimage(550,0,&numimage5);
break;
case 6:
putimage(550,0,&numimage6);
break;
case 7:
putimage(550,0,&numimage7);
break;
case 8:
putimage(550,0,&numimage8);
break;
case 9:
putimage(550,0,&numimage9);
break;
}
}