c语言大丰收游戏源码

简介: c语言大丰收游戏源码
#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;
}
相关文章
|
2月前
|
机器学习/深度学习 C语言
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
【8月更文挑战第5天】本篇文章用C语言采用多文件编写实现了一个基础的扫雷游戏(附源码),并讲解了关于函数递归的基础概念及其相对应的习题练习(附源码)
36 1
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
|
2月前
|
存储 C语言
【C语言】C语言-宾馆客房管理系统(源码+论文)【独一无二】
【C语言】C语言-宾馆客房管理系统(源码+论文)【独一无二】
【C语言】C语言-宾馆客房管理系统(源码+论文)【独一无二】
|
2月前
|
存储 C语言
【C语言】C语言-学生成绩管理系统(源码+数据文件+课程论文)【独一无二】
【C语言】C语言-学生成绩管理系统(源码+数据文件+课程论文)【独一无二】
40 15
|
2月前
|
算法 编译器 C语言
【C语言篇】猜数字游戏(赋源码)
rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的⼤⼩是依赖编译器上实现的,但是⼤部分编译器上是32767。
|
2月前
|
存储 数据可视化 数据安全/隐私保护
【C语言】C语言-成绩管理系统(管理员+教师+学生 源码)【独一无二】
【C语言】C语言-成绩管理系统(管理员+教师+学生 源码)【独一无二】
|
2月前
|
存储 数据可视化 C语言
【C语言】C语言-身份证管理系统(源码+注释)【独一无二】
【C语言】C语言-身份证管理系统(源码+注释)【独一无二】
|
2月前
|
存储 数据可视化 C语言
【C语言】C语言-学生籍贯信息记录系统(源码+论文)【独一无二】
【C语言】C语言-学生籍贯信息记录系统(源码+论文)【独一无二】
|
2月前
|
存储 C语言
【C语言】C语言-学生选修课程系统(源码)【独一无二】
【C语言】C语言-学生选修课程系统(源码)【独一无二】
|
2月前
|
存储 C语言
【C语言】C语言-设备管理系统(源码+数据文件)【独一无二】
【C语言】C语言-设备管理系统(源码+数据文件)【独一无二】
|
2月前
|
存储 数据可视化 Serverless
【C语言】C语言-学籍管理系统(源码+文件存储)【独一无二】
【C语言】C语言-学籍管理系统(源码+文件存储)【独一无二】
下一篇
无影云桌面