函数名:kbhit():检查当前是否有键…

本文详细介绍了kbhit()和getch()函数的功能及使用方法。kbhit()用于检查是否有键盘输入,若检测到输入则返回非0值,反之返回0。getch()则等待用户按键并返回按键值。此外还对比了Tc2.0中的bioskey()函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数名:kbhit()(VC++6.0下为_kbhit())
功 能及返回值: 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
用 法:int kbhit(void);
包含头文件: include

 


C语言
#include
int main(void)
{
cprintf("Press any key to continue:");
while (!kbhit()) ;
cprintf("\r\nA key was pressed...\r\n");
return 0;
}
下面的代码,如果没有键盘输入程序一直输出Hello World,直到用户按Esc结束
#include
#include
int main( void )
{
char ch;
while( !kbhit() )
{
cprintf("Hello World\n");
if( kbhit() )
{
ch = getch();
if( 27 == ch )
break;
}
}
cprintf("End!\n");
system("pause");
return 0;
}
C++语言
#include
#include
using namespace std;
int main()
{
while(!kbhit()) //当没有键按下
{
cout<<"无键按下"<<endl;
}
cout<<"有键按下"<<endl; //有键按下时输出这
system("pause");
}
kbhit() 在执行时,检测是否有按键按下,有按下返回非0值,一般是1
没有按下返回0;是非阻塞函数
getch() 在执行时,检测按下什么键,如果不按键该函数不返回;是阻塞函数

 


类似地
在Tc2.0中有一个处理键盘输入的函数bioskey();
int bioskey(int cmd);
当cmd为1时,bioskey()检测是否有键按下。没有键按下时返回0;有键按下时返回按键码(
任何按键码都不为0),但此时并不将检测到的按键码从键盘缓冲队列中清除。 是非阻塞参数。
当cmd为0时,bioskey()返回键盘缓冲队列中的按键码,并将此按键码从键盘缓冲队列中清
除。如果键盘缓冲队列为空,则一直等到有键按下,才将得到的按键码返回。是阻塞调用。
//个人理解kbhit()有点像bioskey(1)

01-13 2757
代码有bug,检查修改重新生成 #include <graphics.h> // EasyX图形库 #include <conio.h> // 控制台输入输出 #include <string> // 字符串处理 #include <ctime> // 时间函数 #include <cmath> // 数学函数 #include <mmsystem.h> // 多媒体支持 #include <list> // 链表容器 #include <Windows.h> // Windows API #pragma comment(lib, "winmm.lib") // 多媒体库链接 using namespace std; // 游戏常量定义 const int PASS_COUNT = 8; // 总关卡数 const int WINDOW_WIDTH = 953; // 窗口宽度 const int WINDOW_HEIGHT = 453; // 窗口高度 const int PUZZLE_WIDTH = 600; // 拼图区域宽度 const int PUZZLE_HEIGHT = 450; // 拼图区域高度 const COLORREF BG_COLOR = LIGHTGREEN; // 背景颜色 // 拼图块结构体 struct PuzzlePiece { IMAGE image; // 图像对象 int gridX; // 网格X坐标 int gridY; // 网格Y坐标 int correctX; // 正确位置X坐标 int correctY; // 正确位置Y坐标 }; // 游戏框架类 class GameFramework { public: GameFramework(); // 构造函数 void DrawBackground(); // 绘制背景 void ShowStartMenu(); // 显示开始菜单 }; // 拼图游戏类 class PuzzleGame { private: IMAGE fullImage; // 完整图像 list<PuzzlePiece> puzzlePieces; // 拼图块链表 int gameState; // 游戏状态 (0:选择难度, 1:设置拼图, 2:显示拼图, 3:游戏进行中) int difficulty; // 难度级别 (3:3x3, 4:4x4, 5:5x5) int currentLevel; // 当前关卡 (0-7) int pieceWidth; // 拼图块宽度 int pieceHeight; // 拼图块高度 string imagePath; // 图片路径 int emptyX, emptyY; // 空白块位置 // 难度选择区域 RECT rectEasy = { 300, 210, 500, 240 }; RECT rectMedium = { 300, 270, 500, 300 }; RECT rectHard = { 300, 330, 500, 360 }; // 查找特定位置的拼图块 list<PuzzlePiece>::iterator FindPieceAtPosition(int x, int y) { for (auto it = puzzlePieces.begin(); it != puzzlePieces.end(); ++it) { if (it->gridX == x && it->gridY == y) { return it; } } return puzzlePieces.end(); // 未找到 } public: PuzzleGame(); // 构造函数 void Run(); // 游戏主循环 void SetDifficulty(); // 设置难度 void SetupPuzzle(); // 设置拼图 void DrawPuzzle(); // 绘制拼图 void HandleMouse(); // 处理鼠标事件 void MovePiece(int gridX, int gridY); // 移动拼图块 void CheckCompletion(); // 检查是否完成 void ShufflePuzzle(); // 打乱拼图 }; // 游戏框架构造函数 GameFramework::GameFramework() { initgraph(WINDOW_WIDTH, WINDOW_HEIGHT); // 初始化图形窗口 setbkcolor(BG_COLOR); // 设置背景颜色 cleardevice(); // 清屏 } // 绘制背景 void GameFramework::DrawBackground() { // 加载背景图片 IMAGE bgImg; loadimage(&bgImg, _T("Res\\123.jpg"), WINDOW_WIDTH, WINDOW_HEIGHT); putimage(0, 0, &bgImg); } // 显示开始菜单 void GameFramework::ShowStartMenu() { setbkmode(TRANSPARENT); // 设置透明背景 settextcolor(BLUE); // 设置文本颜色 // 显示游戏标题 settextstyle(30, 0, _T("华文行楷")); outtextxy(230, 85, _T("欢迎来到拼图游戏")); // 显示难度选择提示 settextstyle(23, 0, _T("华文行楷")); outtextxy(300, 170, _T("选择游戏难度:")); outtextxy(300, 210, _T("<A> 简单 (3x3)")); outtextxy(300, 270, _T("<B> 中等 (4x4)")); outtextxy(300, 330, _T("<C> 困难 (5x5)")); // 绘制菜单边框 setlinestyle(PS_SOLID, 5, NULL); setlinecolor(BLUE); rectangle(200, 50, 600, 400); line(200, 150, 600, 150); } // 拼图游戏构造函数 PuzzleGame::PuzzleGame() { gameState = 0; // 初始状态:选择难度 difficulty = 0; // 未选择难度 currentLevel = 0; // 初始关卡 imagePath = "Res\\00.jpg"; // 初始图片路径 pieceWidth = 0; // 初始拼图块宽度 pieceHeight = 0; // 初始拼图块高度 emptyX = 0; // 空白块X位置 emptyY = 0; // 空白块Y位置 } // 游戏主循环 void PuzzleGame::Run() { switch (gameState) { case 0: // 选择难度 SetDifficulty(); break; case 1: // 设置拼图 SetupPuzzle(); break; case 2: // 显示拼图 DrawPuzzle(); break; case 3: // 游戏进行中 HandleMouse(); CheckCompletion(); break; default: break; } } // 设置游戏难度 void PuzzleGame::SetDifficulty() { // 检测盘输入 if (_kbhit()) { char input = _getch(); // 获取按 mciSendString(_T("play Res\\key.wav"), NULL, 0, NULL); // 播放按音效 switch (input) { case 'a': case 'A': difficulty = 3; break; // 简单难度 case 'b': case 'B': difficulty = 4; break; // 中等难度 case 'c': case 'C': difficulty = 5; break; // 困难难度 default: return; // 无效输入 } gameState = 1; // 进入设置拼图状态 return; } // 检测鼠标点击 if (MouseHit()) { MOUSEMSG mouseMsg = GetMouseMsg(); if (mouseMsg.uMsg == WM_LBUTTONDOWN) { POINT pt = { mouseMsg.x, mouseMsg.y }; // 检查是否点击在难度选择区域 if (PtInRect(&rectEasy, pt)) { difficulty = 3; mciSendString(_T("play Res\\key.wav"), NULL, 0, NULL); gameState = 1; } else if (PtInRect(&rectMedium, pt)) { difficulty = 4; mciSendString(_T("play Res\\key.wav"), NULL, 0, NULL); gameState = 极 } else if (PtInRect(&rectHard, pt)) { difficulty = 5; mciSendString(_T("play Res\\key.wav"), NULL, 0, NULL); gameState = 1; } } } } // 设置拼图 void PuzzleGame::SetupPuzzle() { // 清空链表 puzzlePieces.clear(); // 加载完整图像 TCHAR imgPath[256]; _stprintf_s(imgPath, _T("%S"), imagePath.c_str()); loadimage(&fullImage, imgPath, PUZZLE_WIDTH, PUZZLE_HEIGHT); // 计算拼图块尺寸 pieceWidth = PUZZLE_WIDTH / difficulty; pieceHeight = PUZZLE_HEIGHT / difficulty; // 设置工作图像为完整图像 SetWorkingImage(&fullImage); // 分割图像为拼图块并添加到链表 for (int i = 0; i < difficulty; i++) { for (int j = 0; j < difficulty; j++) { // 跳过右下角最后一块(空白块) if (i == difficulty - 1 && j == difficulty - 1) { continue; } PuzzlePiece piece; // 获取拼图块图像 getimage(&piece.image, j * pieceWidth, i * pieceHeight, pieceWidth, pieceHeight); // 设置初始位置和正确位置 piece.gridX = j; piece.gridY = i; piece.correctX = j; piece.correctY = i; puzzlePieces.push_back(piece); } } // 设置空白块位置 emptyX = difficulty - 1; emptyY = difficulty - 1; // 恢复默认工作图像 SetWorkingImage(); // 打乱拼图 ShufflePuzzle(); gameState = 2; // 进入显示拼图状态 } // 绘制拼图 void PuzzleGame::DrawPuzzle() { // 清空拼图区域 setfillcolor(BG_COLOR); solidrectangle(0, 0, PUZZLE_WIDTH, PUZZLE_HEIGHT); // 绘制所有拼图块 for (const auto& piece : puzzlePieces) { putimage(piece.gridX * pieceWidth, piece.gridY * pieceHeight, &piece.image); } // 绘制完整图像预览 IMAGE preview; TCHAR imgPath[256]; _stprintf_s(imgPath, _T("%S"), imagePath.c_str()); loadimage(&preview, imgPath, 300, 225); setbkmode(TRANSPARENT); settextstyle(23, 0, _T("华文行楷")); settextcolor(BLUE); outtextxy(740, 70, _极("完整图像")); putimage(630, 100, &preview); // 显示当前关卡信息 TCHAR levelInfo[256]; _stprintf_s(levelInfo, _T("第 %d / %d 关"), currentLevel + 1, PASS_COUNT); outtextxy(730, 400, levelInfo); // 显示游戏状态 outtextxy(700, 350, _T("当前状态: 游戏中")); gameState = 3; // 进入游戏进行中状态 } // 处理鼠标事件 void PuzzleGame::HandleMouse() { if (MouseHit()) { // 检测鼠标事件 MOUSEMSG mouseMsg = GetMouseMsg(); // 获取鼠标消息 if (mouseMsg.uMsg == WM_LBUTTONDOWN) { // 左点击 mciSendString(_T("play Res\\key.wav"), NULL, 0, NULL); // 播放按音效 // 计算点击的网格坐标 int gridX = mouseMsg.x / pieceWidth; int gridY = mouseMsg.y / pieceHeight; // 检查点击位置是否有效 if (gridX < 0 || gridX >= difficulty || gridY < 0 || gridY >= difficulty) { return; } // 检查是否可以移动(与空白块相邻) bool canMove = false; if (gridX == emptyX) { if (abs(gridY - emptyY) == 1) canMove = true; } else if (gridY == emptyY) { if (abs(gridX - emptyX) == 1) canMove = true; } if (canMove) { MovePiece(gridX, gridY); // 移动拼图块 } } } } // 移动拼图块 void PuzzleGame::MovePiece(int gridX, int gridY) { // 查找点击位置的拼图块 auto it = FindPieceAtPosition(gridX, gridY); if (it == puzzlePieces.end()) { return; // 未找到拼图块 } // 更新拼图块位置 int oldX = it->gridX; int oldY = it->gridY; it->gridX = emptyX; it->gridY = emptyY; // 更新空白块位置 emptyX = oldX; emptyY = oldY; // 重绘拼图 DrawPuzzle(); } // 检查是否完成拼图 void PuzzleGame::CheckCompletion() { bool completed = true; // 检查所有拼图块是否在正确位置 for (const auto& piece : puzzlePieces) { if (piece.gridX != piece.correctX || piece.gridY != piece.correctY) { completed = false; break; } } // 检查空白块位置 if (emptyX != difficulty - 1 || emptyY != difficulty - 1) { completed = false; } // 如果完成当前关卡 if (completed) { // 显示完整图像 putimage(0, 0, &fullImage); // 显示完成信息 settextstyle(30, 0, _T("华文行楷")); settextcolor(GREEN); outtextxy(700, 350, _T("恭喜过关!")); FlushBatchDraw(); // 刷新屏幕 // 播放胜利音效 mciSendString(_T("play Res\\胜利.mp3"), NULL, 0, NULL); Sleep(3000); // 暂停3秒 // 进入下一关 currentLevel++; if (currentLevel < PASS_COUNT) { // 更新图片路径 char levelDigit1 = '0' + (currentLevel / 10); char levelDigit2 = '0' + (currentLevel % 10); imagePath[4] = levelDigit1; imagePath[5] = levelDigit2; // 重置游戏状态 gameState = 1; } else { // 所有关卡完成 cleardevice(); settextstyle(50, 0, _T("华文行楷")); outtextxy(220, 200, _T("恭喜你完成所有关卡!")); outtextxy(300, 300, _T("游戏结束")); FlushBatchDraw(); Sleep(5000); gameState = 4; // 游戏结束状态 } } } // 打乱拼图 void PuzzleGame::ShufflePuzzle() { // 方向数组 (上, 左, 下, 右) const int dx[4] = { 0, -1, 0, 1 }; const int dy[4] = { -1, 0, 1, 0 }; srand(static_cast<unsigned int>(time(NULL))); // 随机种子 // 第一阶段:螺旋移动 int steps = difficulty * 2; // 移动步数 int direction = 0; // 初始方向 for (int i = 0; i < steps; i++) { int newX = emptyX + dx[direction]; int newY = emptyY + dy[direction]; // 检查新位置是否有效 if (newX >= 0 && newX < difficulty && newY >= 0 && newY < difficulty) { // 查找该位置的拼图块 auto it = FindPieceAtPosition(newX, newY); if (it != puzzlePieces.end()) { // 交换拼图块和空白块位置 int tempX = it->gridX; int tempY = it->gridY; it->gridX = emptyX; it->gridY = emptyY; emptyX = tempX; emptyY = tempY; } } // 改变方向 direction = (direction + 1) % 4; } // 第二阶段:随机移动 int shuffleCount = difficulty * 30; // 随机移动次数 for (int i = 0; i < shuffleCount; i++) { int dir = rand() % 4; // 随机方向 int newX = emptyX + dx[dir]; int newY = emptyY + dy[dir]; // 检查新位置是否有效 if (newX >= 0 && newX < difficulty && newY >= 0 && newY < difficulty) { // 查找该位置的拼图块 auto it = FindPieceAtPosition(newX, newY); if (it != puzzlePieces.end()) { // 交换拼图块和空白块位置 int temp极 = it->gridX; int tempY = it->gridY; it->gridX = emptyX; it->gridY = emptyY; emptyX = tempX; emptyY = tempY; } } } } // 主函数 int main() { // 初始化游戏框架 GameFramework gameFramework; gameFramework.DrawBackground(); gameFramework.ShowStartMenu(); // 初始化拼图游戏 PuzzleGame puzzleGame; // 开启批量绘制 BeginBatchDraw(); // 游戏主循环 while (true) { puzzleGame.Run(); // 运行游戏逻辑 // 检测ESC退出 if (_kbhit() && _getch() == 27) { break; } FlushBatchDraw(); // 刷新屏幕 Sleep(10); // 降低CPU占用 } // 结束批量绘制 EndBatchDraw(); // 关闭图形窗口 closegraph(); return 0; }
07-21
代码有bug,检查代码并生成完整代码 #include <graphics.h> // EasyX图形库 #include <conio.h> // 控制台输入输出 #include <string> // 字符串处理 #include <ctime> // 时间函数 #include <cmath> // 数学函数 #include <mmsystem.h> // 多媒体支持 #include <list> // 链表容器 #include <Windows.h> // Windows API #pragma comment(lib, "winmm.lib") // 多媒体库链接 using namespace std; // 游戏常量定义 const int PASS_COUNT = 8; // 总关卡数 const int WINDOW_WIDTH = 953; // 窗口宽度 const int WINDOW_HEIGHT = 453; // 窗口高度 const int PUZZLE_WIDTH = 600; // 拼图区域宽度 const int PUZZLE_HEIGHT = 450; // 拼图区域高度 const COLORREF BG_COLOR = LIGHTGREEN; // 背景颜色 // 拼图块结构体 struct PuzzlePiece { IMAGE image; // 图像对象 int gridX; // 网格X坐标 int gridY; // 网格Y坐标 int correctX; // 正确位置X坐标 int correctY; // 正确位置Y坐标 }; // 游戏框架类 class GameFramework { public: GameFramework(); // 构造函数 void DrawBackground(); // 绘制背景 void ShowStartMenu(); // 显示开始菜单 }; // 拼图游戏类 class PuzzleGame { private: IMAGE fullImage; // 完整图像 list<PuzzlePiece> puzzlePieces; // 拼图块链表 int gameState; // 游戏状态 (0:选择难度, 1:设置拼图, 2:显示拼图, 3:游戏进行中) int difficulty; // 难度级别 (3:3x3, 4:4x4, 5:5x5) int currentLevel; // 当前关卡 (0-7) int pieceWidth; // 拼图块宽度 极 pieceHeight; // 拼图块高度 string imagePath; // 图片路径 int emptyX, emptyY; // 空白块位置 // 难度选择区域 RECT rectEasy = { 300, 210, 500, 240 }; RECT rectMedium = { 300, 270, 500, 300 }; RECT rectHard = { 300, 330, 500, 360 }; // 查找特定位置的拼图块 list<PuzzlePiece>::iterator FindPieceAtPosition(int x, int y) { for (auto it = puzzlePieces.begin(); it != puzzlePieces.end(); ++it) { if (it->gridX == x && it->gridY == y) { return it; } } return puzzlePieces.end(); // 未找到 } public: PuzzleGame(); // 构造函数 void Run(); // 游戏主循环 void SetDifficulty(); // 设置难度 void SetupPuzzle(); // 设置拼图 void DrawPuzzle(); // 绘制拼图 void HandleMouse(); // 处理鼠标事件 void MovePiece(int gridX, int gridY); // 移动拼图块 void CheckCompletion(); // 检查是否完成 void ShufflePuzzle(); // 打乱拼图 }; // 游戏框架构造函数 GameFramework::GameFramework() { initgraph(WINDOW_WIDTH, WINDOW_HEIGHT); // 初始化图形窗口 setbkcolor(BG_COLOR); // 设置背景颜色 cleardevice(); // 清屏 } // 绘制背景 void GameFramework::DrawBackground() { // 加载背景图片 IMAGE bgImg; // 修复1: 确保正确加载背景图片 if (loadimage(&bgImg, _T("Res\\123.jpg"), WINDOW_WIDTH, WINDOW_HEIGHT) == 0) { // 如果加载失败,使用纯色背景 setbkcolor(LIGHTGREEN); cleardevice(); } else { putimage(0, 0, &bgImg); } } // 显示开始菜单 void GameFramework::ShowStartMenu() { setbkmode(TRANSPARENT); // 设置透明背景 settextcolor(BLUE); // 设置文本颜色 // 显示游戏标题 settextstyle(30, 0, _T("华文行楷")); outtextxy(230, 85, _T("欢迎来到拼图游戏")); // 显示难度选择提示 settextstyle(23, 0, _T("华文行楷")); outtextxy(300, 170, _T("选择游戏难度:")); outtextxy(300, 210, _T("<A> 简单 (3x3)")); outtextxy(300, 270, _T("<B> 中等 (4x4)")); outtextxy(300, 330, _T("<C> 困难 (5x5)")); // 绘制菜单边框 setlinestyle(PS_SOLID, 5, NULL); setlinecolor(BLUE); rectangle(200, 50, 600, 400); line(200, 150, 600, 150); } // 拼图游戏构造函数 PuzzleGame::PuzzleGame() { gameState = 0; // 初始状态:选择难度 difficulty = 0; // 未选择难度 currentLevel = 0; // 初始关卡 imagePath = "Res\\00.jpg"; // 初始图片路径 pieceWidth = 0; // 初始拼图块宽度 pieceHeight = 0; // 初始拼图块高度 emptyX = 0; // 空白块X位置 emptyY = 0; // 空白块Y位置 } // 游戏主循环 void PuzzleGame::Run() { switch (game极State) { case 0: // 选择难度 SetDifficulty(); break; case 1: // 设置拼图 SetupPuzzle(); break; case 2: // 显示拼图 DrawPuzzle(); break; case 3: // 游戏进行中 HandleMouse(); CheckCompletion(); break; default: break; } } // 设置游戏难度 void PuzzleGame::SetDifficulty() { // 检测盘输入 if (_kbhit()) { char input = _getch(); // 获取按 mciSendString(_T("play Res\\key.wav"), NULL, 0, NULL); // 播放按音效 switch (input) { case 'a': case 'A': difficulty = 3; break; // 简单难度 case 'b': case 'B': difficulty = 4; break; // 中等难度 case 'c': case 'C': difficulty = 5; break; // 困难难度 default: return; // 无效输入 } gameState = 1; // 进入设置拼图状态 return; } // 检测鼠标点击 if (MouseHit()) { MOUSEMSG mouseMsg = GetMouseMsg(); if (mouseMsg.uMsg == WM_LBUTTONDOWN) { POINT pt = { mouseMsg.x, mouseMsg.y }; // 检查是否点击在难度选择区域 if (PtInRect(&rectEasy, pt)) { difficulty = 3; mciSendString(_T("play Res\\key.wav"), NULL, 0, NULL); gameState = 1; } else if (PtInRect(&rectMedium, pt)) { difficulty = 4; mciSendString(_T("play Res\\key.wav"), NULL, 0, NULL); gameState = 1; } else if (PtInRect(&rectHard, pt)) { difficulty = 5; mciSendString(_T("play Res\\key.wav"), NULL, 0, NULL); gameState = 1; } } } } // 设置拼图 void PuzzleGame::SetupPuzzle() { // 清空链表 puzzlePieces.clear(); // 加载完整图像 - 修复2: 使用正确的路径转换 TCHAR imgPath[MAX_PATH]; // 将std::string转换为宽字符串 MultiByteToWideChar(CP_ACP, 0, imagePath.c_str(), -1, imgPath, MAX_PATH); // 尝试加载图像 if (loadimage(&fullImage, imgPath, PUZZLE_WIDTH, PUZZLE_HEIGHT) == 0) { // 如果加载失败,创建默认图像 fullImage.Resize(PUZZLE_WIDTH, PUZZLE_HEIGHT); SetWorkingImage(&fullImage); setfillcolor(WHITE); solidrectangle(0, 0, PUZZLE_WIDTH, PUZZLE_HEIGHT); settextcolor(BLACK); settextstyle(30, 0, _T("宋体")); outtextxy(150, 200, _T("图片加载失败")); SetWorkingImage(); } // 计算拼图块尺寸 pieceWidth = PUZZLE_WIDTH / difficulty; pieceHeight = PUZZLE_HEIGHT / difficulty; // 设置工作图像为完整图像 SetWorkingImage(&fullImage); // 分割图像为拼图块并添加到链表 for (int i = 0; i < difficulty; i++) { for (int j = 0; j < difficulty; j++) { // 跳过右下角最后一块(空白块) if (i == difficulty - 1 && j == difficulty - 1) { continue; } PuzzlePiece piece; // 获取拼图块图像 getimage(&piece.image, j * pieceWidth, i * pieceHeight, pieceWidth, pieceHeight); // 设置初始位置和正确位置 piece.gridX = j; piece.gridY = i; piece.correctX = j; piece.correctY = i; puzzlePieces.push_back(piece); } } // 设置空白块位置 emptyX = difficulty - 1; emptyY = difficulty - 1; // 恢复默认工作图像 SetWorkingImage(); // 打乱拼图 ShufflePuzzle(); gameState = 2; // 进入显示拼图状态 } // 绘制拼图 void PuzzleGame::DrawPuzzle() { // 清空拼图区域 setfillcolor(BG_COLOR); solidrectangle(0, 0, PUZZLE_WIDTH, PUZZLE_HEIGHT); // 绘制所有拼图块 for (const auto& piece : puzzlePieces) { putimage(piece.gridX * pieceWidth, piece.gridY * pieceHeight, &piece.image); } // 绘制完整图像预览 IMAGE preview; TCHAR imgPath[MAX_PATH]; // 将std::string转换为宽字符串 MultiByteToWideChar(CP_ACP, 0, imagePath.c_str(), -1, imgPath, MAX_PATH); // 尝试加载预览图 if (loadimage(&preview, imgPath, 300, 225) == 0) { // 如果加载失败,创建默认预览图 preview.Resize(300, 225); SetWorkingImage(&preview); setfillcolor(WHITE); solidrectangle(0, 0, 300, 225); settextcolor(BLACK); settextstyle(20, 0, _T("宋体")); outtextxy(50, 100, _T("预览图加载失败")); SetWorkingImage(); } setbkmode(TRANSPARENT); settextstyle(23, 0, _T("华文行楷")); settextcolor(BLUE); outtextxy(740, 70, _T("完整图像")); putimage(630, 100, &preview); // 显示当前关卡信息 TCHAR levelInfo[256]; _stprintf_s(levelInfo, _T("第 %d / %d 关"), currentLevel + 1, PASS_COUNT); outtextxy(730, 400, levelInfo); // 显示游戏状态 outtextxy(700, 350, _T("当前状态: 游戏中")); gameState = 3; // 进入游戏进行中状态 } // 处理鼠标事件 void PuzzleGame::HandleMouse() { if (MouseHit()) { // 检测鼠标事件 MOUSEMSG mouseMsg = GetMouseMsg(); // 获取鼠标消息 if (mouseMsg.uMsg == WM_LBUTTONDOWN) { // 左点击 mciSendString(_T("play Res\\key.wav"), NULL, 0, NULL); // 播放按音效 // 计算点击的网格坐标 int gridX = mouseMsg.x / pieceWidth; int gridY = mouseMsg.y / pieceHeight; // 检查点击位置是否有效 if (gridX < 0 || gridX >= difficulty || gridY < 0 || gridY >= difficulty) { return; } // 检查是否可以移动(与空白块相邻) bool canMove = false; if (gridX == emptyX) { if (abs(gridY - emptyY) == 1) canMove = true; } else if (gridY == emptyY) { if (abs(gridX - emptyX) == 1) canMove = true; } if (canMove) { MovePiece(gridX, gridY); // 移动拼图块 } } } } // 移动拼图块 void PuzzleGame::MovePiece(int gridX, int gridY) { // 查找点击位置的拼图块 auto it = FindPieceAtPosition(gridX, gridY); if (it == puzzlePieces.end()) { return; // 未找到拼图块 } // 更新拼图块位置 int oldX = it->gridX; int oldY = it->gridY; it->gridX = emptyX; it->gridY = emptyY; // 更新空白块位置 emptyX = oldX; emptyY = oldY; // 重绘拼图 DrawPuzzle(); } // 检查是否完成拼图 void PuzzleGame::CheckCompletion() { bool completed = true; // 检查所有拼图块是否在正确位置 for (const auto& piece : puzzlePieces) { if (piece.gridX != piece.correctX || piece.gridY != piece.correctY) { completed = false; break; } } // 检查空白块位置 if (emptyX != difficulty - 1 || emptyY != difficulty - 1) { completed = false; } // 如果完成当前关卡 if (completed) { // 显示完整图像 putimage(0, 0, &fullImage); // 显示完成信息 settextstyle(30, 0, _T("华文行楷")); settextcolor(GREEN); outtextxy(700, 350, _T("恭喜过关!")); FlushBatchDraw(); // 刷新屏幕 // 播放胜利音效 mciSendString(_T("play Res\\胜利.mp3"), NULL, 0, NULL); Sleep(3000); // 暂停3秒 // 进入下一关 currentLevel++; if (currentLevel < PASS_COUNT) { // 更新图片路径 - 修复3: 确保正确的文件命名 char levelStr[3]; sprintf_s(levelStr, "%02d", currentLevel); // 确保两位数格式 imagePath = "Res\\" + string(levelStr) + ".jpg"; // 重置游戏状态 gameState = 1; } else { // 所有关卡完成 cleardevice(); settextstyle(50, 0, _T("华文行楷")); outtextxy(220, 200, _T("恭喜你完成所有关卡!")); outtextxy(300, 300, _T("游戏结束")); FlushBatchDraw(); Sleep(5000); gameState = 4; // 游戏结束状态 } } } // 打乱拼图 void PuzzleGame::ShufflePuzzle() { // 方向数组 (上, 左, 下, 右) const int dx[4] = { 0, -1, 0, 1 }; const int dy[4] = { -1, 0, 1, 0 }; srand(static_cast<unsigned int>(time(NULL))); // 随机种子 // 第一阶段:螺旋移动 int steps = difficulty * 2; // 移动步数 int direction = 0; // 初始方向 for (int i = 0; i < steps; i++) { int newX = emptyX + dx[direction]; int newY = emptyY + dy[direction]; // 检查新位置是否有效 if (newX >= 0 && newX < difficulty && newY >= 0 && newY < difficulty) { // 查找该位置的拼图块 auto it = FindPieceAtPosition(newX, newY); if (it != puzzlePieces.end()) { // 交换拼图块和空白块位置 int tempX = it->gridX; int tempY = it->gridY; it->gridX = emptyX; it->gridY = emptyY; emptyX = tempX; emptyY = tempY; } } // 改变方向 direction = (direction + 1) % 4; } // 第二阶段:随机移动 int shuffleCount = difficulty * 30; // 随机移动次数 for (int i = 0; i < shuffleCount; i++) { int dir = rand() % 4; // 随机方向 int newX = emptyX + dx[dir]; int newY = emptyY + dy[dir]; // 检查新位置是否有效 if (newX >= 0 && newX < difficulty && newY >= 0 && newY < difficulty) { // 查找该位置的拼图块 auto it = FindPieceAtPosition(newX, newY); if (it != puzzlePieces.end()) { // 交换拼图块和空白块位置 int tempX = it->gridX; int tempY = it->gridY; it->gridX = emptyX; it->gridY = emptyY; emptyX = tempX; emptyY = tempY; } } } } // 主函数 int main() { // 初始化游戏框架 GameFramework gameFramework; gameFramework.DrawBackground(); gameFramework.ShowStartMenu(); // 初始化拼图游戏 PuzzleGame puzzleGame; // 开启批量绘制 BeginBatchDraw(); // 游戏主循环 while (true) { puzzleGame.Run(); // 运行游戏逻辑 // 检测ESC退出 if (_kbhit() && _getch() == 27) { break; } FlushBatchDraw(); // 刷新屏幕 Sleep(10); // 降低CPU占用 } // 结束批量绘制 EndBatchDraw(); // 关闭图形窗口 closegraph(); return 0; }
最新发布
07-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值