0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言零基础项目:吃豆人小游戏!详细思路+源码分享

C语言编程学习基地 来源:C语言编程学习基地 2023-01-03 11:38 次阅读

每天一个C语言小项目,提升你的编程能力!

《吃豆游戏》是一款休闲小游戏,和贪吃蛇,球球大作战吃食物都是有差不多的游戏逻辑。

这个游戏本身很简单,一共3关,吃掉画面上全部小豆子就过关,被敌人碰到就over。吃大豆子可以让敌人暂时能被你吃,但是后面关卡,敌人恢复时间很短,敌人速度也很快。

当然现在你用代码自己开发的话,设置多少关卡,什么样的难度都看你自己咯!

游戏中使用了图片【https://codebus.cn/f/a/0/0/135/boxman.zip】

01e2fed8-886d-11ed-bfe3-dac502259ad0.png

本项目编译环境:Visual Studio 2019/2022,EasyX插件

代码展示:

#include 
#include 
#include 
#include 


#define M 640                       //开屏大小
#define N 480     
#define rank 1                      //游戏等级                  
 
int  g_sum   = 0;                   //统计吃豆的个数
int  g_score = 0;                   //分数统计
bool g_win   = true;                //成败的标志
IMAGE image[5];                     //装载图片
enum {LEFT=1, RIGHT, UP, DOWN};     //方向的控制
struct figure            //人物属性
{
  int x;           //人物图纸坐标      
  int y;
  int x1;                //人物方向移动
  int y1;
  int x2;           //人物物理坐标
  int y2;
}you,enemy[5];          


/*0豆子,1可以移动地方,2墙壁,3自己,4敌人*/ 
int a[15][20]= {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 
        2,1,0,0,0,0,1,0,1,0,0,0,1,1,1,1,1,1,0,2, 
        2,1,2,2,2,1,1,2,1,1,0,0,0,1,1,4,1,1,0,2, 
        2,1,1,0,2,1,1,2,0,1,1,2,2,2,2,2,0,0,0,2, 
        2,4,1,0,2,1,1,2,1,1,1,0,1,1,1,1,0,1,1,2, 
        2,1,2,1,2,1,1,2,1,3,2,2,1,1,1,1,2,2,1,2, 
        2,1,2,1,2,1,1,1,1,1,1,1,1,0,0,0,1,1,1,2, 
        2,1,2,1,0,1,1,1,1,2,1,0,1,2,2,2,1,1,1,2, 
        2,1,0,1,0,1,2,1,1,2,1,0,1,2,1,1,4,1,1,2, 
        2,1,0,2,0,1,2,1,1,2,1,0,1,2,1,1,1,1,1,2, 
        2,1,0,2,1,1,2,1,1,2,1,0,2,2,1,0,0,0,1,2, 
        2,1,1,2,1,1,2,1,1,2,1,0,2,1,1,2,2,1,1,2, 
        2,1,2,2,1,2,2,1,1,1,1,0,1,4,1,2,0,0,1,2, 
        2,1,0,0,0,0,0,4,0,1,1,0,1,1,1,1,0,0,1,2, 
        2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};/*数组就是地图*/ 


int b[15][20]= {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 
        2,1,0,0,0,0,1,0,1,0,0,0,1,1,1,1,1,1,0,2, 
        2,1,2,2,2,1,1,2,1,1,0,0,0,1,1,4,1,1,0,2, 
        2,1,1,0,2,1,1,2,0,1,1,2,2,2,2,2,0,0,0,2, 
        2,4,1,0,2,1,1,2,1,1,1,0,1,1,1,1,0,1,1,2, 
        2,1,2,1,2,1,1,2,1,3,2,2,1,1,1,1,2,2,1,2, 
        2,1,2,1,2,1,1,1,1,1,1,1,1,0,0,0,1,1,1,2, 
        2,1,2,1,0,1,1,1,1,2,1,0,1,2,2,2,1,1,1,2, 
        2,1,0,1,0,1,2,1,1,2,1,0,1,2,1,1,4,1,1,2, 
        2,1,0,2,0,1,2,1,1,2,1,0,1,2,1,1,1,1,1,2, 
        2,1,0,2,1,1,2,1,1,2,1,0,2,2,1,0,0,0,1,2, 
        2,1,1,2,1,1,2,1,1,2,1,0,2,1,1,2,2,1,1,2, 
        2,1,2,2,1,2,2,1,1,1,1,0,1,4,1,2,0,0,1,2, 
        2,1,0,0,0,0,0,4,0,1,1,0,1,1,1,1,0,0,1,2, 
        2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};/*数组就是地图*/ 


////////////////////////////函数声明/////////////////////////////////
void Init_begin();                  //初始化开始界面
void Initia();                    //初始化界面
void Init_score();                  //记分板
void Init_loss();                  //失败的界面
void Init_win();                  //成功的界面
void Init_leave();                  //离开的界面
void Init_copy();                  //图形复制
void enemymove();                     //敌人运动
void randdire(struct figure *sth);              //使方向随即改变
bool judgemeet();                  //相遇判断
void youmove(int k ,int speed) ;          //对自己进行移动
void mobile();                    //自己移动
void eatbean();                      //判断是否吃小黄点
void play();                    //开始游戏
int  sjs(int a,int b);                //产生a,b之间的数
void enemymeetroad(int i);              //敌人与路
void enemymeetbean(int i) ;                //敌人遇豆子
void load_image();                  //加载图片
void Game_levels();                                 //游戏等级设定                   


/////////////////////////////////////////////////////////////////////


void Init_begin()                   //初始化开始界面
{
  setbkcolor(BLACK);
  char init[20] = "吃豆子游戏";
  int x = M/2 - 250,y = 100;
  setcolor(CYAN);
    setfont(100, 0,"楷体",0,0,FW_DEMIBOLD,false,false,false);
  outtextxy(x,y,init);
  Sleep(400);


   
  RECT r = {x + 50, 250, 540, 460};
  setfont(24, 0, "宋体");
  setcolor(BROWN);
  outtextxy(x + 50, 250,"吃豆子游戏规则:");
  setfont(18, 0, "宋体");
  drawtext("

1:游戏中,操作者可以通过方向键(上、下、左、右)或字母键(‘w’、‘s’、‘a’、‘d’)来调整方向    
2:游戏中途可以按‘空格键’来暂停游戏    
3:按‘ESC’推出游戏",
    &r, DT_WORDBREAK);




  setfont(24, 0,"楷体");
  setcolor(DARKGRAY);
    outtextxy(M/2 - 107,y + 300, "按");
  setcolor(RED);
  outtextxy(M/2 - 80, y + 300, "回车键");
  setcolor(DARKGRAY);
  outtextxy(M/2 , y + 300, "开始游戏");
  char put ;
  put = getch();
  while(put != 13)
       put = getch();
}


/*0豆子,1可以移动地方,2墙壁,3自己,4敌人*/
void Initia()                     //初始化界面
{
  cleardevice();
  setbkcolor(RGB(72,12,12));


  for( int i = 0;i < 15;i++)                      
    for(int j = 0;j < 20;j++)
       putimage(100+j*20,100+i*20,&image[a[i][j]]);


  you.x=9;            you.y=5;          //敌人和自己的初始图纸坐标 
  enemy[0].x=15; enemy[0].y=2; 
  enemy[1].x=1;  enemy[1].y=4; 
  enemy[2].x=16; enemy[2].y=8; 
  enemy[3].x=13; enemy[3].y=12; 
  enemy[4].x=7;  enemy[4].y=13; 


  you.x2 = you.x * 20 + 100;            //图纸坐标转化为屏幕坐标
  you.y2 = you.y * 20 + 100;
  for(i=0;i<5;i++)
  {
    enemy[i].x2 = enemy[i].x * 20 + 100;        
    enemy[i].y2 = enemy[i].y * 20 + 100;
    enemy[i].x1 = 0;  enemy[i].y1 = 1;
  }
  Init_score();
}


void load_image()                                  //加载图片
{
  loadimage(&image[0],"IMAGE", "0.jpg");
  loadimage(&image[1],"IMAGE", "1.jpg");
  loadimage(&image[2],"IMAGE", "2.jpg");
  loadimage(&image[3],"IMAGE", "3.jpg");
  loadimage(&image[4],"IMAGE", "4.jpg");
}


void Init_score()                      //记分板
{
  setbkcolor(RGB(72,12,12));
  char infor[10];
  itoa(g_score,infor,10);
  setcolor(CYAN);
  setfont(28,0,"Arial");
  outtextxy(M - 140,90,"当前分数为");
  setfillstyle(RGB(72,12,12));
  bar(M - 40,140,M - 20,170);
  outtextxy(M - 80,140,infor);
}


int sjs(int a,int b)                               //产生a,b之间的数                        
{
  return a+rand()%(b-a+1);
}


void Init_copy()                                   //图形复制
{ 
  for(int i = 0;i < 15;i++)
    for(int j = 0;j < 20;j++)
      a[i][j] = b[i][j];
}


void enemymeetbean(int i)                  //敌人遇豆子
{
  int x = enemy[i].x2  ;
  int y = enemy[i].y2  ;
  for(int j = 0;j<20;j++)
  {
    putimage(x,y,&image[0]);
    enemy[i].x2 += enemy[i].x1;
    enemy[i].y2 += enemy[i].y1;
    putimage(enemy[i].x2,enemy[i].y2,&image[4]);
  }
}


void enemymeetroad(int i)                        //敌人遇路
{
  int x = enemy[i].x2 ;
  int y = enemy[i].y2  ;
  for(  int j = 0;j < 20;j++)
  {
    putimage(x,y,&image[1]);
    enemy[i].x2 += enemy[i].x1;
    enemy[i].y2 += enemy[i].y1;
    putimage(enemy[i].x2,enemy[i].y2,&image[4]);
  }
}


void enemymove()                         //敌人运动
{ 
  Game_levels();
  for(int i = 0;i < 5;i++)                     //判断是否与墙壁相遇,如果相遇,随即改变方向
  {
    if(a[enemy[i].y+enemy[i].y1][enemy[i].x+enemy[i].x1] == 2  ||  abs(enemy[i].y1) == abs(enemy[i].x1)) 
      randdire(&enemy[i]);
  }
  for(i = 0;i < 5;i++)
  {
    if(a[enemy[i].y ][enemy[i].x] == 0)
      enemymeetbean(i);
    else  
      enemymeetroad(i);
    enemy[i].x+=enemy[i].x1;
    enemy[i].y+=enemy[i].y1;
    if(judgemeet()) break;
  }
  Sleep(180);
}


void Game_levels()                                  //游戏等级设定                   
{
  if( sjs (1,rank) == 1)
    {
    int t = rand() % 5;
    enemy[t].x1 = enemy[t].x - you.x > 0 ? -1 : 1;  
      enemy[t].y1 = enemy[t].y - you.y > 0 ? -1 : 1;
  }
  for(int i = 0;i < 5;i++)
  {
    if(enemy[i].x == you.x && enemy[i].y + 1 == you.y)
    {enemy[i].x1 = 0 ;     enemy[i].y1 = 1;}
    if(enemy[i].x == you.x && enemy[i].y - 1 == you.y)
    {enemy[i].x1 = 0 ;     enemy[i].y1 = -1;}
    if(enemy[i].x + 1 == you.x && enemy[i].y == you.y)
    {enemy[i].x1 = 1 ;     enemy[i].y1 = 0;}
    if(enemy[i].x - 1 == you.x && enemy[i].y == you.y)
    {enemy[i].x1 = -1 ;    enemy[i].y1 = 1;}
  }
}


void randdire( struct figure *sth)            //使方向随即改变 
{
   int b=1;
   int x,y;
   while(b)
   {
     x =sjs(-1,1);
     y=sjs(-1,1);
     if(a[sth->y + y][sth->x + x] != 2 && abs(y) != abs(x))
     {
      b = 0;
      sth->x1 = x;
      sth->y1 = y;
    }
     else b = 1;
  }
}


bool judgemeet  ()                           //相遇判断
{
  for(int i = 0;i < 5;i++)
  {
    if(enemy[i].x == you.x && enemy[i].y == you.y )
    {
      g_win  = false;
      Init_loss();
      return true;
      break;
    }
  }
  return false;
}


void eatbean()                 //判断是否吃小黄点
{
  if(a[you.y][you.x] == 0)
  {
      a[you.y][you.x] = 1;
    g_sum++;
    g_score += 10;
    Init_score();
    a[you.y][you.x] = 1;
  }
}


void youmove(int k)                        //对自己进行移动
{
   switch(k)
  {
  case LEFT:
     you.x1 = -1;you.y1 = 0;
    break;
  case RIGHT:
       you.x1 = 1;you.y1 = 0;
    break;
  case DOWN:
       you.x1 = 0;you.y1 = 1;
    break;
  case UP:
      you.x1 = 0;you.y1 = -1;
    break;
  }
   if(a[you.y + you.y1][you.x + you.x1] != 2)
   {
     int x = you.x2 ;
     int y = you.y2 ;
     for(int j = 0 ;j < 10;j++)
     {
      putimage(x,y,&image[1]);
      you.x2 += you.x1 * 2;
      you.y2 += you.y1 * 2;
      putimage(you.x2,you.y2,&image[3]);
     }
     you.x += you.x1;
     you.y += you.y1;
     eatbean();
   }
 }
 
void Init_loss()                            //失败的界面
{
  cleardevice();
  char str[] = "挑战失败,还需继续努力呀!";
  LOGFONT f;
  getfont(&f);
  f.lfHeight = 48;
  strcpy(f.lfFaceName , "楷体");
  f.lfQuality = ANTIALIASED_QUALITY;
  f.lfWeight = FW_NORMAL;
  setcolor(LIGHTGREEN);
  setfont(&f);
  outtextxy(20,200,str);


  char tryagain[] = "是否想继续挑战?(Y/N)";
  f.lfHeight = 28;
  setfont(&f);
  setcolor(BROWN);
  outtextxy(90,300,tryagain);


  char yesorno ;
  int keep = 1 ;
  while(keep)
  {
    yesorno = getch();
    if(yesorno == 'Y' || yesorno == 'y' || yesorno == 'N' || yesorno == 'n')
      keep = 0;
  }
    
  if(yesorno == 'Y'|| yesorno == 'y')
  {
    g_win   = true;
    g_score = 0;
    g_sum   = 0;
    cleardevice();
    Init_copy();
    Initia();
  }
  else  Init_leave();
}


void Init_leave()
{
  cleardevice();
  char str[] = "下次继续努力吧!";
  LOGFONT f;
  getfont(&f);
  f.lfHeight = 48;
  strcpy(f.lfFaceName , "楷体");
  f.lfQuality = ANTIALIASED_QUALITY;
  f.lfWeight = FW_NORMAL;
  setcolor(LIGHTGREEN);
  setfont(&f);
  outtextxy(150,200,str);
  Sleep(2000);
  exit(0);
}


void Init_win()                             //成功的界面                        
{
  cleardevice();
  char str[] = "恭喜你通过了游戏!!!";
  LOGFONT f;
  getfont(&f);
  f.lfHeight = 48;
  strcpy(f.lfFaceName , "楷体");
  f.lfQuality = ANTIALIASED_QUALITY;
  f.lfWeight = FW_NORMAL;
  setcolor(LIGHTGREEN);
  setfont(&f);
  outtextxy(50,200,str);
  Sleep(4000);


  char tryagain[] = "是否想再次挑战?(Y/N)";
  f.lfHeight = 28;
  setfont(&f);
  setcolor(BROWN);
  outtextxy(70,300,tryagain);


  char yesorno ;
  yesorno = getch();
  if(yesorno == 'y' || yesorno == 'Y')
  {
    g_win   = true;
    g_score = 0;
    g_sum   = 0;
    cleardevice();
    Init_copy();
      Initia();                 
  }
  else  exit(0);
}


void stop()                                 //游戏暂停
{
  char key = 'a';
  char stop[] = "游戏暂停中";
  setcolor(RED);
  setfont(28,0,"楷体");
  outtextxy(230,50,stop);
  Sleep(100);
  while(key != ' ')
  key = getch();
  setcolor(RGB(72,12,12));
  outtextxy(230,50,stop);
}


void play()
{
  setbkcolor(RGB(72,12,12));
  char key;             //获取字母
  int t;                //记录方向
    while(g_win)
  {
    enemymove();
      judgemeet();
    while(kbhit())
    {
      key = getch();
      switch(key)
      {
      case 'a':
      case  75:        t = LEFT;    youmove(t );       break;
      case 'd':
      case  77:     t = RIGHT;  ;  youmove(t );       break;
      case 's':
      case  80:       t = DOWN;      youmove(t );        break;
      case 'w':
      case  72:    t = UP;      youmove(t );       break;
      case  27:    Init_leave();  break;
      case  32:    stop();      break;
      default :                       break;
      }
    }
    if(g_sum == 50)        Init_win();
  }
}


void main()
{
  initgraph(M,N);
  load_image();
  Init_begin();
  setbkcolor(RGB(72,12,12));
   
  srand((unsigned)time(NULL));
  Initia(); 
  play();
  closegraph();
}

大家赶紧去动手试试吧!

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 游戏
    +关注

    关注

    2

    文章

    696

    浏览量

    26039
  • C语言
    +关注

    关注

    180

    文章

    7530

    浏览量

    128586
  • 编程
    +关注

    关注

    88

    文章

    3440

    浏览量

    92388
  • 源码
    +关注

    关注

    8

    文章

    573

    浏览量

    28585

原文标题:C语言零基础项目:吃豆人小游戏!详细思路+源码分享

文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言十字消除游戏详细思路+源码分享

    十字消除,休闲小游戏,在规定时间内,只要是十字线能连接到的相同颜色的方块,就能获得相应的得分,如果点击后没有能够消除的方块会扣除时间,是一款益智小游戏
    发表于 11-28 10:45 832次阅读

    llabview黑白棋小游戏制作详细解析

    `相关课程推荐:《8周LabVIEW视觉项目编程实战特训营》上面这张是效果图编写这样一个界面可以使用到多种不同的思路和技巧,我会按照从简到繁的顺序,分几次来介绍几个不同的方法。 讲由NI 软件工程师阮奇桢为您讲解。llabview黑白棋
    发表于 11-23 15:44

    最受欢迎Labview小游戏(程序实现资料下载)

    一个界面可以使用到多种不同的思路和技巧,我会按照从简到繁的顺序,分几次来介绍几个不同的方法。 讲由NI 软件工程师阮奇桢为您讲解。labview黑白棋小游戏制作详细解析:`
    发表于 04-14 20:11

    Python 开发接人小游戏 TurnipBit

    Python 开发接人小游戏 TurnipBit最近入手了一款MicroPython的开发板-TurnipBit,这个板子比较适合单片机入门,以及青少年编程,因为它有配备的在线图形编程准备工作
    发表于 12-18 12:58

    Micropython TurnipBit 小人

    `4.人小游戏4.1实验目的:²TurnipBit显示滚动数字和静态数字的几种方法²用代码的形式实现静态数字4.2实验器材:²TurnipBit开发板 1块²下载数据线 1条接入互联网的电脑
    发表于 05-18 19:47

    零基础怎样学习C语言呢?

    零基础学c语言如何开始
    发表于 05-15 10:23

    C语言小游戏源码分享

    C语言小游戏源码24点火柴人俄罗斯等等等35个游戏源码网盘分享链接:https://pan.ba
    发表于 04-12 17:11

    利用C语言来编写打地鼠小游戏

    C语言模拟打地鼠小游戏
    的头像 发表于 01-26 14:55 1.5w次阅读

    基于Labview的小游戏飞天忍者猫源码

    基于Labview的小游戏飞天忍者猫源码
    发表于 11-15 18:22 47次下载

    C语言零基项目:打字母游戏详细思路+源码分享

    今天就用C语言写了这么个打字母的小程序,就是以前学习机上那种字母往下掉,然后按相应键字母消失的游戏
    发表于 12-15 15:02 456次阅读

    C语言零基项目:迷宫游戏详细思路+源码分享

    每天一个C语言项目,提升你的编程能力!
    的头像 发表于 12-21 10:08 625次阅读

    C语言零基项目:自制军棋游戏详细思路+源码分享

    每天一个C语言项目,提升你的编程能力!
    的头像 发表于 12-29 17:14 7674次阅读

    C语言零基项目:连连看小游戏

    连连看小游戏速度节奏快,画面清晰可爱,适合细心的玩家。丰富的道具和公共模式的加入,增强游戏的竞争性。多样式的地图,使玩家在各个游戏水平都可以寻找到挑战的目标,长期地保持游戏的新鲜感。
    的头像 发表于 01-04 15:28 533次阅读

    C语言项目:扔香蕉的大猩猩(自制游戏)!详细思路+源码分享

    网上有一个香蕉金刚的跑酷游戏,不过我们这个扔香蕉游戏模仿的并不是这个,而是模仿的微软在 20 多年前的一个小游戏,不知道谁也有印象呢?
    的头像 发表于 01-06 10:58 587次阅读

    C语言小游戏源码大放送

    电子发烧友网站提供《C语言小游戏源码大放送.rar》资料免费下载
    发表于 11-21 10:36 1次下载
    C<b class='flag-5'>语言</b><b class='flag-5'>小游戏</b><b class='flag-5'>源码</b>大放送