鱼C论坛

 找回密码
 立即注册
查看: 1016|回复: 4

[已解决]easyx小程序如何debug

[复制链接]
发表于 2021-12-22 12:06:04 | 显示全部楼层 |阅读模式
20鱼币
问题描述:
本人小白,刚开始写程序的时候都是一些简单的问题,debug时可以看到每一步进行完之后的各个变量的值的情况及变化(如图,之前的debug);但是刚开始使用easyx以后发现程序可以运行,但是debug的时候看不到各个变量的情况(如图,debug区中什么都没有,没有变量的变化情况)。请问这种情况下(easyx程序)如果出现错误怎么能知道是哪里错了?
最佳答案
2021-12-22 12:06:05
Buryool 发表于 2021-12-22 12:08
需要看代码的话可以看一下2楼~

vs的那个自动窗口只显示和当前要执行的语句有关的变量
试试这个代码,在第244行下断点,看看是不是在自动窗口中显示map、a、b、flag
要查看和当前要执行的语句没有关联的变量,你需要手动添加这个变量,好像是添加到 观察窗口
好久没有用vs了,不知道它现在的这个窗口叫什么名字
你找一下吧

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. //#include <easyx.h>
  6. #include <graphics.h>//使得
  7. #include <mmsystem.h>//多媒体(本程序是加载音乐)相关头文件
  8. #pragma comment(lib,"winmm.lib")//加载静态库(需要以后补充,目前还不知道。。。)

  9. //#define _CRT_SECURE_NO_WARNINGS//注意这句一定要定义到最上面,否则不能用sprintf()函数
  10. #define ROW 10//定义行、列
  11. #define COL 10
  12. #define numOfBoom 10
  13. #define SIZE 50//图片宽度

  14. int map[ROW][COL];//全局变量自动初始化为0
  15. //定义图片数组,保存图片
  16. IMAGE img[12];

  17. //游戏胜利与否
  18. int flag;

  19. //打印底层数据内核
  20. void show() {
  21.         for (int i = 0; i < ROW; i++) {
  22.                 for (int j = 0; j < COL; j++) {
  23.                         printf("%2d    ", map[i][j]);
  24.                 }

  25.                 putchar('\n');

  26.         }

  27.         putchar('\n');
  28.         putchar('\n');

  29.         //system("cls");//清屏
  30. }

  31. //游戏数据初始化
  32. void gameInit() {
  33.         mciSendString("open ./start.mp3 alias BGM", 0, 0, 0);//背景音乐版(BGM)音效
  34.         mciSendString("play BGM", 0, 0, 0);
  35.         
  36.         //设置随机数种子
  37.         srand((unsigned)time(NULL));

  38.         //初始化数组
  39.         for (int i = 0; i < ROW; i++) {
  40.                 for (int j = 0; j < COL; j++) {
  41.                         map[i][j] = 0;
  42.                 }
  43.         }

  44.         //埋雷 -1表示雷
  45.         for (int i = 0; i < numOfBoom;) {
  46.                 int r = rand() % 10;//0~9
  47.                 int c = rand() % 10;

  48.                 if (map[r][c] == 0) {//还没设置为雷
  49.                         map[r][c] = -1;
  50.                         i++;//每埋雷一次就加一
  51.                 }

  52.                 map[r][c] = -1;
  53.         }

  54.         //把以雷为中心的九宫格数据+1,雷那格除外。
  55.         for (int i = 0; i < ROW; i++) {
  56.                 for (int j = 0; j < COL; j++) {
  57.                         //判断是不是雷 -1
  58.                         if (map[i][j] == -1) {
  59.                                 //遍历雷所在的九宫格
  60.                                 for (int m = i - 1 ; m <= i + 1; m++) {
  61.                                         for (int n = j - 1; n <= j + 1; n++) {
  62.                                                 if ((m >= 0 && m < ROW && n >= 0 && n < COL/*判断是否越界*/) && map[m][n] != -1/*判断是否是雷*/) {
  63.                                                         map[m][n] += 1;
  64.                                                 }
  65.                                         }
  66.                                 }
  67.                         }
  68.                 }
  69.         }

  70.         //加载图片
  71.         for (int i = 0; i < 12; i++) {
  72.                 char file[50] = "";
  73.                 sprintf(file, "./%d.jpg", i);//将对应的字符串打印到字符串数组中
  74.                 //loadimage(&img[0], file);
  75.                 loadimage(&img[i], file, SIZE, SIZE);
  76.         }

  77.         //加密格子
  78.         for (int i = 0; i < ROW; i++) {
  79.                 for (int j = 0; j < COL; j++) {
  80.                         map[i][j] += 20;
  81.                 }
  82.         }
  83.         
  84. }

  85. //绘制界面
  86. void gameDraw() {

  87.         cleardevice();
  88.         for (int i = 0; i < ROW; i++) {
  89.                 for (int j = 0; j < COL; j++) {
  90.                         if (map[i][j] == -1) {
  91.                                 putimage(j * SIZE, i * SIZE,&img[9]);//绘制雷
  92.                         }
  93.                         else if (map[i][j] >= 0 && map[i][j] <= 8) {//把其他数字一起处理0~8
  94.                                 putimage(j * SIZE, i * SIZE, &img[map[i][j]]);
  95.                         }
  96.                         else if (map[i][j] >= 19 && map[i][j] <= 28) {
  97.                                 putimage(j * SIZE, i * SIZE, &img[10]);
  98.                         }
  99.                         else if (map[i][j] > 30) {//标记
  100.                                 putimage(j * SIZE, i * SIZE, &img[11]);
  101.                         }
  102.                 }
  103.         }
  104. }

  105. void openNull(int row, int col);//声明一下,以便在下面的mouseControl()中使用
  106. //鼠标操作
  107. int mouseControl() {
  108.         if (MouseHit()) {//判断有没有鼠标消息
  109.                 MOUSEMSG msg = GetMouseMsg();//鼠标所在的x,y

  110.                 int row = msg.y / SIZE;//把鼠标坐标转换成数组下标
  111.                 int col = msg.x / SIZE;
  112.                 //对鼠标消息进行分发
  113.                 switch (msg.uMsg) {
  114.                 case WM_LBUTTONDOWN://鼠标左键点击
  115.                         if (map[row][col] > 8) {//如果没有打开就打开
  116.                                 mciSendString("close click", 0, 0, 0);
  117.                                 
  118.                                 mciSendString("open ./click.mp3 alias click", 0, 0, 0);//点击版(click)音效
  119.                                 mciSendString("play click", 0, 0, 0);
  120.                                 
  121.                                 map[row][col] -= 20;//解密
  122.                                 //解密各数字及区间代表含义:
  123.                                 //1.                  -1:雷  0: 空白  1~8:  数字  
  124.                                 //2.+=20:(盖起来)  19:雷  20:空白  21~28:数字  
  125.                                 //3.+=20:            >=30:都是旗子
  126.                                 flag++;

  127.                                 openNull(row, col);

  128.                                 
  129.                         }
  130.                         show();

  131.                         break;
  132.                 case WM_RBUTTONDOWN://鼠标右键点击
  133.                         if (map[row][col] > 8 && map[row][col] <= 28) {//如果没打开,且未被标记
  134.                                 map[row][col] += 20;
  135.                         }
  136.                         else if (map[row][col] > 28) {//只有没打开的才可以取消标记和标记
  137.                                 map[row][col] -= 20;
  138.                         }
  139.                         show();

  140.                         break;
  141.                 }

  142.                 return map[row][col];
  143.         }
  144. }

  145. //打开所有以空白为中心的九宫格
  146. void openNull(int row, int col) {
  147.         if (map[row][col] == 0) {//点击的是空白
  148.                 for (int m = row - 1; m <= row + 1; m++) {
  149.                         for (int n = col - 1; n <= col + 1; n++) {
  150.                                 if ((m >= 0 && m < ROW && n >= 0 && n < COL) &&
  151.                                         (map[m][n] == 20 || map[m][n] != 19/*不为雷(这里个人认为不用前面那个,到时候试试,因为感觉不为雷就包括了是空)*/)&&
  152.                                         map[m][n] > 8//如果没有越界,并且为空或者数字,并且没有被点开
  153.                                         ) {
  154.                                         map[m][n] -= 20;

  155.                                         flag++;

  156.                                         openNull(m, n);
  157.                                 }
  158.                         }
  159.                 }
  160.         }

  161. }

  162. void judge() {
  163.         if (mouseControl() == -1) {
  164.                 //结束
  165.                
  166.                 ////看到所有炸弹位置
  167.                 //cleardevice();
  168.                 //for (int i = 0; i < ROW; i++) {
  169.                 //        for (int j = 0; j < COL; j++) {
  170.                 //                if (map[i][j] == 19 || map[i][j] == -1 || map[i][j] == 39) {
  171.                 //                        putimage(j * SIZE, i * SIZE, &img[9]);
  172.                 //                        //map[i][j] = 0;
  173.                 //                }
  174.                 //        }
  175.                 //}

  176.                 system("pause");

  177.                 int isOK = MessageBox(GetHWnd(), "你输了噢~要不要再来一次?","提示", MB_OKCANCEL);

  178.                 if (IDOK == isOK) {
  179.                         gameInit();

  180.                         flag = 0;
  181.                 }
  182.                 else {
  183.                         exit(-1);
  184.                 }
  185.         }
  186.         if (flag == ROW * COL - numOfBoom) {
  187.                 int isOK = MessageBox(GetHWnd(), "你赢了!哦吼吼吼吼!!","提示", MB_OKCANCEL);
  188.                
  189.                 if (IDOK == isOK) {
  190.                         gameInit();

  191.                         flag = 0;
  192.                 }
  193.                 else {
  194.                         exit(-1);
  195.                 }

  196.                 mciSendString("close BGM", 0, 0, 0);
  197.         }

  198.         
  199. }


  200. int a, b;

  201. int main() {
  202.         initgraph(ROW * SIZE, COL * SIZE, SHOWCONSOLE);

  203.         map[a][b] = flag;
  204.         
  205.         gameInit();
  206.         
  207.         BeginBatchDraw();//解决不断刷新时卡屏卡顿问题
  208.         while (1) {
  209.                 //show();
  210.                 gameDraw();
  211.                 FlushBatchDraw();//配合BeginBatchDraw()函数,在画图函数之后调用

  212.                 /*mouseControl();*/
  213.                 judge();
  214.         }
  215.         EndBatchDraw();//和FlushBatchDraw()函数作用基本一样,但是没有它好用一点。



  216.         getchar();
  217.         return 0;
  218. }
复制代码

目前debug截图

目前debug截图

之前debug截图

之前debug截图

最佳答案

查看完整内容

vs的那个自动窗口只显示和当前要执行的语句有关的变量 试试这个代码,在第244行下断点,看看是不是在自动窗口中显示map、a、b、flag 要查看和当前要执行的语句没有关联的变量,你需要手动添加这个变量,好像是添加到 观察窗口 好久没有用vs了,不知道它现在的这个窗口叫什么名字 你找一下吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-22 12:06:05 | 显示全部楼层    本楼为最佳答案   
Buryool 发表于 2021-12-22 12:08
需要看代码的话可以看一下2楼~

vs的那个自动窗口只显示和当前要执行的语句有关的变量
试试这个代码,在第244行下断点,看看是不是在自动窗口中显示map、a、b、flag
要查看和当前要执行的语句没有关联的变量,你需要手动添加这个变量,好像是添加到 观察窗口
好久没有用vs了,不知道它现在的这个窗口叫什么名字
你找一下吧

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. //#include <easyx.h>
  6. #include <graphics.h>//使得
  7. #include <mmsystem.h>//多媒体(本程序是加载音乐)相关头文件
  8. #pragma comment(lib,"winmm.lib")//加载静态库(需要以后补充,目前还不知道。。。)

  9. //#define _CRT_SECURE_NO_WARNINGS//注意这句一定要定义到最上面,否则不能用sprintf()函数
  10. #define ROW 10//定义行、列
  11. #define COL 10
  12. #define numOfBoom 10
  13. #define SIZE 50//图片宽度

  14. int map[ROW][COL];//全局变量自动初始化为0
  15. //定义图片数组,保存图片
  16. IMAGE img[12];

  17. //游戏胜利与否
  18. int flag;

  19. //打印底层数据内核
  20. void show() {
  21.         for (int i = 0; i < ROW; i++) {
  22.                 for (int j = 0; j < COL; j++) {
  23.                         printf("%2d    ", map[i][j]);
  24.                 }

  25.                 putchar('\n');

  26.         }

  27.         putchar('\n');
  28.         putchar('\n');

  29.         //system("cls");//清屏
  30. }

  31. //游戏数据初始化
  32. void gameInit() {
  33.         mciSendString("open ./start.mp3 alias BGM", 0, 0, 0);//背景音乐版(BGM)音效
  34.         mciSendString("play BGM", 0, 0, 0);
  35.         
  36.         //设置随机数种子
  37.         srand((unsigned)time(NULL));

  38.         //初始化数组
  39.         for (int i = 0; i < ROW; i++) {
  40.                 for (int j = 0; j < COL; j++) {
  41.                         map[i][j] = 0;
  42.                 }
  43.         }

  44.         //埋雷 -1表示雷
  45.         for (int i = 0; i < numOfBoom;) {
  46.                 int r = rand() % 10;//0~9
  47.                 int c = rand() % 10;

  48.                 if (map[r][c] == 0) {//还没设置为雷
  49.                         map[r][c] = -1;
  50.                         i++;//每埋雷一次就加一
  51.                 }

  52.                 map[r][c] = -1;
  53.         }

  54.         //把以雷为中心的九宫格数据+1,雷那格除外。
  55.         for (int i = 0; i < ROW; i++) {
  56.                 for (int j = 0; j < COL; j++) {
  57.                         //判断是不是雷 -1
  58.                         if (map[i][j] == -1) {
  59.                                 //遍历雷所在的九宫格
  60.                                 for (int m = i - 1 ; m <= i + 1; m++) {
  61.                                         for (int n = j - 1; n <= j + 1; n++) {
  62.                                                 if ((m >= 0 && m < ROW && n >= 0 && n < COL/*判断是否越界*/) && map[m][n] != -1/*判断是否是雷*/) {
  63.                                                         map[m][n] += 1;
  64.                                                 }
  65.                                         }
  66.                                 }
  67.                         }
  68.                 }
  69.         }

  70.         //加载图片
  71.         for (int i = 0; i < 12; i++) {
  72.                 char file[50] = "";
  73.                 sprintf(file, "./%d.jpg", i);//将对应的字符串打印到字符串数组中
  74.                 //loadimage(&img[0], file);
  75.                 loadimage(&img[i], file, SIZE, SIZE);
  76.         }

  77.         //加密格子
  78.         for (int i = 0; i < ROW; i++) {
  79.                 for (int j = 0; j < COL; j++) {
  80.                         map[i][j] += 20;
  81.                 }
  82.         }
  83.         
  84. }

  85. //绘制界面
  86. void gameDraw() {

  87.         cleardevice();
  88.         for (int i = 0; i < ROW; i++) {
  89.                 for (int j = 0; j < COL; j++) {
  90.                         if (map[i][j] == -1) {
  91.                                 putimage(j * SIZE, i * SIZE,&img[9]);//绘制雷
  92.                         }
  93.                         else if (map[i][j] >= 0 && map[i][j] <= 8) {//把其他数字一起处理0~8
  94.                                 putimage(j * SIZE, i * SIZE, &img[map[i][j]]);
  95.                         }
  96.                         else if (map[i][j] >= 19 && map[i][j] <= 28) {
  97.                                 putimage(j * SIZE, i * SIZE, &img[10]);
  98.                         }
  99.                         else if (map[i][j] > 30) {//标记
  100.                                 putimage(j * SIZE, i * SIZE, &img[11]);
  101.                         }
  102.                 }
  103.         }
  104. }

  105. void openNull(int row, int col);//声明一下,以便在下面的mouseControl()中使用
  106. //鼠标操作
  107. int mouseControl() {
  108.         if (MouseHit()) {//判断有没有鼠标消息
  109.                 MOUSEMSG msg = GetMouseMsg();//鼠标所在的x,y

  110.                 int row = msg.y / SIZE;//把鼠标坐标转换成数组下标
  111.                 int col = msg.x / SIZE;
  112.                 //对鼠标消息进行分发
  113.                 switch (msg.uMsg) {
  114.                 case WM_LBUTTONDOWN://鼠标左键点击
  115.                         if (map[row][col] > 8) {//如果没有打开就打开
  116.                                 mciSendString("close click", 0, 0, 0);
  117.                                 
  118.                                 mciSendString("open ./click.mp3 alias click", 0, 0, 0);//点击版(click)音效
  119.                                 mciSendString("play click", 0, 0, 0);
  120.                                 
  121.                                 map[row][col] -= 20;//解密
  122.                                 //解密各数字及区间代表含义:
  123.                                 //1.                  -1:雷  0: 空白  1~8:  数字  
  124.                                 //2.+=20:(盖起来)  19:雷  20:空白  21~28:数字  
  125.                                 //3.+=20:            >=30:都是旗子
  126.                                 flag++;

  127.                                 openNull(row, col);

  128.                                 
  129.                         }
  130.                         show();

  131.                         break;
  132.                 case WM_RBUTTONDOWN://鼠标右键点击
  133.                         if (map[row][col] > 8 && map[row][col] <= 28) {//如果没打开,且未被标记
  134.                                 map[row][col] += 20;
  135.                         }
  136.                         else if (map[row][col] > 28) {//只有没打开的才可以取消标记和标记
  137.                                 map[row][col] -= 20;
  138.                         }
  139.                         show();

  140.                         break;
  141.                 }

  142.                 return map[row][col];
  143.         }
  144. }

  145. //打开所有以空白为中心的九宫格
  146. void openNull(int row, int col) {
  147.         if (map[row][col] == 0) {//点击的是空白
  148.                 for (int m = row - 1; m <= row + 1; m++) {
  149.                         for (int n = col - 1; n <= col + 1; n++) {
  150.                                 if ((m >= 0 && m < ROW && n >= 0 && n < COL) &&
  151.                                         (map[m][n] == 20 || map[m][n] != 19/*不为雷(这里个人认为不用前面那个,到时候试试,因为感觉不为雷就包括了是空)*/)&&
  152.                                         map[m][n] > 8//如果没有越界,并且为空或者数字,并且没有被点开
  153.                                         ) {
  154.                                         map[m][n] -= 20;

  155.                                         flag++;

  156.                                         openNull(m, n);
  157.                                 }
  158.                         }
  159.                 }
  160.         }

  161. }

  162. void judge() {
  163.         if (mouseControl() == -1) {
  164.                 //结束
  165.                
  166.                 ////看到所有炸弹位置
  167.                 //cleardevice();
  168.                 //for (int i = 0; i < ROW; i++) {
  169.                 //        for (int j = 0; j < COL; j++) {
  170.                 //                if (map[i][j] == 19 || map[i][j] == -1 || map[i][j] == 39) {
  171.                 //                        putimage(j * SIZE, i * SIZE, &img[9]);
  172.                 //                        //map[i][j] = 0;
  173.                 //                }
  174.                 //        }
  175.                 //}

  176.                 system("pause");

  177.                 int isOK = MessageBox(GetHWnd(), "你输了噢~要不要再来一次?","提示", MB_OKCANCEL);

  178.                 if (IDOK == isOK) {
  179.                         gameInit();

  180.                         flag = 0;
  181.                 }
  182.                 else {
  183.                         exit(-1);
  184.                 }
  185.         }
  186.         if (flag == ROW * COL - numOfBoom) {
  187.                 int isOK = MessageBox(GetHWnd(), "你赢了!哦吼吼吼吼!!","提示", MB_OKCANCEL);
  188.                
  189.                 if (IDOK == isOK) {
  190.                         gameInit();

  191.                         flag = 0;
  192.                 }
  193.                 else {
  194.                         exit(-1);
  195.                 }

  196.                 mciSendString("close BGM", 0, 0, 0);
  197.         }

  198.         
  199. }


  200. int a, b;

  201. int main() {
  202.         initgraph(ROW * SIZE, COL * SIZE, SHOWCONSOLE);

  203.         map[a][b] = flag;
  204.         
  205.         gameInit();
  206.         
  207.         BeginBatchDraw();//解决不断刷新时卡屏卡顿问题
  208.         while (1) {
  209.                 //show();
  210.                 gameDraw();
  211.                 FlushBatchDraw();//配合BeginBatchDraw()函数,在画图函数之后调用

  212.                 /*mouseControl();*/
  213.                 judge();
  214.         }
  215.         EndBatchDraw();//和FlushBatchDraw()函数作用基本一样,但是没有它好用一点。



  216.         getchar();
  217.         return 0;
  218. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-12-22 12:07:03 | 显示全部楼层
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. //#include <easyx.h>
  6. #include <graphics.h>//使得
  7. #include <mmsystem.h>//多媒体(本程序是加载音乐)相关头文件
  8. #pragma comment(lib,"winmm.lib")//加载静态库(需要以后补充,目前还不知道。。。)

  9. //#define _CRT_SECURE_NO_WARNINGS//注意这句一定要定义到最上面,否则不能用sprintf()函数
  10. #define ROW 10//定义行、列
  11. #define COL 10
  12. #define numOfBoom 10
  13. #define SIZE 50//图片宽度

  14. int map[ROW][COL];//全局变量自动初始化为0
  15. //定义图片数组,保存图片
  16. IMAGE img[12];

  17. //游戏胜利与否
  18. int flag;

  19. //打印底层数据内核
  20. void show() {
  21.         for (int i = 0; i < ROW; i++) {
  22.                 for (int j = 0; j < COL; j++) {
  23.                         printf("%2d    ", map[i][j]);
  24.                 }

  25.                 putchar('\n');

  26.         }

  27.         putchar('\n');
  28.         putchar('\n');

  29.         //system("cls");//清屏
  30. }

  31. //游戏数据初始化
  32. void gameInit() {
  33.         mciSendString("open ./start.mp3 alias BGM", 0, 0, 0);//背景音乐版(BGM)音效
  34.         mciSendString("play BGM", 0, 0, 0);
  35.        
  36.         //设置随机数种子
  37.         srand((unsigned)time(NULL));

  38.         //初始化数组
  39.         for (int i = 0; i < ROW; i++) {
  40.                 for (int j = 0; j < COL; j++) {
  41.                         map[i][j] = 0;
  42.                 }
  43.         }

  44.         //埋雷 -1表示雷
  45.         for (int i = 0; i < numOfBoom;) {
  46.                 int r = rand() % 10;//0~9
  47.                 int c = rand() % 10;

  48.                 if (map[r][c] == 0) {//还没设置为雷
  49.                         map[r][c] = -1;
  50.                         i++;//每埋雷一次就加一
  51.                 }

  52.                 map[r][c] = -1;
  53.         }

  54.         //把以雷为中心的九宫格数据+1,雷那格除外。
  55.         for (int i = 0; i < ROW; i++) {
  56.                 for (int j = 0; j < COL; j++) {
  57.                         //判断是不是雷 -1
  58.                         if (map[i][j] == -1) {
  59.                                 //遍历雷所在的九宫格
  60.                                 for (int m = i - 1 ; m <= i + 1; m++) {
  61.                                         for (int n = j - 1; n <= j + 1; n++) {
  62.                                                 if ((m >= 0 && m < ROW && n >= 0 && n < COL/*判断是否越界*/) && map[m][n] != -1/*判断是否是雷*/) {
  63.                                                         map[m][n] += 1;
  64.                                                 }
  65.                                         }
  66.                                 }
  67.                         }
  68.                 }
  69.         }

  70.         //加载图片
  71.         for (int i = 0; i < 12; i++) {
  72.                 char file[50] = "";
  73.                 sprintf(file, "./%d.jpg", i);//将对应的字符串打印到字符串数组中
  74.                 //loadimage(&img[0], file);
  75.                 loadimage(&img[i], file, SIZE, SIZE);
  76.         }

  77.         //加密格子
  78.         for (int i = 0; i < ROW; i++) {
  79.                 for (int j = 0; j < COL; j++) {
  80.                         map[i][j] += 20;
  81.                 }
  82.         }
  83.        
  84. }

  85. //绘制界面
  86. void gameDraw() {

  87.         cleardevice();
  88.         for (int i = 0; i < ROW; i++) {
  89.                 for (int j = 0; j < COL; j++) {
  90.                         if (map[i][j] == -1) {
  91.                                 putimage(j * SIZE, i * SIZE,&img[9]);//绘制雷
  92.                         }
  93.                         else if (map[i][j] >= 0 && map[i][j] <= 8) {//把其他数字一起处理0~8
  94.                                 putimage(j * SIZE, i * SIZE, &img[map[i][j]]);
  95.                         }
  96.                         else if (map[i][j] >= 19 && map[i][j] <= 28) {
  97.                                 putimage(j * SIZE, i * SIZE, &img[10]);
  98.                         }
  99.                         else if (map[i][j] > 30) {//标记
  100.                                 putimage(j * SIZE, i * SIZE, &img[11]);
  101.                         }
  102.                 }
  103.         }
  104. }

  105. void openNull(int row, int col);//声明一下,以便在下面的mouseControl()中使用
  106. //鼠标操作
  107. int mouseControl() {
  108.         if (MouseHit()) {//判断有没有鼠标消息
  109.                 MOUSEMSG msg = GetMouseMsg();//鼠标所在的x,y

  110.                 int row = msg.y / SIZE;//把鼠标坐标转换成数组下标
  111.                 int col = msg.x / SIZE;
  112.                 //对鼠标消息进行分发
  113.                 switch (msg.uMsg) {
  114.                 case WM_LBUTTONDOWN://鼠标左键点击
  115.                         if (map[row][col] > 8) {//如果没有打开就打开
  116.                                 mciSendString("close click", 0, 0, 0);
  117.                                
  118.                                 mciSendString("open ./click.mp3 alias click", 0, 0, 0);//点击版(click)音效
  119.                                 mciSendString("play click", 0, 0, 0);
  120.                                
  121.                                 map[row][col] -= 20;//解密
  122.                                 //解密各数字及区间代表含义:
  123.                                 //1.                  -1:雷  0: 空白  1~8:  数字  
  124.                                 //2.+=20:(盖起来)  19:雷  20:空白  21~28:数字  
  125.                                 //3.+=20:            >=30:都是旗子
  126.                                 flag++;

  127.                                 openNull(row, col);

  128.                                
  129.                         }
  130.                         show();

  131.                         break;
  132.                 case WM_RBUTTONDOWN://鼠标右键点击
  133.                         if (map[row][col] > 8 && map[row][col] <= 28) {//如果没打开,且未被标记
  134.                                 map[row][col] += 20;
  135.                         }
  136.                         else if (map[row][col] > 28) {//只有没打开的才可以取消标记和标记
  137.                                 map[row][col] -= 20;
  138.                         }
  139.                         show();

  140.                         break;
  141.                 }

  142.                 return map[row][col];
  143.         }
  144. }

  145. //打开所有以空白为中心的九宫格
  146. void openNull(int row, int col) {
  147.         if (map[row][col] == 0) {//点击的是空白
  148.                 for (int m = row - 1; m <= row + 1; m++) {
  149.                         for (int n = col - 1; n <= col + 1; n++) {
  150.                                 if ((m >= 0 && m < ROW && n >= 0 && n < COL) &&
  151.                                         (map[m][n] == 20 || map[m][n] != 19/*不为雷(这里个人认为不用前面那个,到时候试试,因为感觉不为雷就包括了是空)*/)&&
  152.                                         map[m][n] > 8//如果没有越界,并且为空或者数字,并且没有被点开
  153.                                         ) {
  154.                                         map[m][n] -= 20;

  155.                                         flag++;

  156.                                         openNull(m, n);
  157.                                 }
  158.                         }
  159.                 }
  160.         }

  161. }

  162. void judge() {
  163.         if (mouseControl() == -1) {
  164.                 //结束
  165.                
  166.                 ////看到所有炸弹位置
  167.                 //cleardevice();
  168.                 //for (int i = 0; i < ROW; i++) {
  169.                 //        for (int j = 0; j < COL; j++) {
  170.                 //                if (map[i][j] == 19 || map[i][j] == -1 || map[i][j] == 39) {
  171.                 //                        putimage(j * SIZE, i * SIZE, &img[9]);
  172.                 //                        //map[i][j] = 0;
  173.                 //                }
  174.                 //        }
  175.                 //}

  176.                 system("pause");

  177.                 int isOK = MessageBox(GetHWnd(), "你输了噢~要不要再来一次?","提示", MB_OKCANCEL);

  178.                 if (IDOK == isOK) {
  179.                         gameInit();

  180.                         flag = 0;
  181.                 }
  182.                 else {
  183.                         exit(-1);
  184.                 }
  185.         }
  186.         if (flag == ROW * COL - numOfBoom) {
  187.                 int isOK = MessageBox(GetHWnd(), "你赢了!哦吼吼吼吼!!","提示", MB_OKCANCEL);
  188.                
  189.                 if (IDOK == isOK) {
  190.                         gameInit();

  191.                         flag = 0;
  192.                 }
  193.                 else {
  194.                         exit(-1);
  195.                 }

  196.                 mciSendString("close BGM", 0, 0, 0);
  197.         }

  198.        
  199. }

  200. int main() {
  201.         initgraph(ROW * SIZE, COL * SIZE, SHOWCONSOLE);
  202.        
  203.         gameInit();
  204.        
  205.         BeginBatchDraw();//解决不断刷新时卡屏卡顿问题
  206.         while (1) {
  207.                 //show();
  208.                 gameDraw();
  209.                 FlushBatchDraw();//配合BeginBatchDraw()函数,在画图函数之后调用

  210.                 /*mouseControl();*/
  211.                 judge();
  212.         }
  213.         EndBatchDraw();//和FlushBatchDraw()函数作用基本一样,但是没有它好用一点。



  214.         getchar();
  215.         return 0;
  216. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-12-22 12:08:19 | 显示全部楼层
需要看代码的话可以看一下2楼~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-12-22 15:02:14 | 显示全部楼层
人造人 发表于 2021-12-22 12:06
vs的那个自动窗口只显示和当前要执行的语句有关的变量
试试这个代码,在第244行下断点,看看是不是在自 ...

非常感谢!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-21 04:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表