exgdreamer 2023-06-04 13:50 采纳率: 53.3%
浏览 39
已结题

请帮我看看这个逻辑是否有问题

我在写抢地主的部分
但是这个逻辑好像有些问题,每次进入界面之后会一直刷新

int dealCards::dealLord(ExMessage msg) {

    settextstyle(25, 0, "楷体");
    srand((int)time(0));


    //先从一个随机的人开始,如果是玩家就问要不要叫地主,如果是bot就随机一个数得到叫与不叫
    //然后逆时针依次询问,没有人当地主时重新进入界面发牌,只有一人叫时直接成为地主,两人及以上叫时进入第二轮
    //第二轮开始时叫地主的那个如果继续抢地主那么直接成为地主,否则后一个抢地主的人成为地主
    int turn = 1;
    bool isLord[3] = { false };
    int player[3] = { 0,1,2 }; //0是玩家,1是右bot,2是左bot
    int curPlayer = rand() % 3;
    int isBot[2] = { rand() % 2 };
    int numLord = 0;//抢地主的人数
    int firstPlayer = curPlayer;
    for (int i = 0; i < 3 && turn == 1; i++, curPlayer++) {
        if (curPlayer == 0) {//如果第一个是玩家
            if (button(msg, 452, 418, 100, 38, NULL, NULL, WHITE, NULL, "叫地主")) {
                isLord[0] = true;
                numLord++;
                //叫地主.mp3
            }
            if (button(msg, 729, 418, 100, 38, NULL, NULL, WHITE, NULL, "不叫")) {
                //不叫.mp3
                isLord[0] = false;

            }
        }
        else {//如果不是玩家
            if (curPlayer == 1 && isBot[0]) {
                isLord[1] = true;
                numLord++;

            }
            if (curPlayer == 2 && isBot[1]) {
                isLord[2] = true;
                numLord++;
            }
        }
    }

    if (numLord == 0) {
        return -1;
    }
    if (numLord == 1) {
        for (int i = 0; i < 3; i++)
        {
            if (isLord[i] == true)
            {

                return i;
            }
        }
    }
    if (numLord == 2) {
        turn = 2;
        for (int i = 0; i < 3; i++)isLord[i] = false;
        if (firstPlayer == 0) {
            if (button(msg, 452, 418, 100, 38, NULL, NULL, WHITE, NULL, "抢地主")) {

                return 0;
                //抢地主.mp3
            }
            if (button(msg, 729, 418, 100, 38, NULL, NULL, WHITE, NULL, "不抢")) {

                //不抢.mp3
            }
        }
        else {
            if (firstPlayer == 1 && isBot[0]) {
                return 1;
            }
            if (firstPlayer == 2 && isBot[1]) {
                return 2;
            }
        }
    }
}
void dealCards::addCard(int i) {
    //传入的i:0是玩家,1是右bot,2是左bot
    if (!lordFinish) {
        if (i == -1) {
            curView = new gameingView;
        }
        if (i == 0) {
            player1[17] = landlord[0];
            player1[18] = landlord[1];
            player1[19] = landlord[2];
        }
        if (i == 1) {
            player2[17] = landlord[0];
            player2[18] = landlord[1];
            player2[19] = landlord[2];
        }
        if (i == 2) {
            player3[17] = landlord[0];
            player3[18] = landlord[1];
            player3[19] = landlord[2];
        }
        
    }
lordFinish = true;
}

//gamingView.cpp中的调用,lordFinish为全局变量初始为false
static dealCards a;
     
a.addCard(a.dealLord(msg));
  • 写回答

2条回答 默认 最新

  • 开发技术控 2023-06-04 14:08
    关注

    在 addCard() 函数中增加 lordFinish 的判断,只在第一次调用时选择地主,后续直接使用上一次的选择结果。这样就可以避免界面刷新问题。

    
    ```c++
    std::string callLord[2] = {"叫地主", "不叫"};
    std::string robLord[2] = {"抢地主", "不抢"};
    
    int dealCards::dealLord(ExMessage msg) {
        if (lordFinish) return lord;  //如果已经选择过地主,直接返回
    
        // 选择地主逻辑...
        
        lordFinish = true;  //选择地主后,更新标志位
        return lord;
    }
    
    void dealCards::addCard(int i) {
        if (!lordFinish) {  //只有第一次调用时选择地主
            lord = dealLord(msg);
        }
        // 添加地主牌...
    } 
    
    

    ```

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月1日
  • 创建了问题 6月4日

悬赏问题

  • ¥200 如何使用postGis实现最短领规划?
  • ¥15 pyinstaller打包错误
  • ¥20 cesm的气溶胶排放文件
  • ¥15 逐月累计,月份不连续,补齐月份
  • ¥15 应用简单的Python代码完成一个学生成绩管理系统
  • ¥15 用matlab求微分方程初值问题
  • ¥15 vscode下编写第三方库opencv与pcl代码时没有代码提示
  • ¥15 能够跑通不报错,如何解决?(标签-matlab)
  • ¥15 MOS在RDS较大,频率高时开关波形异常
  • ¥15 SCENIC分析报错求解答