#include <graphics.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <IOSTREAM>
#include <STRING>
using namespace std;
#pragma comment(lib, "msimg32.lib")
#pragma comment(lib, "Winmm.lib")
// 來自公衆号:c語言與cpp程式設計
void printmenu();
void printscore();
void monkeymove();
void printguanshu(int);
void paixu();
void paixu2();
typedef struct targets //-----------------控制水果屬性的結構體連結清單
{
short type; //-----------------随機産生水果的種類
float x; //-----------------坐标
float y;
float speed; //-----------------下落的速度
struct targets* node;
}target;
struct scores //-----------------分數系統
{
int score0; //-----------------得分數
int score1; //-----------------扣分數
int score2; //-----------------最高的分數
char name[20]; //-----------------使用者資訊
char name1[20]; //-----------------最高姓名
}score;
struct _monkey //-----------------猴子的屬性
{
float x; //-----------------坐标
float y;
float speed; //-----------------速度
} monkey;
int main()
{
MessageBox(NULL,"遊戲通過鍵盤的左右鍵控制小猴左右移動,上鍵控制小猴的跳動,按住shift可以加速,點選确定後,輸入使用者名,後回車,點選開始按鈕開始遊戲,遊戲中點選暫停鍵可以暫停遊戲,移開滑鼠後再次點選暫停鍵開始,點選結束鍵可以結束遊戲","楊盼的遊戲說明",MB_OK);//-------------------排名的部分
FILE * fp1; //-----------------記錄玩家姓名成績
FILE * fp; //-----------------記錄最高分
FILE * fp2; //-----------------記錄玩家成績
FILE * fp3; //-----------------記錄玩家姓名
fp1=fopen("排名2.txt","a");
fp2=fopen("排名3.txt","a");
fp3=fopen("test.txt","a");
if ((fp=fopen("排名.txt","r"))==NULL) //-----判斷排名檔案不存在
{
cout<<"目前不存在排名"<<endl; //-----不存在提示
fp=fopen("排名.txt","w"); //-----以隻寫的方式建立一個txt檔案
paixu();
paixu2();
cout<<"請輸入玩家的姓名:"; //-----輸入使用者名并将使用者名儲存到txt
cin>>score.name; //-----輸入玩家的名字
score.score0=0; //---- 初始化
score.score1=0;
score.score2=0;
}
else
{
score.score0=0;
score.score1=0;
fp=fopen("排名.txt","r+"); //------判斷檔案存在打開
fscanf(fp,"%s",&score.name1); //------讀取排名的名字為name1
fscanf(fp,"%d",&score.score2); //------讀取排名的分數為score2
paixu();
paixu2();
cout<<"請輸入玩家的姓名:";
cin>>score.name; //------目前玩家的名字為name
}
int speed=10;
cout<<"請輸入水果的移動速度,要量力而行啊!推薦值10-30: "; // 可以使用者自行設定速度speed為結構體的speed指派
cin>>speed;
srand((unsigned int)time(NULL));
initgraph (750,480, NOCLOSE); // 初始視窗大小
mciSendString("open targets\\明天的記憶.mp3 alias mymusic", NULL, 0, NULL); // 打開音樂
mciSendString("play mymusic", NULL, 0, NULL); // 播放音樂
MOUSEMSG m,m1,m2;
int guanshu=1; //------------------------------關卡全局變量
IMAGE img_scoredel;
loadimage(&img_scoredel, "targets\\scoredel.bmp");
IMAGE img_xigua;
loadimage(&img_xigua, "targets\\xigua.bmp");
IMAGE img_taozi;
loadimage(&img_taozi, "targets\\taozi.bmp");
IMAGE img_boluo;
loadimage(&img_boluo, "targets\\boluo.bmp");
HDC dstDC = GetImageHDC();
HDC srcDC;
IMAGE img_zhadan;
loadimage(&img_zhadan, "targets\\zhadan.bmp");
IMAGE img;
loadimage(&img, "targets\\monkey.bmp");
IMAGE imgbeijing;
loadimage(&imgbeijing, "targets\\背景.jpg",640,480);
IMAGE imgbeijing1;
loadimage(&imgbeijing1, "targets\\背景1.jpg",640,480);
printmenu();
putimage(0, 0, &imgbeijing);
BeginBatchDraw();
target *head=NULL, *point=NULL, *pre=NULL;
int count=0;
int i=0;
int s2=1;
monkey.x=3200; monkey.speed=0; monkey.y=3800;
while(1)
{
//-------------開始暫停結束控制部分
if(MouseHit()) //-------------------- 判斷是否按滑鼠
{
m=GetMouseMsg();
switch(m.uMsg)
{
case WM_LBUTTONDOWN: //-------------------- 滑鼠左鍵
if(m.x>=670&&m.x<=720&&m.y>=0&&m.y<=50) // 滿足開始坐标--------開始
{
while(1)
{
if(MouseHit()) // 判斷是否按滑鼠
{
m1=GetMouseMsg();
switch(m1.uMsg)
{
case WM_LBUTTONDOWN:
if(m1.x>=670&&m1.x<=720&&m1.y>=60&&m1.y<=110) // 滿足暫停坐标進入死循環---------暫停
{
while(1)
{
Sleep(20);
m2=GetMouseMsg();
if(MouseHit()) //---------------------判斷再次點選跳出循環繼續
{
if(m2.uMsg==WM_LBUTTONDOWN && m2.x>=670&&m2.x<=720&&m2.y>=60&&m2.y<=110)
{
break;
}
}
}
}
if(m1.x>=670&&m1.x<=720&&m1.y>=120&&m1.y<=170) //----------結束
{
closegraph();
return 0;
}
break;
}
}
i=rand();
if(guanshu==1)
{
putimage(0,0,&imgbeijing); //------------ 清屏
}
else
{
putimage(0,0,&imgbeijing1); //------------ 清屏
}
printscore();
monkeymove();
printguanshu(guanshu);
srcDC = GetImageHDC(&img);
TransparentBlt(dstDC, monkey.x/10, monkey.y/10, 60, 60, srcDC, 0, 0, 60, 60, RGB(0,0,0));
if((i%1000)<=30 && count<15) //-------------生成水果連結清單 賦随機值
{
point=head;
head=(targets*)malloc(sizeof(targets));
++count;
head->speed=speed;
head->type=(i%6);
head->x=(i%6000);
head->y=-10;
head->node=point;
}
for(pre=point=head;point!=NULL;pre=point,point=point->node)
{
if(abs(point->y-monkey.y)<=300 && abs(monkey.x-point->x)<=300) // 碰到水果的條件
{
if (point->type==3) //------------桃子加分
{
putimage(700,450,&img_scoredel);
score.score0+=10;
}
if (point->type==1) //------------西瓜加分
{
putimage(700,450,&img_scoredel);
score.score0+=20;
}
if (point->type==2) //------------鳳梨加分
{
putimage(700,450,&img_scoredel);
score.score0+=30;
}
if (point->type==0) //------------炸彈減分
{
putimage(700,450,&img_scoredel);
score.score0-=40;
}
if(head==point) //------------周遊連結清單消除滿足條件的水果
{
head=point->node;
free(point);
--count;
point=head;
if(point==NULL)
break;
continue;
}
pre->node=point->node;
free(point);
--count;
point=pre;
continue;
}
if(point->y > 5000) //------------邊界5000
{ //------------沒有接到的水果扣分
if (point->type==3) //------------桃子
{
score.score1+=10;
}
}
if(point->y > 5000)
{
if (point->type==1) //------------西瓜
{
score.score1+=10;
}
}
if(point->y > 5000)
{
if (point->type==2) //-------------鳳梨
{
score.score1+=10;
}
}
if(score.score0>500) //-------------當得分達到500進入第二關
{
guanshu=2;
}
if (score.score1>500) //-------------當沒接到水果扣分達到500要求退出遊戲
{
MessageBox(NULL,"你輸了,系統将儲存您目前的使用者名和得分","楊盼提醒您",MB_OK);
fprintf(fp1,"%s ",score.name); //-寫入所有玩家資訊
fprintf(fp1,"%d\0",score.score0);
fprintf(fp2,"%d\0",score.score0);
fprintf(fp3,"%s ",score.name);
if(score.score0>score.score2) //判斷 如果目前使用者的得分大于最高的曆史得分 那麼則覆寫最高
{
fp=fopen("排名.txt","w");
fprintf(fp,"%s ",score.name);
fprintf(fp,"%d",score.score0);
}
exit(0);
}
if(point->y>5000) //---------------消除超界的水果
{
if(head==point)
{
head=point->node;
free(point);
--count;
point=head;
if(point==NULL)
break;
continue;
}
pre->node=point->node;
free(point);
--count;
point=pre;
continue;
}
if (point->type==3) //-------------------------根據type的随機值顯示不同的水果
{
srcDC = GetImageHDC(&img_taozi); //-----桃子
TransparentBlt(dstDC,point->x/10,point->y/10, 60, 50, srcDC, 0, 0, 60, 50, RGB(0,0,0));
}
if (point->type==1)
{
srcDC = GetImageHDC(&img_xigua); //------西瓜
TransparentBlt(dstDC,point->x/10,point->y/10, 60, 50, srcDC, 0, 0, 60, 50, RGB(0,0,0));
}
if (point->type==2)
{
srcDC = GetImageHDC(&img_boluo); //------鳳梨
TransparentBlt(dstDC,point->x/10,point->y/10, 60, 50, srcDC, 0, 0, 60, 50, RGB(0,0,0));
}
if (point->type==0)
{
srcDC = GetImageHDC(&img_zhadan); //-------炸彈
TransparentBlt(dstDC,point->x/10,point->y/10, 50, 100, srcDC, 0, 0, 50, 100, RGB(0,0,0));
}
if(guanshu==1)
{
(point->y) = (point->y) + (point->speed) + 5*(point->type); //------------------第一關---------------------------------控制不同水果的速度 通過type
}
else
{
(point->y) = (point->y) + (point->speed) + 2*(point->type); //------------------第二關---------------------------------控制不同水果的速度 通過type
(point->x) = (point->x)+3*s2*(point->type);
s2=-s2;
}
}
FlushBatchDraw();
Sleep(10);
}
}
}
}
}
return 0;
}
void printmenu()
{
outtextxy(680,20,"開始");
rectangle(670,0,720,50);
outtextxy(680,80,"暫停");
rectangle(670,60,720,110);
outtextxy(680,140,"結束");
rectangle(670,120,720,170);
char s[20];
sprintf(s, "%d", score.score2); // 顯示最高分玩家名和分
outtextxy(680, 230, s);
outtextxy(680, 200, score.name1);
outtextxy(640, 180, "最高使用者名得分");
}
void printscore()
{
char s[20]; // 整形轉換字元輸出
sprintf(s, "%d", score.score0); // 記分
outtextxy(640, 400, "目前總得分數");
outtextxy(700, 450, s);
sprintf(s, "%d", score.score1);
outtextxy(640, 350, "總扣分");
outtextxy(700, 375, s);
}
void printguanshu(int x)
{
IMAGE img_scoredel;
loadimage(&img_scoredel, "targets\\scoredel.bmp");
switch(x)
{
case 1 :
outtextxy(640,300,"第一關");
break;
case 2 :
putimage(640,300,&img_scoredel);
outtextxy(640,250,"第二關");
break;
}
}
void monkeymove()
{
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ?1:0)
#define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ?0:1 )
if(KEYDOWN(VK_LEFT) && monkey.x>0) //----------------------上下左右控制部分
{
if(KEYDOWN(VK_SHIFT)) //----------------------shift加速,向左
{
monkey.x-=40;
}
else
{
monkey.x-=20;
}
}
else if(KEYDOWN(VK_RIGHT) && monkey.x<5800) //---------------向右
{
if(KEYDOWN(VK_SHIFT))
{
monkey.x+=40;
}
else
{
monkey.x+=20;
}
}
if(KEYDOWN(VK_UP)&&monkey.y==3800) //--------------向上
{
monkey.speed=45;
}
if (KEYDOWN(VK_SPACE)) //----------------------------------暫停
{
system("pause");
}
monkey.y-=monkey.speed;
if(monkey.y>=3800) //---------------------------------超界限處理
{
monkey.y=3800;
monkey.speed=0;
}
else
monkey.speed--;
}
void paixu()
{
FILE *fin;
int x[3],t;
int i,j;
fin=fopen("排名3.txt","r");
for (i=0;i<3;i++) fscanf(fin,"%d",&x[i]);
fclose(fin);
for (i=0;i<3;i++)
for (j=i+1;j<3;j++)
if (x[i] > x[j]){ t=x[i];x[i]=x[j];x[j]=t;};
for (i=0;i<3;i++)
cout<<x[i]<<endl;
}
void paixu2()
{
FILE *fin;
char a[10];
char b[10];
char c[10];
fin=fopen("test.txt","r");
fscanf(fin,"%s%s%s",a,b,c);
fclose(fin);
cout<<a<<endl<<b<<endl<<c<<endl;
}