那曲檬骨新材料有限公司

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

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

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

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

C語言編程學習基地 ? 來源:C語言編程學習基地 ? 2023-02-26 10:01 ? 次閱讀

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

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

運行效果如下:

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

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

#include 
#include 
#include 




IMAGE  g_Block[16];    // 拼圖碎片
byte  g_Map[4][4];    // 游戲地圖(存儲了每個碎片的下標)
byte  g_EmptyX, g_EmptyY;  // 當前空格的位置
long  g_timeStart;    // 游戲開始時間




// 初始化拼圖
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);
  }
  // 恢復繪圖目標
  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
      {
        // 最后一片拼圖暫時不顯示
        setfillcolor(BLACK);
        solidrectangle(x * 100 + 40, y * 100 + 40, x * 100 + 139, y * 100 + 139);
      }
    }


  // 輸出游戲時間
  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"游戲用時");
  outtextxy(480, 90, s);
}




// 移動拼圖
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;
}




// 將拼圖隨機打亂
void RandMap()
{
  // 初始化目標拼圖
  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)生隨機方向
    int n = (rand() % 4) * 2 + 1;
    int dx = n / 3 - 1;
    int dy = n % 3 - 1;
    // 移動空位
    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;
}




// 進行游戲
void Play()
{
  ExMessage msg;
  while (!IsWin())  // 游戲主循環(huán)
  {
    // 處理鼠標和鍵盤控制
    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());              // 生成隨機種子
  HWND wnd = initgraph(640, 480);      // 創(chuàng)建繪圖窗口
  InitBlock();              // 初始化拼圖


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


  closegraph();
  return 0;
}

大家趕緊去動手試試吧!

審核編輯 :李倩


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

    關(guān)注

    180

    文章

    7614

    瀏覽量

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

    關(guān)注

    88

    文章

    3637

    瀏覽量

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

    關(guān)注

    8

    文章

    652

    瀏覽量

    29458

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

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

    拼圖游戲之新鳥求教老鳥

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

    拼圖游戲

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

    鍵盤拼圖游戲

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

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

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

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

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

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

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

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

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

    拼圖游戲(java)

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

    labview拼圖游戲程序

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

    Delphi教程_奇妙的拼圖游戲

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

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

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

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

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

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

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

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

    ? 每天一個C語言小項目,提升你的編程能力!? 這是個益智游戲,規(guī)則很簡單,按上、下、左、右鍵,使游戲區(qū)域的所有方塊向該方向滑動,每次滑動時,相碰的兩個相同
    的頭像 發(fā)表于 01-16 17:27 ?2152次閱讀
    百家乐官网游戏机说明书| 威尼斯人娱乐官网| 钱百家乐官网取胜三步曲| 永利百家乐赌场娱乐网规则 | 百家乐网站排行| 陕西省| 关于百家乐概率的书| 六合投注系统| 缅甸百家乐娱乐场开户注册| 百家乐官网双面数字筹码怎么出千| 水果机万能遥控器| 做生意门面朝向风水| 葡京百家乐官网的玩法技巧和规则| 大发888好吗| 百家乐时时彩网站| 百家乐官网优惠高的网址| 老虎机上分器原理图| 阴宅风水24山分金| 百家乐官网系统足球博彩通| 大发888游戏平台 新葡京| 娱乐城百家乐打不开| 南京百家乐官网赌博现场被抓| 大发888游戏登陆| 百家乐网络赌博真假| 百家乐官网打劫法| 丘北县| 威尼斯人娱乐城信誉lm0| 风水罗盘24山| 澳门百家乐官网网址多少| A8百家乐赌场娱乐网规则| 百家乐官网群shozo| 百家乐官网电脑游戏高手| 真钱的棋牌游戏| 百家乐专业赌博| 百家乐包赢技巧| 金域百家乐官网娱乐城| 玉林市| 大发888游戏平台dafa 888 gw | 豪华百家乐官网桌子厂家 | 中国百家乐官网澳门真人娱乐平台网址 | 百家乐干洗店|