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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

C語言+easyX帶你實(shí)現(xiàn):數(shù)字拼圖游戲!

C語言編程學(xué)習(xí)基地 ? 來源:C語言編程學(xué)習(xí)基地 ? 2023-02-26 10:01 ? 次閱讀

每天一個(gè)編程小項(xiàng)目,提升你的編程能力!

這是一個(gè)簡(jiǎn)易的拼圖游戲,一共有 15個(gè)數(shù)字方塊,將其一行行的排列為 1~15即可完成。游戲會(huì)記錄下完成拼圖的時(shí)間。我想說的是,很多時(shí)候,精彩的游戲不一定非要用圖片。將游戲的功能和手感都做好,游戲一樣好玩。所以我就做了這個(gè)拼圖游戲當(dāng)作例子。

運(yùn)行效果如下:

e544867c-b425-11ed-bfe3-dac502259ad0.png

簡(jiǎn)單了解游戲后我們就來試試吧!(直接上源碼,大家可以看注釋)

#include 
#include 
#include 




IMAGE  g_Block[16];    // 拼圖碎片
byte  g_Map[4][4];    // 游戲地圖(存儲(chǔ)了每個(gè)碎片的下標(biāo))
byte  g_EmptyX, g_EmptyY;  // 當(dāng)前空格的位置
long  g_timeStart;    // 游戲開始時(shí)間




// 初始化拼圖
void InitBlock()
{
  // 初始化拼圖碎片
  wchar_t s[3];
  for (int i = 0; i < 16; i++)
  {
    g_Block[i].Resize(100, 100);
    SetWorkingImage(&g_Block[i]);


    // 背景
    setbkcolor(BLACK);
    cleardevice();
    setfillcolor(HSVtoRGB(360.0 * i / 16, 1, 0.5));
    solidrectangle(2, 2, 98, 98);
    // 文字
    settextstyle(64, 0, _T("Arial"), 0, 0, 400, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH);
    setbkmode(TRANSPARENT);
    settextcolor(WHITE);
    _itow_s(i + 1, s, 10);
    outtextxy((100 - textwidth(s)) / 2, 18, s);
  }
  // 恢復(fù)繪圖目標(biāo)
  SetWorkingImage(NULL);
}




// 顯示游戲界面
void Draw()
{
  for (int y = 0; y < 4; y++)
    for (int x = 0; x < 4; x++)
    {
      if (g_Map[x][y] != 15)
        putimage(x * 100 + 40, y * 100 + 40, &g_Block[g_Map[x][y]]);
      else
      {
        // 最后一片拼圖暫時(shí)不顯示
        setfillcolor(BLACK);
        solidrectangle(x * 100 + 40, y * 100 + 40, x * 100 + 139, y * 100 + 139);
      }
    }


  // 輸出游戲時(shí)間
  settextstyle(36, 0, L"微軟雅黑", 0, 0, 400, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH);
  settextcolor(WHITE);
  long curtime = clock();
  wchar_t s[20];
  swprintf_s(s, L"%.2f 秒", (curtime - g_timeStart) / (double)CLOCKS_PER_SEC);
  outtextxy(480, 40, L"游戲用時(shí)");
  outtextxy(480, 90, s);
}




// 移動(dòng)拼圖
void MoveTo(int newx, int newy)
{
  g_Map[g_EmptyX][g_EmptyY] = g_Map[newx][newy];
  g_Map[newx][newy] = 15;
  g_EmptyX = newx;
  g_EmptyY = newy;
}




// 將拼圖隨機(jī)打亂
void RandMap()
{
  // 初始化目標(biāo)拼圖
  for (int i = 0; i < 16; i++)
    g_Map[i % 4][i / 4] = i;
  g_EmptyX = 3;
  g_EmptyY = 3;


  // 打亂拼圖順序。注:只能相鄰交換,否則可能無解
  for (int i = 0; i < 1000; i++)
  {
    // 產(chǎn)生隨機(jī)方向
    int n = (rand() % 4) * 2 + 1;
    int dx = n / 3 - 1;
    int dy = n % 3 - 1;
    // 移動(dòng)空位
    if (g_EmptyX + dx >= 0 && g_EmptyX + dx < 4 && g_EmptyY + dy >= 0 && g_EmptyY + dy < 4)
      MoveTo(g_EmptyX + dx, g_EmptyY + dy);
  }
}




// 判斷拼圖是否成功
bool IsWin()
{
  for (int i = 0; i < 16; i++)
    if (g_Map[i % 4][i / 4] != i)
      return false;
  return true;
}




// 進(jìn)行游戲
void Play()
{
  ExMessage msg;
  while (!IsWin())  // 游戲主循環(huán)
  {
    // 處理鼠標(biāo)和鍵盤控制
    while (peekmessage(&msg, EM_MOUSE | EM_KEY))
    {
      switch (msg.message)
      {
        case WM_LBUTTONDOWN:
          if (msg.x >= 40 && msg.x < 440 && msg.y >= 40 && msg.y < 440)
          {
            int newx = (msg.x - 40) / 100;
            int newy = (msg.y - 40) / 100;


            if (abs(g_EmptyX - newx) + abs(g_EmptyY - newy) == 1)
              MoveTo(newx, newy);
          }
          break;
          
        case WM_KEYDOWN:
          switch(msg.vkcode)
          {
            case VK_LEFT:
            case 'A':
              if (g_EmptyX > 0) MoveTo(g_EmptyX - 1, g_EmptyY);  // 左
              break;


            case VK_UP:
            case 'W':
              if (g_EmptyY > 0) MoveTo(g_EmptyX, g_EmptyY - 1);  // 上
              break;


            case VK_RIGHT:
            case 'D':
              if (g_EmptyX < 3) MoveTo(g_EmptyX + 1, g_EmptyY);  // 右
              break;


            case VK_DOWN:
            case 'S':
              if (g_EmptyY < 3) MoveTo(g_EmptyX, g_EmptyY + 1);  // 下
              break;
          }
          break;
      }
    }


    // 顯示游戲界面
    Draw();
    Sleep(20);
  }
}




// 游戲勝利
void Win()
{
  putimage(g_EmptyX * 100 + 40, g_EmptyY * 100 + 40, &g_Block[15]);
}




// 主函數(shù)
int main()
{
  srand(clock());              // 生成隨機(jī)種子
  HWND wnd = initgraph(640, 480);      // 創(chuàng)建繪圖窗口
  InitBlock();              // 初始化拼圖


  do
  {
    RandMap();              // 隨機(jī)打亂地圖
    flushmessage(EM_MOUSE | EM_KEY);  // 清空鼠標(biāo)和鍵盤緩沖區(qū)
    g_timeStart = clock();        // 獲取游戲開始時(shí)間
    Play();                // 開始游戲
    Win();                // 游戲勝利
  } while (MessageBox(wnd, L"恭喜您成功啦。
重來一局嗎?", L"勝利", MB_YESNO | MB_ICONQUESTION) == IDYES);


  closegraph();
  return 0;
}

大家趕緊去動(dòng)手試試吧!

審核編輯 :李倩


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

    關(guān)注

    180

    文章

    7594

    瀏覽量

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

    關(guān)注

    88

    文章

    3565

    瀏覽量

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

    關(guān)注

    8

    文章

    632

    瀏覽量

    29110

原文標(biāo)題:【項(xiàng)目實(shí)戰(zhàn)】C語言+easyX帶你實(shí)現(xiàn):數(shù)字拼圖游戲!來試試吧~

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    HarmonyOS開發(fā)實(shí)戰(zhàn):【親子拼圖游戲

    編程語言編寫的一個(gè)分布式益智拼圖游戲,可以兩臺(tái)設(shè)備同時(shí)開啟一局拼圖游戲,每次點(diǎn)擊九宮格內(nèi)的圖片,都會(huì)同步更新兩臺(tái)設(shè)備的圖片位置
    的頭像 發(fā)表于 04-16 17:00 ?534次閱讀
    HarmonyOS開發(fā)實(shí)戰(zhàn):【親子<b class='flag-5'>拼圖游戲</b>】

    拼圖游戲之新鳥求教老鳥

    本帖最后由 yl383576734 于 2012-4-11 16:47 編輯 如何在這個(gè)拼圖游戲中,加入統(tǒng)計(jì)按鍵次數(shù)和類似排行榜一樣的東西,記錄每一次完成拼圖游戲的按鍵次數(shù),求給位大神幫忙啊
    發(fā)表于 04-11 16:42

    拼圖游戲

    本帖最后由 eehome 于 2013-1-5 09:57 編輯 拼圖
    發(fā)表于 05-24 22:23

    鍵盤拼圖游戲

    在做鍵盤拼圖游戲時(shí),為什么運(yùn)行時(shí)點(diǎn)擊按鈕圖片沒有反應(yīng)??求各位大神指導(dǎo)。。。
    發(fā)表于 04-06 10:25

    求一份基于labview的拼圖游戲設(shè)計(jì)與論文。。。。

    求一份基于labview的拼圖游戲設(shè)計(jì)與論文。。。。
    發(fā)表于 04-13 19:28

    一個(gè)基于Labview的簡(jiǎn)易拼圖游戲,各位看官可以看看!順便問下為什么我不能進(jìn)行驗(yàn)證郵箱任務(wù)?

    ` 本帖最后由 幻世紀(jì) 于 2017-1-11 00:58 編輯 一個(gè)基于Labview的簡(jiǎn)易拼圖游戲,各位看官可以看看!順便問下注冊(cè)完后,為什么我不能像他們一樣進(jìn)行再次驗(yàn)證郵箱任務(wù)?`
    發(fā)表于 01-11 00:53

    基于屬性節(jié)點(diǎn)調(diào)用的拼圖游戲

    基于屬性節(jié)點(diǎn)調(diào)用的、拼圖游戲
    發(fā)表于 04-07 23:08

    基于STM32設(shè)計(jì)的拼圖游戲的設(shè)計(jì)資料分享

    /download/xiaolong1126626497/20706318二、運(yùn)行效果三、功能介紹因?yàn)榇a原來是在2.8寸屏上設(shè)計(jì)的,但是2.8寸屏摔碎了,現(xiàn)在手上只有塊3.5寸的LCD屏。就把代碼移植到3.5寸屏上顯示了,目前運(yùn)行的效果可以看上面的效果圖。拼圖游戲在...
    發(fā)表于 12-03 08:20

    拼圖游戲(java)

    拼圖游戲(java)   java編寫的一款簡(jiǎn)單的拼圖游戲,可以下載到手機(jī)上玩。..rar
    發(fā)表于 04-09 15:18 ?37次下載

    labview拼圖游戲程序

    此程序是基于狀態(tài)機(jī)編程的labview拼圖游戲,共分為五個(gè)狀態(tài),其中puzzle.vi為主程序
    發(fā)表于 10-29 15:00 ?115次下載

    Delphi教程_奇妙的拼圖游戲

    Delphi教程奇妙的拼圖游戲,很好的Delphi資料,快來下載學(xué)習(xí)吧。
    發(fā)表于 03-16 14:56 ?5次下載

    LabVIEW拼圖游戲的仿真與設(shè)計(jì)課程詳細(xì)說明

    熟悉LabVIEW開發(fā)環(huán)境,掌握基于LabVIEW的虛擬儀器原理、設(shè)計(jì)方法和實(shí)現(xiàn)技巧,運(yùn)用專業(yè)課程中的基本理論和實(shí)踐知識(shí),采用LabVIEW開發(fā)工具,實(shí)現(xiàn)拼圖游戲設(shè)計(jì)和仿真。要求最終實(shí)現(xiàn)
    發(fā)表于 04-23 08:00 ?32次下載
    LabVIEW<b class='flag-5'>拼圖游戲</b>的仿真與設(shè)計(jì)課程詳細(xì)說明

    如何用C語言實(shí)現(xiàn)拼圖游戲項(xiàng)目

    ? 這篇文章主要為大家詳細(xì)介紹了 C語言實(shí)現(xiàn)——《拼圖游戲項(xiàng)目》 ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下! ? 游戲介紹: 對(duì)剛開始接觸
    的頭像 發(fā)表于 11-11 14:13 ?1828次閱讀

    基于STM32設(shè)計(jì)的拼圖游戲詳解

    拼圖游戲在小時(shí)候還是經(jīng)常玩,玩法也比較簡(jiǎn)單,這里就使用STM32設(shè)計(jì)一個(gè)拼圖游戲分享出來一起學(xué)習(xí)。 目前游戲是通過開發(fā)板上4按鍵進(jìn)行控制圖片的移動(dòng),完成最終的
    的頭像 發(fā)表于 02-28 13:45 ?3105次閱讀
    基于STM32設(shè)計(jì)的<b class='flag-5'>拼圖</b>小<b class='flag-5'>游戲</b>詳解

    C語言完美實(shí)現(xiàn)2048數(shù)字方塊游戲

    ? 每天一個(gè)C語言小項(xiàng)目,提升你的編程能力!? 這是個(gè)益智游戲,規(guī)則很簡(jiǎn)單,按上、下、左、右鍵,使游戲區(qū)域的所有方塊向該方向滑動(dòng),每次滑動(dòng)時(shí),相碰的兩個(gè)相同
    的頭像 發(fā)表于 01-16 17:27 ?2042次閱讀