请教c++五子棋中MessageBox的使用

能否使用MessageBox直接开始下一局

void mousePressMsg(ExMessage* msg)
{
    //如果是鼠标左键,就下棋
    if (msg->message == WM_LBUTTONDOWN)
    {
        map[pos.row][pos.col] = pos.player;

        //判断输赢
        if (judge(pos.row, pos.col))
        {
            

            
            MessageBox(GetHWnd(), "  win", "胜负已分", MB_RETRYCANCEL);
                
            exit(666);
        }

        //切换棋手
        pos.player = (pos.player == Black ? White : Black);
    }
}

img

img

if (MessageBox(GetHWnd(), "win,是否下一局", "胜负已分", MB_RETRYCANCEL) == IDRETRY)
...

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7767122
  • 除此之外, 这篇博客: 为什么MessageBox会跑到窗口下面中的 出现问题 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    我们来看下他的代码,很简单完全没有问题是不是

    但是在实际运行中,其中的一个方法Foo抛出了一个异常。

    而作为代码书写者,为了确保软件的正常运行,将这个方法的所有异常都吞掉了。

    此时导致的结果就是,用户端看到软件运行正常,但是没有期望的输出

            public MainWindow()
            {
                InitializeComponent();
                Loaded += (sender, args) =>
                {
                    MessageBox.Show("黄腾霄好瘦哟");
                };
            }
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o5y2PeVV-1582074964316)(…/media/1563249113514.png)]

    我们稍稍做一些改动,让messagebox延迟一点点出现。然后我们在主窗口显示后立刻点击其他程序窗口

            public MainWindow()
            {
                InitializeComponent();
                Loaded += async (sender, args) =>
                {
                    await Task.Delay(3000);
                    MessageBox.Show("黄腾霄好瘦哟");
                };
            }
    

    惊这个messagebox掉下去了。

    在这里插入图片描述

  • 以下回答来自chatgpt:

    解决方案:

    在 C++ 中使用 MessageBox 函数需要包含 Windows.h 头文件,因此在程序开头加入 #include 语句。

    MessageBox 函数的格式如下:

    int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);

    其中,第一个参数 hWnd 表示消息框所属的窗口句柄,输入 NULL 表示消息框没有指定父窗口;第二个参数 lpText 表示消息框中的文本内容,是一个字符串型变量;第三个参数 lpCaption 表示消息框的标题,同样是一个字符串型变量;第四个参数 uType 表示消息框的类型,可以是如下值(其中最常用的是 MB_OK 和 MB_YESNO):

    MB_OK:只有一个“确定”按钮的消息框

    MB_YESNO:有“是”、“否”两个按钮的消息框

    MB_ICONINFORMATION:使用信息图标的消息框

    MB_ICONQUESTION:使用问号图标的消息框

    MB_ICONWARNING:使用警告图标的消息框

    MB_ICONERROR:使用错误图标的消息框

    在五子棋游戏中,当玩家获胜或者平局时,需要弹出一个含有“开始新游戏”和“退出游戏”两个按钮的消息框,并根据玩家的选择进行操作。假设定义了下面的两个变量:

    bool m_bGameOver = false; // 标识游戏是否结束 bool m_bNewGame = false; // 标识玩家是否选择开始新游戏

    则可以在程序中使用如下代码段来实现该功能:

    if (m_bGameOver) { // 如果游戏结束,弹出消息框 int iRet = MessageBox(NULL, "游戏结束,是否开始新游戏?", "提示", MB_YESNO); if (iRet == IDYES) { // 如果玩家选择开始新游戏,将标志位置为 true,并在下一轮循环中重新开始游戏 m_bNewGame = true; m_bGameOver = false; } else { // 如果玩家选择退出游戏,将标志位置为 true,并在下一轮循环中退出游戏 m_bNewGame = false; m_bGameOver = true; } }

    在该代码中,首先判断游戏是否结束,如果结束则弹出消息框,通过 iRet 变量获取玩家的选择,如果玩家选择开始新游戏,则将 m_bNewGame 标志位置为 true,将 m_bGameOver 标志位置为 false,即在下一轮循环中重新开始游戏;如果玩家选择退出游戏,则将 m_bNewGame 标志位置为 false,将 m_bGameOver 标志位置为 true,即在下一轮循环中退出游戏。

    完整的代码示例:

    include

    include

    using namespace std;

    bool m_bGameOver = false; // 标识游戏是否结束 bool m_bNewGame = false; // 标识玩家是否选择开始新游戏

    int main() { while (true) { if (m_bGameOver) { // 如果游戏结束,弹出消息框 int iRet = MessageBox(NULL, "游戏结束,是否开始新游戏?", "提示", MB_YESNO); if (iRet == IDYES) { // 如果玩家选择开始新游戏,将标志位置为 true,并在下一轮循环中重新开始游戏 m_bNewGame = true; m_bGameOver = false; } else { // 如果玩家选择退出游戏,将标志位置为 true,并在下一轮循环中退出游戏 m_bNewGame = false; m_bGameOver = true; } } else { // 如果游戏没有结束,进行游戏操作 // ... }

    if (!m_bNewGame)
    {
      // 如果玩家选择退出游戏,退出程序
      break;
    }
    

    }

    return 0; }


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^