赞
踩
开发语言:C语言
开发工具:vs2019+EasyX
开发人员:杨富超,王昊,孟桐冰,郭宇
故事部分:孟桐冰,郭宇
代码部分:杨富超,王昊
CSDN源码下载:梦境寻踪源码
如有疑问,欢迎留言
给初学者:关于VS2019怎么安装EasyX
EasyX文档:EasyX函数文档
这个是用了1周左右的休闲时间,来和四个同学完成的,感觉EasyX确实适合C语言初学者学习,做做小游戏,芜湖,终于结尾了,第一个小游戏,nice
大学以后可以记忆挺深的一个事了。
头文件
#include<graphics.h> // 引用图形库头文件
#include<stdio.h>
#include<stdlib.h>
#include<conio.h> //InputBox,MessageBox
#include<time.h> //随机种子
#include<mmsystem.h> //bgm
#include<windows.h> //bgm
#include "maze.h" //迷宫
#pragma comment(lib,"winmm.lib") //bgm
展示图片原理分享:展示图片EasyX做的很简单,首先,先用 IMAGE 定义一个图片的变量,然后给变量赋值。
运用函数:IMAGE,initgraph,loadimage,putimage
U1S1这几个函数开始后陌生,后面用着就熟悉了
代码:
#include <graphics.h>
#include <conio.h>//头文件
IMAGE start//定义变量
int main()
{
initgraph(1366, 700);//定义窗口大小长,宽
loadimage(&start, L"picture\\start.jpg");//赋值操作,把路径的图片赋值给start(之前定义的变量)
putimage(0, 0, &start);//从x=0,y=0,开始展示start赋值的图片,即picture\\start.jpg
}
鼠标操作原理:先定义1块长宽确定的窗口,再通过x,y坐标确定鼠标位置。
运用函数:MOUSEMSG,FlushMouseMsgBuffer,MouseHit ,msg.uMsg,WM_LBUTTONDOWN,注意看EasyX官网文档介绍
/*下面进行鼠标交互*/ MOUSEMSG msg;//定义变量,保存鼠标消息 FlushMouseMsgBuffer();// 清空鼠标消息缓冲区,避免无效鼠标信息带入到正式判断中 while (true) // 主循环,循环监听鼠标信息 { while (MouseHit())//监听鼠标信息;当有鼠标消息的时候执行,可检测连续的鼠标信息 { msg = GetMouseMsg();//获取鼠标消息 if (WM_LBUTTONDOWN == msg.uMsg)//判断鼠标信息;鼠标左键按下 { if (msg.x > 460 && msg.x < 820 && msg.y > 600 && msg.y < 635)//鼠标点击特定区域,即按钮所在区域 { Background_1();//调用介绍背景函数 } } } } }
运用函数:InputBox,MessageBox,
注意:要用wchar_t 定义字符串,具体介绍看下官网的函数文档
InputBox:交互窗口,用户可以输入信息。
MessageBox:信息提醒窗口,展示信息。
代码:
wchar_t s1[50];
InputBox(s1, 20, _T("请输入猜测的数字"), _T("Guess"), 0, 0, false);
MessageBox(NULL, _T("恭喜您猜测正确,金币数加500"), _T("Guess"), MB_OKCANCEL | MB_SETFOREGROUND);
运用函数:mciSendString
注意:
_T(“open+空格+路径+alias+变量名(可变)”),0,0,0
TEXT(“play+空格+变量名+repeat”),0,0,0
如果不加repeat,那么只播放一遍,加上repeat,会循环播放,
路径是不允许存在空格的
头文件为:
#include<mmsystem.h> //bgm
#include<windows.h> //bgm
#pragma comment(lib,“winmm.lib”) //bgm
代码:
mciSendString(_T("open notangry.mp3 alias music"), 0, 0, 0);
mciSendString(TEXT("play music repeat"), 0, 0, 0);
注意:需要用的图片在我的CSDN源码里面
3X3拼图,是有一半几率不能拼出来的,涉及高数知识,不细讲,
但是有算法可以解决,我的代码是运用了这个算法的,不难,很简单
代码:
#include<graphics.h> // 引用图形库头文件 #include<stdio.h> #include<stdlib.h> #include<conio.h> //InputBox,MessageBox #include<time.h> //随机种子 #include<mmsystem.h> //bgm #include<windows.h> //bgm #include "maze.h" //迷宫 #pragma comment(lib,"winmm.lib") //bgm /*全局变量*/ # define IMA_HEIGHT 699 //拼图图片的长 # define IMA_WIDTH 699//拼图图片的宽 # define SIZE 233 //拼图图片大小 # define ROW (IMA_HEIGHT/SIZE) # define COL (IMA_WIDTH/SIZE) int y = 0;//拼图判断 IMAGE image; IMAGE image1; IMAGE img[ROW * COL]; void JigsawGame() { srand((unsigned)time(NULL)); GameInit();//分割图片 MixImg();//打乱图片 while (1) { DrawMap(); GamePlay(); GameDone(); if (y == 1) { break; } } } void GameInit() { loadimage(&image, L"picture\\pintu.jpg", IMA_HEIGHT, IMA_WIDTH); loadimage(&image1, L"picture\\pintu2.jpg", IMA_HEIGHT, IMA_WIDTH); putimage(699, 0, &image1); SetWorkingImage(&image); //这个函数用于设定当前的绘图设备。设定image为绘图窗口 int n = 0; for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { getimage(&img[n++], j * SIZE, i * SIZE, SIZE, SIZE);//得到分割的区域; } } SetWorkingImage(NULL); //把窗口设置为当前的绘图工作区,为默认绘图窗口,即默认,相当于重开 //将最后一块图片换成空格图片 loadimage(&img[ROW * COL - 1], L"blank.jpg", SIZE, SIZE);//空白 n = 0; for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { arr[i][j] = n; n++; } } } void DrawMap() { for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { putimage(j * SIZE, i * SIZE, &img[arr[i][j]]); } } } void GamePlay() { int Blank_i, Blank_j;//空白图片的列,行坐标; int Mouse_i, Mouse_j;//鼠标的列,行坐标; for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { if (arr[i][j] == ROW * COL - 1) { Blank_i = i; Blank_j = j; } } } MOUSEMSG msg = { 0 };//定义一个鼠标消息; msg = GetMouseMsg(); switch (msg.uMsg) { case WM_LBUTTONDOWN: //获取点击图片的坐标; Mouse_i = msg.y / SIZE; Mouse_j = msg.x / SIZE; if (Mouse_i == Blank_i && Mouse_j == Blank_j - 1 || Mouse_i == Blank_i && Mouse_j == Blank_j + 1 || Mouse_j == Blank_j && Mouse_i == Blank_i - 1 || Mouse_j == Blank_j && Mouse_i == Blank_i + 1 ) { arr[Blank_i][Blank_j] = arr[Mouse_i][Mouse_j]; arr[Mouse_i][Mouse_j] = ROW * COL - 1; } else if (msg.x > 1139 && msg.x < 1329 && msg.y > 116 && msg.y < 170) { JigsawGame(); } break; } } void MixImg() { // 0~ROW*COL-1的数; int a[ROW * COL - 1]; int i, j; for (i = 0; i < ROW * COL - 1; i++) { int n = rand() % (ROW * COL - 1); for (j = 0; j < i; j++) { if (a[j] == n) { i--; break; } } if (j >= i) a[i] = n; } int cnt = 0; for (i = 0; i < ROW * COL - 1; i++) for (j = i + 1; j < ROW * COL - 1; j++) { if (a[i] > a[j]) //排除空白块0 cnt++; } if (cnt % 2) //奇排列则无解 { MixImg(); } int n = 0; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { arr[i][j] = a[n]; arr[ROW - 1][COL - 1] = ROW * COL - 1; n++; } } } void GameDone() { int i, j; int n = 0; int count = 0; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if (arr[i][j] == n) { count++; } n++; } } if (count == ROW * COL) { y = 1; } }
EasyX做一个迷宫游戏
代码:
#include<graphics.h> #include <vector> #include <stack> #include<conio.h> using std::stack; // 使用STL的栈 using std::vector; // 使用STL的数组容器 // 游戏信息 #define WIN_WIDTH 1366 // 窗口的宽度(单位:像素) #define WIN_HEIGHT 700 // 窗口的高度(单位:像素) // !!注:由于随机生成算法的原因,地图宽高只能为奇数 #define GAME_WIDTH 21 // 地图的宽度(单位:块) #define GAME_HEIGHT 21 // 地图的高度(单位:块) #define WALL 1 // 墙壁的数字标记 #define GROUND 0 // 地面的数字标记 #define FILLSTATE 2 // 加油站的数字标记 #define ENDPOS 3 // 终点的数字标记 #define MAXVIEW 5.0 // 最大的视野 #define MINVIEW 1 // 最小的视野 #define FILLNUM 10 // 加油站的数量 #define DARKTIME 8 // 视野下降1图块所需的时间 // 全局变量列表 int g_BlockSize; // 块大小 int g_GameMap[GAME_HEIGHT][GAME_WIDTH]; // 地图(宽高单位为块) POINT g_EndPos; // 终点位置 POINT g_PlayerPos; // 玩家在地图上的位置 POINT g_CameraPos; // 摄像机(屏幕左上角)在地图上的位置 IMAGE g_MapImage; // 地图的图片(由于地图是固定的,在不改变缩放的情况下只需要绘制一次) double g_ViewArray; // 视野 UINT g_BeginTime; // 游戏开始时的时间 UINT g_LastFillTime; // 上次为油灯加油的时间 void initGame(); // 初始化游戏 void endGame(); // 结束游戏 void draw(); // 绘制函数 bool upDate(); // 数据更新函数 void absDelay(int delay); // 绝对延迟 bool canMove(POINT pos); // 判断某个位置是否可以移动 void computeCameraPos(); // 计算摄像机在地图上的位置 void rePaintMap(); // 重绘地图 void drawWall(POINT pos); // 绘制墙壁图块的函数 void drawGround(POINT pos); // 绘制地面图块的函数 void drawFillState(POINT pos); // 绘制油灯图块的函数 void drawEndPos(POINT pos); // 绘制终点 void drawPlayer(); // 绘制人物的函数 void drawView(); // 绘制视野 int maze() { initGame(); while (1) { if (!upDate()) break; // 更新 draw(); // 绘制 absDelay(16); // 绝对延迟 16 毫秒,控制每秒 60 帧 } endGame(); return 0; } void initGame() { g_BlockSize = 32; // 初始图块大小为 32 个像素 srand(GetTickCount()); // 初始化随机数生成 // 初始化间隔室 for (int i = 0; i < GAME_HEIGHT; i++) { for (int j = 0; j < GAME_WIDTH; j++) { if (i % 2 == 0 || j % 2 == 0) // 奇数行奇数列设为墙壁 g_GameMap[i][j] = WALL; else g_GameMap[i][j] = GROUND; } } // 随机生成地图(使用深度优先遍历) stack<POINT> stepStack; // 步骤栈 vector<POINT> stepPoint; // 四周的点 POINT nowPoint; // 当前步的所在点 stepStack.push({ 1,1 }); // 写入初始点 (1,1) 作为起点 nowPoint = { 1,1 }; g_GameMap[1][1] = 0xFFFF; // 标记这个点 while (!stepStack.empty()) // 只要步骤栈不空就继续循环 { // 得到四周的点 POINT tempPoint; for (int i = -1; i <= 1; i += 2) { tempPoint = { nowPoint.x,nowPoint.y + i * 2 }; // 计算点 // 判断坐标是否合法 if (tempPoint.x >= 0 && tempPoint.x <= GAME_WIDTH - 1 && tempPoint.y >= 0 && tempPoint.y <= GAME_HEIGHT - 1 && g_GameMap[tempPoint.y][tempPoint.x] != 0xFFFF) { stepPoint.push_back(tempPoint); } tempPoint = { nowPoint.x + i * 2 ,nowPoint.y }; // 计算点 // 判断坐标是否合法 if (tempPoint.x >= 0 && tempPoint.x <= GAME_WIDTH - 1 && tempPoint.y >= 0 && tempPoint.y <= GAME_HEIGHT - 1 && g_GameMap[tempPoint.y][tempPoint.x] != 0xFFFF) { stepPoint.push_back(tempPoint); } } // 根据周围点的量选择操作 if (stepPoint.empty()) // 如果周围点都被遍历过了 { stepStack.pop(); // 出栈当前点 if (!stepStack.empty()) nowPoint = stepStack.top(); // 更新当前点 } else { stepStack.push(stepPoint[rand() % stepPoint.size()]); // 入栈当前点 g_GameMap[(nowPoint.y + stepStack.top().y) / 2][(nowPoint.x + stepStack.top().x) / 2] = 0; // 打通墙壁 nowPoint = stepStack.top(); // 更新当前点点 g_GameMap[nowPoint.y][nowPoint.x] = 0xFFFF; // 标记当前 } stepPoint.clear(); // 清空周围点以便下一次循环 } // 清洗标记点 for (int i = 0; i < GAME_HEIGHT; i++) { for (int j = 0; j < GAME_WIDTH; j++) { if (g_GameMap[i][j] == 0xFFFF) g_GameMap[i][j] = 0; } } // 随机生成加油站的位置 for (int i = 0; i < FILLNUM; i++) { POINT fillPoint = { rand() % GAME_WIDTH,rand() % GAME_HEIGHT }; // 保证在空地生成加油站 while (g_GameMap[fillPoint.y][fillPoint.x] != GROUND) fillPoint = { rand() % GAME_WIDTH,rand() % GAME_HEIGHT }; // 标记油灯 g_GameMap[fillPoint.y][fillPoint.x] = FILLSTATE; } g_GameMap[GAME_HEIGHT - 2][GAME_WIDTH - 2] = ENDPOS; // 标记终点 g_EndPos = { GAME_WIDTH - 2,GAME_HEIGHT - 2 }; // 确定终点位置 g_ViewArray = MAXVIEW; // 初始视野是最大的 g_BeginTime = GetTickCount(); // 开始计时 g_LastFillTime = GetTickCount(); // 油灯加油的时间 rePaintMap(); // 绘制地图 g_PlayerPos = { g_BlockSize * 3 / 2,g_BlockSize * 3 / 2 }; // 初始化人的位置 computeCameraPos(); // 计算摄像机的位置 initgraph(WIN_WIDTH, WIN_HEIGHT); // 初始化画布 setbkmode(TRANSPARENT); // 设置背景为透明 BeginBatchDraw(); // 开始缓冲绘制 } void endGame() { EndBatchDraw(); // 结束缓冲绘制 } void draw() { // 清空设备 cleardevice(); // 绘制视野 drawView(); // 绘制人 drawPlayer(); // 绘制时间 TCHAR timeStr[256]; int loseTime = GetTickCount() - g_BeginTime; // 计算流失的时间 _stprintf_s(timeStr, _T("找碎片已用时:%02d:%02d"), loseTime / 1000 / 60, loseTime / 1000 % 60); settextcolor(RGB(140, 140, 140)); outtextxy((WIN_WIDTH - textwidth(timeStr)) / 2, 3, timeStr); FlushBatchDraw(); // 刷新屏幕 } bool upDate() { POINT nextPos = g_PlayerPos; // 下一个位置 // 计算下一个位置 if (GetKeyState(VK_UP) & 0x8000) nextPos.y -= 2; if (GetKeyState(VK_DOWN) & 0x8000) nextPos.y += 2; if (GetKeyState(VK_LEFT) & 0x8000) nextPos.x -= 2; if (GetKeyState(VK_RIGHT) & 0x8000) nextPos.x += 2; // 如果下一个位置不合法 if (!canMove(nextPos)) { if (canMove({ g_PlayerPos.x, nextPos.y })) // y 轴移动合法 nextPos = { g_PlayerPos.x, nextPos.y }; else if (canMove({ nextPos.x, g_PlayerPos.y })) // x 轴移动合法 nextPos = { nextPos.x, g_PlayerPos.y }; else // 都不合法 nextPos = g_PlayerPos; } // 如果是油灯则更新时间 if (g_GameMap[nextPos.y / g_BlockSize][nextPos.x / g_BlockSize] == FILLSTATE) g_LastFillTime = GetTickCount(); // 如果是终点则通关 else if (g_GameMap[nextPos.y / g_BlockSize][nextPos.x / g_BlockSize] == ENDPOS) { FlushBatchDraw(); return false; } g_PlayerPos = nextPos; // 更新位置 computeCameraPos(); // 计算摄像机的位置 // 根据时间缩减视野 static unsigned int lastTime = GetTickCount(); int loseTime = GetTickCount() - g_LastFillTime; // 计算流失的时间 g_ViewArray = MAXVIEW - loseTime / 1000.0 / DARKTIME; // 每一段时间油灯的照明力会下降一个图块 if (g_ViewArray < MINVIEW) g_ViewArray = MINVIEW; // 处理鼠标消息 MOUSEMSG mouseMsg; // 鼠标信息 int lastBlockSize = g_BlockSize; // 保存原本的大小 while (MouseHit()) { mouseMsg = GetMouseMsg(); if (mouseMsg.uMsg == WM_MOUSEWHEEL) // 滚轮消息 { g_BlockSize += mouseMsg.wheel / 120; } } // 如果没有滚轮消息就退出 if (lastBlockSize == g_BlockSize) return true; // 处理滚轮消息 if (g_BlockSize >= 10 && g_BlockSize <= 50) // 块大小没有达到极限值 { // 保证缩放后的地图不会比窗口小 if (GAME_WIDTH * g_BlockSize < WIN_WIDTH || GAME_HEIGHT * g_BlockSize < WIN_HEIGHT) g_BlockSize = lastBlockSize; rePaintMap(); // 重绘地图 // 重新计算玩家在地图上的位置 POINT mapPos = { g_PlayerPos.x / lastBlockSize,g_PlayerPos.y / lastBlockSize }; // 计算在地图上的位置 g_PlayerPos.x = mapPos.x * g_BlockSize + g_BlockSize / 2; // 计算映射后的位置 g_PlayerPos.y = mapPos.y * g_BlockSize + g_BlockSize / 2; // 计算映射后的位置 computeCameraPos(); // 重新计算摄像机位置 } // 保证图块不会过大和过小 if (g_BlockSize < 10) g_BlockSize = 10; if (g_BlockSize > 50) g_BlockSize = 50; return true; } void absDelay(int delay) { static int curtime = GetTickCount(); static int pretime = GetTickCount(); while (curtime - pretime < delay) { curtime = GetTickCount(); Sleep(1); } pretime = curtime; } bool canMove(POINT pos) { // 只要外接矩形的四个顶点不在墙壁内就必定合法 return g_GameMap[(pos.y - 3) / g_BlockSize][(pos.x - 3) / g_BlockSize] != WALL && g_GameMap[(pos.y + 3) / g_BlockSize][(pos.x + 3) / g_BlockSize] != WALL && g_GameMap[(pos.y - 3) / g_BlockSize][(pos.x + 3) / g_BlockSize] != WALL && g_GameMap[(pos.y + 3) / g_BlockSize][(pos.x - 3) / g_BlockSize] != WALL; } void computeCameraPos() { // 以人物位置为中心计算摄像机的理论位置 g_CameraPos.x = g_PlayerPos.x - WIN_WIDTH / 2; g_CameraPos.y = g_PlayerPos.y - WIN_HEIGHT / 2; // 防止摄像机越界 if (g_CameraPos.x < 0) g_CameraPos.x = 0; if (g_CameraPos.y < 0) g_CameraPos.y = 0; if (g_CameraPos.x > GAME_WIDTH * g_BlockSize - WIN_WIDTH) g_CameraPos.x = GAME_WIDTH * g_BlockSize - WIN_WIDTH; if (g_CameraPos.y > GAME_HEIGHT * g_BlockSize - WIN_HEIGHT) g_CameraPos.y = GAME_HEIGHT * g_BlockSize - WIN_HEIGHT; } void rePaintMap() { g_MapImage.Resize(GAME_WIDTH * g_BlockSize, GAME_HEIGHT * g_BlockSize); // 重置地图图片大小 SetWorkingImage(&g_MapImage); // 设置地图图片为当前工作图片 for (int i = 0; i < GAME_HEIGHT; i++) { for (int j = 0; j < GAME_WIDTH; j++) { switch (g_GameMap[i][j]) { case WALL: drawWall({ j * g_BlockSize,i * g_BlockSize }); // 绘制墙壁 break; case FILLSTATE: drawFillState({ j * g_BlockSize,i * g_BlockSize }); // 绘制加油站 break; case GROUND: drawGround({ j * g_BlockSize,i * g_BlockSize }); // 绘制地面 break; case ENDPOS: drawEndPos({ j * g_BlockSize,i * g_BlockSize }); break; } } } SetWorkingImage(); // 复位工作图片 } void drawWall(POINT pos) { setfillcolor(RGB(254, 109, 19)); solidrectangle(pos.x, pos.y, pos.x + g_BlockSize, pos.y + g_BlockSize); } void drawGround(POINT pos) { setfillcolor(RGB(255, 255, 255)); solidrectangle(pos.x, pos.y, pos.x + g_BlockSize, pos.y + g_BlockSize); } void drawFillState(POINT pos) { drawGround(pos); // 绘制圆角矩形 pos.x += g_BlockSize / 5; pos.y += g_BlockSize / 5; setfillcolor(RGB(252, 213, 11)); solidroundrect(pos.x, pos.y, pos.x + g_BlockSize / 5 * 3, pos.y + g_BlockSize / 5 * 3, g_BlockSize / 8, g_BlockSize / 8); } void drawEndPos(POINT pos) { drawGround(pos); // 绘制圆角矩形 pos.x += g_BlockSize / 5; pos.y += g_BlockSize / 5; setfillcolor(RGB(87, 116, 48)); solidroundrect(pos.x, pos.y, pos.x + g_BlockSize / 5 * 3, pos.y + g_BlockSize / 5 * 3, g_BlockSize / 8, g_BlockSize / 8); } void drawPlayer() { setfillcolor(RGB(252, 213, 11)); solidcircle(g_PlayerPos.x - g_CameraPos.x, g_PlayerPos.y - g_CameraPos.y, 3); } void drawView() { // 锁定视野 HRGN viewArr; int r = int(g_BlockSize * g_ViewArray + 0.5); // 计算视野半径 POINT orgin = g_PlayerPos; orgin.x -= g_CameraPos.x; // 计算在屏幕上的位置 orgin.y -= g_CameraPos.y; // 计算在屏幕上的位置 viewArr = CreateEllipticRgn(orgin.x - r, orgin.y - r, orgin.x + r, orgin.y + r); // 创建一个圆形的区域 setcliprgn(viewArr); // 锁定区域 // 绘制地图 putimage(0, 0, WIN_WIDTH, WIN_HEIGHT, &g_MapImage, g_CameraPos.x, g_CameraPos.y); // 删除区域 DeleteObject(viewArr); // 消除区域 setcliprgn(NULL); }
EasyX做一个猜数游戏
不难,简单,加上文章开头的头文件,还有需要的图片,注意路径要正确
代码:
void Guess() { wchar_t s1[50]; wchar_t s[20]; loadimage(&guess, L"picture\\guess.jpg"); putimage(0, 0, &guess); MOUSEMSG msg;//定义变量,保存鼠标消息 FlushMouseMsgBuffer();// 清空鼠标消息缓冲区,避免无效鼠标信息带入到正式判断中 while (true) // 主循环,循环监听鼠标信息 { while (MouseHit()) //监听鼠标信息;当有鼠标消息的时候执行,可检测连续的鼠标信息 { msg = GetMouseMsg();//获取鼠标消息 if (WM_LBUTTONDOWN == msg.uMsg)//判断鼠标信息;鼠标左键按下 { if (msg.x > 1000 && msg.x < 1200 && msg.y > 70 && msg.y < 130)//鼠标点击特定区域,即ENTER按钮所在区域 { money = money - 200; int m = rand() % 100; int n; _itow_s(m, s, 10, 10);//int 转换成 wchar_t for (n = 0; n < 7; n++) { InputBox(s1, 20, _T("请输入猜测的数字"), _T("Guess"), 0, 0, false); int x = _wtoi(s1);//wchar_t 转换成 int if (x == m) { MessageBox(NULL, _T("恭喜您猜测正确,金币数加500"), _T("Guess"), MB_OKCANCEL | MB_SETFOREGROUND); money = money + 700; break; } else { if (x > m) MessageBox(NULL, _T("数字猜测大了"), _T("Guess"), MB_OKCANCEL | MB_SETFOREGROUND); else MessageBox(NULL, _T("数字猜测小了"), _T("Guess"), MB_OKCANCEL | MB_SETFOREGROUND); } } if (n == 7) MessageBox(NULL, _T("不好意思,您5次都没猜对,金币数扣200"), _T("Guess"), MB_OKCANCEL | MB_SETFOREGROUND); } if (msg.x > 1010 && msg.x < 1200 && msg.y > 460 && msg.y < 525)//鼠标点击特定区域,即ENTER按钮所在区域 { Adult_background1(); } } } } }
#include<graphics.h> // 引用图形库头文件 #include<stdio.h> #include<stdlib.h> #include<conio.h> //InputBox,MessageBox #include<time.h> //随机种子 #include<mmsystem.h> //bgm #include<windows.h> //bgm #include "maze.h" //迷宫 #pragma comment(lib,"winmm.lib") //bgm /*全局变量*/ # define IMA_HEIGHT 699 //拼图图片的长 # define IMA_WIDTH 699//拼图图片的宽 # define SIZE 233 //拼图图片大小 # define ROW (IMA_HEIGHT/SIZE) # define COL (IMA_WIDTH/SIZE) int num = 0;//记录碎片个数,初始化为0 int money = 1000;//记录金币个数,初始化为1000 int sum = 2;//赌场商店最多可以买的碎片个数 int x1 = 1;//每个猜数游戏只能获得一次碎片 int x2 = 1;//每个猜数游戏只能获得一次碎片 int x3 = 1;//每个猜数游戏只能获得一次碎片 int m = 1;//迷宫只能获得一次碎片 int y = 0;//拼图判断 /*定义图片*/ IMAGE start;//开始 IMAGE start_button; IMAGE background1;//背景1 IMAGE background2;//背景2 IMAGE background3;//背景3 IMAGE background4;//背景4 IMAGE background5;//背景5 IMAGE background6;//背景6 IMAGE time1;//时空选择 IMAGE childbackground;//童年背景 IMAGE youthbackground;//青春背景 IMAGE adultbackground;//成年背景 IMAGE adultbackground1;//商店与猜数 IMAGE shop; IMAGE guess; IMAGE get; IMAGE jigsawGame; IMAGE image; IMAGE image1; IMAGE img[ROW * COL]; IMAGE game1; IMAGE game2; IMAGE game3; IMAGE end1; IMAGE end1_1; IMAGE end1_2; IMAGE end2; IMAGE end2_1; IMAGE end2_2; IMAGE end3; int arr[ROW][COL]; bool State = false; void Welcome();//开始界面 void Get();//获得碎片成功的界面 void Background_1();//介绍背景 void Background_2(); void Background_3(); void Background_4(); void Background_5(); void Background_6(); void Time();//时空选择 void Childhood_background();//童年时期背景 void Youth_background();//青春期背景 void Adult_background();//成年时期背景 void Adult_background1();//商店与猜数游戏 void Shop();//商店函数 void Guess();//猜数游戏 void JigsawGame();//拼图游戏 void GameInit();//初始化游戏 void DrawMap();//画地图 void GamePlay();//玩游戏:1、鼠标点击图片2、点击与空白相邻的图片时,会和空白图片交换; void MixImg(); //打乱图片顺序; void GameDone();//完成游戏 void Game1();//文字猜谜游戏1; void Game2();//文字猜谜游戏2; void Game3();//文字猜谜游戏3; void End();//结局
文字解谜游戏:梦境寻踪
提取码:yfc6
说明:图片都是用ps自己制作的,切不可更改图片命名,否则会导致程序无法运行,因为图片命名和代码要保持一致。
1、创建项目:新建-项目-空项目-右键“源文件”-添加-新建项-C++文件
2、编码字符集:unicode字符集
3.将图片资源直接导入到所命名的文件夹中,注意不要将图片打包文件夹后再放入,要直接将图片导入对应文件夹。
4.程序中要多次用到图形库的函数,建议刚接触的初学者查看EasyX安装时附带的官方帮助文档,也可以参考我分享的源代码。但是考虑到帮助文档内容较少,对函数的用法介绍较少,下面分享一个关于EasyX图形库详细函数用法介绍的文档。
EasyX文档
提取码:yfc6
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。