每天一個(gè)編程小項(xiàng)目,提升你的編程能力!
這是一個(gè)簡(jiǎn)易的拼圖游戲,一共有 15個(gè)數(shù)字方塊,將其一行行的排列為 1~15即可完成。游戲會(huì)記錄下完成拼圖的時(shí)間。我想說的是,很多時(shí)候,精彩的游戲不一定非要用圖片。將游戲的功能和手感都做好,游戲一樣好玩。所以我就做了這個(gè)拼圖游戲當(dāng)作例子。
運(yùn)行效果如下:
簡(jiǎn)單了解游戲后我們就來試試吧!(直接上源碼,大家可以看注釋)
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)手試試吧!
審核編輯 :李倩
-
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)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論