0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

C語言零基礎項目:推箱子游戲!詳細思路+源碼分享

C語言編程學習基地 ? 來源:C語言編程學習基地 ? 2022-12-27 10:38 ? 次閱讀

每天一個C語言小項目,提升你的編程能力!

推箱子是一個來自日本的古老游戲,目的是在訓練你的邏輯思考能力。在一個狹小的倉庫中,要求把木箱放到指定的位置,稍不小心就會出現(xiàn)箱子無法移動或者通道被堵住的情況,所以需要巧妙的利用有限的空間和通道,合理安排移動的次序和位置,才能順利的完成任務。

效果展示:

2ff3889c-84f8-11ed-bfe3-dac502259ad0.png

1、游戲同時支持鼠標和鍵盤操作,鼠標操作時,可點擊任意你想去的地方。

2、提供回復上一步的功能,可以回到任何一步走過的路徑,可以給用戶足夠的思考空間,使用戶的智力在游戲的樂趣中得到充分的鍛煉。也可以一退到底。

3、屏幕上方顯示當前的關(guān)數(shù),您可以方便地選關(guān)進行游戲。

4、在目標文件夾里,可以用記事本打開文件,自行設計游戲關(guān)卡,加載界面及元素,添加后再次打開程序才能更新。

游戲中使用了圖片,【點擊這里下載完整項目】

3020c0b4-84f8-11ed-bfe3-dac502259ad0.png

本項目編譯環(huán)境:Visual Studio 2019/2022,EasyX插件

代碼展示:

////////////////////////////////////////////////////////////
//游戲中用0表示空地,1表示人物,2表示箱子,3表示目的地,6表示圍墻
//
//畫素材的x1和y1都是反的,因為x表示行,但是畫出來x表示列,y同
////////////////////////////////////////////////////////////




#include 
#include 
#include 


int x, y;              //人物坐標
int loop;              //控制是否重新開始
IMAGE img[8];                       //定義IMAGE對象數(shù)組來保存圖片




/*******************函數(shù)聲明*******************/
void blank(int x1, int y1);                  //畫空地
void man  (int x1, int y1);                  //畫皮卡丘
void box  (int x1, int y1);                  //畫箱子
void dest (int x1, int y1);          //畫目的地
void man1 (int x1, int y1);                  //畫在目的地上的皮卡丘
void box1 (int x1, int y1);          //畫在目的地上的箱子
void wall (int x1, int y1);                  //畫圍墻
void man1 (int x1, int y1);          //畫在勝利的皮卡丘
void print(int a[15][15]);                  //把數(shù)組里的全畫出來
void move (int a[15][15], int x1, int y1);  //移動
void find (int a[15][15]);                  //找人物坐標
int  win  (int a[15][15]);          //判斷游戲是否結(jié)束
int  play (int a[15][15]);                  //游戲過程
void play1 (void);                          //游戲關(guān)卡




/*******************函數(shù)定義*******************/
//畫空地
void blank(int x1, int y1)  
{
  putimage(y1, x1, &img[0]);         // 在坐標 (y1, x1) 位置顯示 IMAGE 對象
}


//畫皮卡丘
void man(int x1, int y1)  
{
  putimage(y1, x1, &img[1]);         // 在坐標 (y1, x1) 位置顯示 IMAGE 對象
}


//畫箱子
void box(int x1, int y1)
{
  putimage(y1, x1, &img[2]);         // 在坐標 (y1, x1) 位置顯示 IMAGE 對象
}


//畫目的地
void dest(int x1, int y1)
{
  putimage(y1, x1, &img[3]);         // 在坐標 (y1, x1) 位置顯示 IMAGE 對象
}


//畫在目的地上的皮卡丘
void man1(int x1, int y1)
{
  putimage(y1, x1, &img[4]);         // 在坐標 (y1, x1) 位置顯示 IMAGE 對象
}


//畫在目的地上的箱子
void box1(int x1, int y1)
{
  putimage(y1, x1, &img[5]);         // 在坐標 (y1, x1) 位置顯示 IMAGE 對象
}


//畫圍墻
void wall(int x1, int y1)
{
  putimage(y1, x1, &img[6]);         // 在坐標 (y1, x1) 位置顯示 IMAGE 對象
}


//畫勝利的皮卡丘
void man2(int x1, int y1)
{
  putimage(y1, x1, &img[7]);         // 在坐標 (y1, x1) 位置顯示 IMAGE 對象
}


//把數(shù)組里的全畫出來
void print(int a[][10])
{
  for(int x1 = 0; x1 < 10; x1++)
    for(int y1 = 0; y1 < 10; y1++)
      putimage(60 * y1, 60 * x1, &img[a[x1][y1]]); 
}


//移動
void move(int a[][10], int x1, int y1)
{
  if(a[x + x1][y + y1] == 0 || a[x + x1][y + y1] == 3)
  {
    a[x][y]--;
    a[x + x1][y + y1]++;
    for(int i = 0; i < 60; i++)
    {
      blank(60 * x + i * x1, 60 * y + i * y1);        //擦掉
      man(60 * x + (i + 1) * x1, 60 * y + (i + 1) * y1);
      Sleep(1);                        //為了降低CPU且保存流暢
    }
    if(a[x][y] == 3)
      dest(60 * x, 60 * y);
    x += x1;
    y += y1;
    if(a[x][y] == 4)
      man1(60 * x, 60 * y);
  }
  else if((a[x + x1][y + y1] == 2 || a[x + x1][y + y1] == 5) && (a[x + 2 * x1][y + 2 * y1] == 0 || a[x + 2 * x1][y + 2 * y1] == 3))
  {
    a[x][y]--;
    a[x + x1][y + y1]--;
    a[x + 2 * x1][y + 2 * y1] += 2;
    for(int i = 0; i < 60; i++)
    {
      blank(60 * (x + x1) + i * x1, 60 * (y + y1) + i * y1);          //擦掉
      box(60 * (x + x1) + (i + 1) * x1, 60 * (y + y1) + (i + 1) * y1);
      blank(60 * x + i * x1, 60 * y + i * y1);            //擦掉
      man(60 * x + (i + 1) * x1, 60 * y + (i + 1) * y1);
      Sleep(1);                            //為了降低CPU且保存流暢
    }
    if(a[x][y] == 3)
      dest(60 * x, 60 * y);
    x += x1;
    y += y1;
    if(a[x][y] == 4)
      man1(60 * x, 60 * y);
    if(a[x+x1][y+y1] == 5)
      box1(60 * (x + x1), 60 * (y + y1));
  }
}


//找人物坐標想x,y 
void find(int a[][10])
{
  for(x = 0; x < 10; x++)
    for(y = 0; y < 10; y++)
      if(a[x][y] == 1) return;
}


//判斷游戲是否結(jié)束
int win(int a[][10])
{
  for(int x1 = 0; x1 < 10; x1++)
    for(int y1 = 0; y1 < 10; y1++)
      if(a[x1][y1] == 2) return 0;          //如果還有箱子返回假
  return 1;                        //如果沒有箱子返回真
}




/************************游戲過程**********************/
//游戲過程
int play(int a[][10])
{
  loop = 0;
  print(a);
  find(a);                        //通過find函數(shù)尋找人物的x, y坐標
  do
  {
    switch(getch())                    //獲取鍵盤
    {
      case 'w':
      case 'W':move(a, -1, 0);  break;        //上移 
      case 'a':
      case 'A':move(a, 0, -1);  break;        //左移 
      case 'd':
      case 'D':move(a, 0, 1);    break;        //右移 
      case 's':
      case 'S':move(a, 1, 0);    break;        //下移 
      case 'r':
      case 'R':
      case ' ':loop = 1;    return 0;        //重新開始當前關(guān) 
      case  27:exit(0);    break;          //結(jié)束游戲 
      case 0:
      case 0xE0:                    //如果是方向鍵 
        switch(getch())                //再次獲取鍵盤 
        {
          case 72:move(a, -1, 0);  break;
          case 75:move(a, 0, -1);  break;
          case 77:move(a, 0, 1);   break;
          case 80:move(a, 1 , 0);
        }
    }
  }while(!win(a));                    //通過win函數(shù)判斷是否通過
  man2(60 * x, 60 * y);                  //畫一個開心的皮卡丘
  getch();
  return 0;
}


//游戲關(guān)卡
void play1(void)
{
  int a[5][10][10]={                    //定義三維地圖數(shù)組
          {  {0},
            {0, 0, 6, 6, 6},
            {0, 0, 6, 3, 6},
            {0, 0, 6, 0, 6, 6, 6, 6},
            {6, 6, 6, 2, 0, 2, 3, 6},
            {6, 3, 0, 2, 1, 6, 6, 6},
            {6, 6, 6, 6, 2, 6},
            {0, 0, 0, 6, 3, 6},
            {0, 0, 0, 6, 6, 6} },
          
          {  {6, 6, 6, 6, 6},
            {6, 1, 0, 0, 6},
            {6, 0, 2, 2, 6, 0, 6, 6, 6},
            {6, 0, 2, 0, 6, 0, 6, 3, 6},
            {6, 6, 6, 0, 6, 6, 6, 3, 6},
            {0, 6, 6, 0, 0, 0, 0, 3, 6},
            {0, 6, 0, 0, 0, 6, 0, 0, 6},
            {0, 6, 0, 0, 0, 6, 6, 6, 6},
            {0, 6, 6, 6, 6, 6} },
          
          {  {0, 6, 6, 6, 6},
            {0, 6, 1, 0, 6, 6, 6},
            {0, 6, 0, 2, 0, 0, 6},
            {6, 6, 6, 0, 6, 0, 6, 6},
            {6, 3, 6, 0, 6, 0, 0, 6},
            {6, 3, 2, 0, 0, 6, 0, 6},
            {6, 3, 0, 0, 0, 2, 0, 6},
            {6, 6, 6, 6, 6, 6, 6, 6} },


          {  {0, 6, 6, 6, 6, 6, 6, 6},
            {0, 6, 0, 1, 3, 3, 3, 6},
            {0, 6, 0, 0, 0, 6, 6, 6, 6},
            {6, 6, 6, 2, 0, 0, 0, 0, 6},
            {6, 0, 0, 0, 6, 2, 6, 0, 6},
            {6, 0, 2, 0, 6, 0, 0, 0, 6},
            {6, 0, 0, 0, 6, 6, 6, 6, 6},
            {6, 6, 6, 6, 6} },
  
          {  {0, 6, 6, 6, 6, 6},
            {0, 6, 0, 1, 0, 6, 6, 6},
            {6, 6, 0, 6, 2, 0, 0, 6},
            {6, 0, 5 ,3, 0, 3, 0, 6},
            {6, 0, 0, 2, 2, 0, 6, 6},
            {6, 6, 6, 0, 6, 3, 6},
            {0, 0, 6, 0, 0, 0, 6},
            {0, 0, 6, 6, 6, 6, 6} } };
  int b[10][10];                    //設置當前地圖數(shù)組 
  for(int i = 0; i < 5; i++)
  {
    do
        {
      loop=0;                    //loop置為0
        for(int x1 = 0; x1 < 10; x1++)
          for(int y1 = 0; y1 < 10; y1++)
            b[x1][y1] = a[i][x1][y1];      //對當前地圖數(shù)組分別賦值 
        play(b);
    }while(loop);                  //如果loop被置為1則重新開始
  }
}




/************************主函數(shù)***********************/
int main(void)
{
  initgraph(600, 600);
  setbkcolor(WHITE);
  cleardevice();
  loadimage(&img[0], "圖片\0.jpg");
  loadimage(&img[1], "圖片\1.jpg");
  loadimage(&img[2], "圖片\2.jpg");
  loadimage(&img[3], "圖片\3.jpg");
  loadimage(&img[4], "圖片\4.jpg");
  loadimage(&img[5], "圖片\5.jpg");
  loadimage(&img[6], "圖片\6.jpg");
  loadimage(&img[7], "圖片\7.jpg");
  play1();
  closegraph();
  return 0;
}

大家趕緊去動手試試吧!

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 游戲
    +關(guān)注

    關(guān)注

    2

    文章

    743

    瀏覽量

    26317
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136861
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3616

    瀏覽量

    93739
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    641

    瀏覽量

    29216

原文標題:C語言零基礎項目:推箱子游戲!詳細思路+源碼分享

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    C語言零基項目:貪吃蛇!詳細思路+源碼分享

    每天一個C語言項目,提升你的編程能力!
    發(fā)表于 12-19 11:04 ?722次閱讀

    單片機箱子游戲程序模擬仿真

    單片機箱子游戲程序模擬仿真本程序仿真了ks0108驅(qū)動芯片的12864液晶屏,獨立的5個按鍵,程序的主要部分是箱子的部分的邏輯。增加計時
    發(fā)表于 11-06 20:41

    基于PROTEUS的箱子游戲(proteus仿真電路+匯編源程序)

    基于PROTEUS的箱子游戲
    發(fā)表于 07-06 17:26

    基于單片機箱子游戲設計與制作

    請問基于單片機箱子游戲設計與制作。
    發(fā)表于 12-14 19:34

    LabView資料分享:箱子游戲

    `附件為LabView編寫的箱子游戲,源碼來自網(wǎng)絡,分享給大家,僅供學習用途,不得用于商業(yè)用途。如涉及侵權(quán),請聯(lián)系刪除謝謝。另外:對物聯(lián)網(wǎng)感興趣的童鞋,可以關(guān)注公眾號"玩轉(zhuǎn)
    發(fā)表于 06-14 16:25

    如何利用STM32制作貪吃蛇和箱子游戲?

    如何利用STM32制作貪吃蛇和箱子游戲
    發(fā)表于 09-27 08:07

    基于C語言設計編寫的ARM箱子

    ARM箱子的原型是基于C語言設計編寫的箱子游戲
    發(fā)表于 12-14 08:09

    箱子游戲設計

    箱子游戲設計
    發(fā)表于 06-09 09:49 ?98次下載

    使用C語言在Linux環(huán)境下運行箱子游戲的代碼免費下載

    本文檔的主要內(nèi)容詳細介紹的是使用C語言在Linux環(huán)境下運行箱子游戲的代碼免費下載,現(xiàn)在分享給
    發(fā)表于 05-19 08:00 ?5次下載
    使用<b class='flag-5'>C</b><b class='flag-5'>語言</b>在Linux環(huán)境下運行<b class='flag-5'>推</b><b class='flag-5'>箱子</b><b class='flag-5'>游戲</b>的代碼免費下載

    如何用C語言實現(xiàn)箱子游戲項目

    ? 這篇文章主要為大家詳細介紹了 C語言實現(xiàn)——《箱子項目》 ,文中示例代碼介紹的非常詳細,具
    的頭像 發(fā)表于 11-09 16:28 ?2600次閱讀

    C語言零基項目:打字母游戲詳細思路+源碼分享

    今天就用C語言寫了這么個打字母的小程序,就是以前學習機上那種字母往下掉,然后按相應鍵字母消失的游戲。
    發(fā)表于 12-15 15:02 ?655次閱讀

    C語言零基項目:迷宮游戲詳細思路+源碼分享

    每天一個C語言項目,提升你的編程能力!
    的頭像 發(fā)表于 12-21 10:08 ?973次閱讀

    C語言零基項目:生命游戲!詳細思路+源碼分享

    生命游戲不需要任何玩家,它是一個二維矩形世界,這個世界中的每個方格居住著一個活細胞或為空。
    的頭像 發(fā)表于 12-22 11:17 ?1030次閱讀

    C語言零基項目:自制軍棋游戲!詳細思路+源碼分享

    每天一個C語言項目,提升你的編程能力!
    的頭像 發(fā)表于 12-29 17:14 ?8489次閱讀

    鴻蒙上開發(fā)“箱子”小游戲

    本文我們將逐步分享基于 JAVA UI 開發(fā)的“箱子”小游戲這個項目的構(gòu)建流程。
    的頭像 發(fā)表于 01-05 09:33 ?1092次閱讀