C++游戏开发案例丨数字拼图游戏

Posted 吾鬼博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++游戏开发案例丨数字拼图游戏相关的知识,希望对你有一定的参考价值。


为了梦想可以吃苦,但是不能停止最后一步的胜利

C++游戏开发案例丨数字拼图游戏

C++游戏开发案例丨数字拼图游戏

数字拼图游戏 

小提示:来源于(超简单的 EasyX)如有权联系删除

2021-3-26 慢羊羊  游戏(1)

这是一个简易的拼图游戏。

其实很多时候,精彩的游戏不一定非要用图片。将游戏的功能和手感都做好,游戏一样好玩。

所以我就做了这个拼图游戏当作例子。运行效果如下:

C++游戏开发案例丨数字拼图游戏

完整的 VC 源代码如下:


//////////////////////////////////////////////////////////

// 程序名称:数字拼图游戏                                       //

// 编译环境:Visual C++ 2010,EasyX_20210224     //

// 作    者:慢羊羊                                                  //

// 最后修改:2021-3-26                                          //

/////////////////////////////////////////////////////////

#include <easyx.h>

#include <time.h>

#include <conio.h>



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 * 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++)

{

// 产生随机方向

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()

{

MOUSEMSG msg;

while (!IsWin()) // 游戏主循环

{

// 处理鼠标控制

while (MouseHit())

{

msg = GetMouseMsg();

if (msg.uMsg == WM_LBUTTONDOWN && 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);

}

}


// 处理键盘控制

if (_kbhit())

{

switch (_getch())

{

case 'A':

case 'a': if (g_EmptyX > 0) MoveTo(g_EmptyX - 1, g_EmptyY); break; // 左

case 'S':

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

case 'D':

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

case 'W':

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

case 0:

case 0xE0:  switch (_getch())

{

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

case 80: if (g_EmptyY < 3) MoveTo(g_EmptyX, g_EmptyY + 1); break; // 下

case 75: if (g_EmptyX > 0) MoveTo(g_EmptyX - 1, g_EmptyY); break; // 左

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

}

}

}


// 显示游戏界面

Draw();

Sleep(20);

}

}



// 游戏胜利

void Win()

{

putimage(g_EmptyX * 100 + 40, g_EmptyY * 100 + 40, &g_Block[15]);

}



// 主函数

int main()

{

srand(clock()); // 生成随机种子

HWND wnd = initgraph(640, 480); // 创建绘图窗口

InitBlock(); // 初始化拼图


do

{

RandMap(); // 随机打乱地图

FlushMouseMsgBuffer(); // 清空鼠标缓冲区

while (_kbhit()) _getch(); // 清空键盘缓冲区

g_timeStart = clock(); // 获取游戏开始时间

Play(); // 开始游戏

Win(); // 游戏胜利

}

while (MessageBox(wnd, L"恭喜您成功啦。\n重来一局吗?", L"胜利", MB_YESNO | MB_ICONQUESTION) == IDYES);


closegraph();

return 0;

}


运行
想学习互联网技术(html,JAVA,C++,微信电商,淘宝店商,抖音技术,微信平台,网页设计,游戏设计,平面设计,广告设计,图文设计,商标注册,网站设计,php,视频编辑,图片优化,音频剪辑,计算机软件开发,移动手机软件开发,各种互联网技术咨询)的可以关注,吾鬼博客是你的好朋友[發][發]


C++游戏开发案例丨数字拼图游戏

扫描二维码关注我


以上是关于C++游戏开发案例丨数字拼图游戏的主要内容,如果未能解决你的问题,请参考以下文章

C++ OpenCV制作九宫格拼图游戏

LVGL开发 | lv_lib_100ask之lvgl数字对拼图小游戏(lv_100ask_memory_game)-接口简单使用便捷

LVGL开发 | lv_lib_100ask之lvgl数字对拼图小游戏(lv_100ask_memory_game)-接口简单使用便捷

LVGL开发 | lv_lib_100ask之lvgl数字对拼图小游戏(lv_100ask_memory_game)-接口简单使用便捷

Android拼图游戏开发全纪录0

拼图游戏---需求分析