每天一個編程小項(xiàng)目,提升你的編程能力!
這是一個簡易的拼圖游戲,一共有 15個數(shù)字方塊,將其一行行的排列為 1~15即可完成。游戲會記錄下完成拼圖的時間。我想說的是,很多時候,精彩的游戲不一定非要用圖片。將游戲的功能和手感都做好,游戲一樣好玩。所以我就做了這個拼圖游戲當(dāng)作例子。
運(yùn)行效果如下:

簡單了解游戲后我們就來試試吧!(直接上源碼,大家可以看注釋)
IMAGE g_Block[16]; // 拼圖碎片
byte g_Map[4][4]; // 游戲地圖(存儲了每個碎片的下標(biāo))
byte g_EmptyX, g_EmptyY; // 當(dāng)前空格的位置
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);
}
// 恢復(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
{
// 最后一片拼圖暫時不顯示
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;
}
// 將拼圖隨機(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;
// 移動空位
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(); // 獲取游戲開始時間
Play(); // 開始游戲
Win(); // 游戲勝利
} while (MessageBox(wnd, L"恭喜您成功啦。
重來一局嗎?", L"勝利", MB_YESNO | MB_ICONQUESTION) == IDYES);
closegraph();
return 0;
}
大家趕緊去動手試試吧!
審核編輯 :李倩
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
C語言
+關(guān)注
關(guān)注
183文章
7644瀏覽量
145603 -
編程
+關(guān)注
關(guān)注
90文章
3716瀏覽量
97191 -
源碼
+關(guān)注
關(guān)注
8文章
685瀏覽量
31320
原文標(biāo)題:【項(xiàng)目實(shí)戰(zhàn)】C語言+easyX帶你實(shí)現(xiàn):數(shù)字拼圖游戲!來試試吧~
文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
熱點(diǎn)推薦
HarmonyOS開發(fā)實(shí)戰(zhàn):【親子拼圖游戲】
編程語言編寫的一個分布式益智拼圖游戲,可以兩臺設(shè)備同時開啟一局拼圖游戲,每次點(diǎn)擊九宮格內(nèi)的圖片,都會同步更新兩臺設(shè)備的圖片位置
拼圖游戲之新鳥求教老鳥
本帖最后由 yl383576734 于 2012-4-11 16:47 編輯
如何在這個拼圖游戲中,加入統(tǒng)計(jì)按鍵次數(shù)和類似排行榜一樣的東西,記錄每一次完成拼圖游戲的按鍵次數(shù),求給位大神幫忙啊
發(fā)表于 04-11 16:42
一個基于Labview的簡易拼圖游戲,各位看官可以看看!順便問下為什么我不能進(jìn)行驗(yàn)證郵箱任務(wù)?
` 本帖最后由 幻世紀(jì) 于 2017-1-11 00:58 編輯
一個基于Labview的簡易拼圖游戲,各位看官可以看看!順便問下注冊完后,為什么我不能像他們一樣進(jìn)行再次驗(yàn)證郵箱任務(wù)?`
發(fā)表于 01-11 00:53
基于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
labview拼圖游戲程序
此程序是基于狀態(tài)機(jī)編程的labview拼圖游戲,共分為五個狀態(tài),其中puzzle.vi為主程序
發(fā)表于 10-29 15:00
?122次下載
LabVIEW拼圖游戲的仿真與設(shè)計(jì)課程詳細(xì)說明
熟悉LabVIEW開發(fā)環(huán)境,掌握基于LabVIEW的虛擬儀器原理、設(shè)計(jì)方法和實(shí)現(xiàn)技巧,運(yùn)用專業(yè)課程中的基本理論和實(shí)踐知識,采用LabVIEW開發(fā)工具,實(shí)現(xiàn)拼圖游戲設(shè)計(jì)和仿真。要求最終實(shí)現(xiàn)
發(fā)表于 04-23 08:00
?38次下載
如何用C語言實(shí)現(xiàn)拼圖游戲項(xiàng)目
? 這篇文章主要為大家詳細(xì)介紹了 C語言實(shí)現(xiàn)——《拼圖游戲項(xiàng)目》 ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下! ? 游戲介紹: 對剛開始接觸
基于STM32設(shè)計(jì)的拼圖小游戲詳解
拼圖游戲在小時候還是經(jīng)常玩,玩法也比較簡單,這里就使用STM32設(shè)計(jì)一個拼圖小游戲分享出來一起學(xué)習(xí)。
目前游戲是通過開發(fā)板上4按鍵進(jìn)行控制圖片的移動,完成最終的
用C語言完美實(shí)現(xiàn)2048數(shù)字方塊游戲
? 每天一個C語言小項(xiàng)目,提升你的編程能力!? 這是個益智游戲,規(guī)則很簡單,按上、下、左、右鍵,使游戲區(qū)域的所有方塊向該方向滑動,每次滑動時,相碰的兩個相同
C語言+easyX帶你實(shí)現(xiàn):數(shù)字拼圖游戲!
評論