VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 130|回复: 3

不知道哪出错了,调试了快1小时看不出问题qwq

[复制链接]
32_avatar_middle
最佳答案
0 
在线会员 发表于 2020-8-7 05:48:25 | 显示全部楼层 |阅读模式
用来在控制台里模拟2048游戏
完全失败了qwq
问题应该在模拟2048的界面那里把数字的每一个位数输入到字符数组里(就是第一个for循环下面的部分),因为输入w之后会卡在输入字符串的循环里,但是我看不出来问题是啥
虽然又臭又长但是我写注释了求解答


#include<iostream>
#include<ctime>
#include<cstdlib>
#include<math.h>
//把界面看成
//3
//2
//1
//0
//  0  1   2  3这样的坐标系,一个点对应一个数一共16个数,储存在数组num[x][y]里面
using namespace std;
int main()
{
        int num[4][4] = { 0 }, randnum = 0, seed = 0, cbnt = 0, score = 0, existentnum = 0, emptynum = 16, oom = 0, cbnt2=0, empty[32] = {0}, empty_idx = 0,cbnt4=0,cbnt6=0;
        char c;
        char screen[100] = {0};
        string cbnt3;
        int screen_idx=0;
        srand(time(0));
        for (; emptynum > 1;)
        {
                emptynum = 0;//归零
                cout << score << endl;//用来模拟界面的部分,把得分和格子里的数打到屏幕上
                for (int i2 = 3; i2 > -1; i2--)
                {
                        for (int i = 0; i < 4; ++i)
                        {
                                if (num[i][i2] == 0)
                                {
                                        screen[screen_idx] = '0';
                                        screen_idx++;
                                        for (int i3 = 0; i3 < 3; i3++)
                                        {
                                                screen[screen_idx] = ' ';
                                                screen_idx++;
                                        }
                                }
                                else
                                {
                                        cbnt = num[i][i2];
                                        for (oom = 1; !(pow(10, oom -1)<=cbnt<pow(10,oom)); oom++);//计算这是几位数1000算作四位数
                                        for (int i3 = 0; i3 < oom; i3++)
                                        {   
                                                static int cbnt5 = screen_idx;//通过取余数把一个数的各个位的数储存到字符数组screen
                                                cbnt4 = pow(10, i3 + 1);
                                                screen[cbnt5+oom-i3] = (cbnt % cbnt4)/pow(10,i3-1);
                                                cbnt -= cbnt % cbnt4;
                                                screen_idx++;
                                        }
                                        for (int i3 = 0; i3 < oom; i3++)
                                        {
                                                screen[screen_idx] = ' ';
                                                screen_idx++;
                                        }
                                }

                        }
                        cbnt3 = screen;
                        cout << cbnt3 << endl;
                        for (int i3 = 0; i3 < 100; i3++)//归零
                        {
                                screen[i3] = 0;
                        }
                        screen_idx = 0;
                }

                for (int i = 0; i < 4; i++)//寻找并记录哪些格子是空的,空格子的坐标储存到数组empty里面,序号储存到empty_idx里面
                {
                        for (int i2 = 0; i2 < 4; i2++)
                        {
                                if (num[i][i2] == 0)
                                {
                                        empty[empty_idx] = i;
                                        empty[empty_idx + 1] = i2;
                                        empty_idx += 2;
                                }
                        }
                }
                seed = (rand() % 5);//从2 4 8 16中产生一个随机数,产生4的概率最大
                switch (seed)
                {
                case 0:randnum = 2;
                        break;
                case 4:
                case 1:randnum = 4;
                        break;
                case 2:randnum = 8;
                        break;
                case 3: randnum = 16;
                        break;
                }
                num[(rand() % (empty_idx / 2))][(rand() % (empty_idx / 2)) + 1] = randnum;//把随机数放到一个随机的空格子里
               
            //用来进行操作的部分
                //比如输入d 先检测(3,0)格子里的数是不是0,是就检测下一个(2,0),不是就检测下一个(2,0)里的数和(3,0)是否一样,不一样就把(3,0)里的数赋值给变量cbnt,然后
                //把0复制给(3,0)格子,然后把cbnt的值给(3-existentnum,0)这个格子,也就是(3,0)格子,然后变量existentnum的值加一,如果一样就把(2,0)里的数加给(3,0),然后把(2,0)
                //归零,然后和上面一样把(3,0)里的数移到最左边,然后existentnum的值加一
                //以此类推,把这一行都检测完把existentnum的
                //值归零,下一行一样操作
                cin >> c;
                switch (c)
                {
                case 'd':
                case 'D':
                        for (int i2=0; i2<4;++i2)
                        {
                                for (int i = 3; i>-1; --i)
                                {
                                        if (num[i][i2] != 0)
                                        {
                                                if (num[i][i2] == num[i - 1][i2])
                                                {
                                                        num[i][i2] += num[i - 1][i2];
                                                        num[i - 1][i2] = 0;
                                                        i--;
                                                        cbnt = num[i][i2];
                                                        num[i][i2] = 0;
                                                        num[3 - existentnum][i2] = cbnt;
                                                        existentnum++;
                                                        score += cbnt;
                                                }
                                                else
                                                {
                                                        cbnt = num[i][i2];
                                                        num[i][i2] = 0;
                                                        num[3 - existentnum][i2] = cbnt;
                                                        existentnum++;
                                                }
                                        }
                                        existentnum = 0;
                                }
                        }
                        break;
                case 'w':
                case 'W':
                        for (int i = 0; i < 4; ++i)
                        {
                                for (int i2 = 3; 3 > -1; --i2)
                                {
                                        if (num[i][i2] != 0)
                                        {
                                                if (num[i][i2] == num[i][i2 - 1])
                                                {
                                                        num[i][i2] += num[i][i2 - 1];
                                                        num[i][i2 - 1] = 0;
                                                        i2--;
                                                        cbnt = num[i][i2];
                                                        num[i][i2] = 0;
                                                        num[i][3 - existentnum] = cbnt;
                                                        score += cbnt;
                                                }
                                                else
                                                {
                                                        cbnt = num[i][i2];
                                                        num[i][i2] = 0;
                                                        num[i][3 - existentnum] = cbnt;
                                                }
                                        }
                                        existentnum = 0;
                                }
                        }
                        break;
                case 's':
                case 'S':
                        for (int i = 0; i < 4; i++)
                        {
                                for (int i2 = 0; i < 4; ++i)
                                {
                                        if (num[i][i2] != 0)
                                        {
                                                if (num[i][i2] == num[i][i2 + 1])
                                                {
                                                        num[i][i2] += num[i][i2 + 1];
                                                        num[i][i2 + 1] = 0;
                                                        cbnt = num[i][i2];
                                                        num[i][i2] = 0;
                                                        num[i][existentnum];
                                                        existentnum++;
                                                        i2++;
                                                }
                                                else
                                                {
                                                        cbnt = num[i][i2];
                                                        num[i][i2] = 0;
                                                        num[i][existentnum] = cbnt;
                                                        existentnum++;
                                                }
                                        }
                                        existentnum = 0;
                                }
                        }
                        break;
                case 'a':
                case 'A':
                        for (int i2 = 0; i2 < 4; i2++)
                        {
                                for (int i = 0; i < 4; i++)
                                {
                                        if (num[i][i2] != 0)
                                        {
                                                if (num[i][i2] == num[i + 1][i2])
                                                {
                                                        num[i][i2] += num[i + 1][i2];
                                                        num[i + 1][i2] = 0;
                                                        cbnt = num[i][i2];
                                                        num[i][i2] = 0;
                                                        num[existentnum][i2] = num[i][i2];
                                                        existentnum++;
                                                        i++;
                                                }
                                                else
                                                {
                                                        cbnt = num[i][i2];
                                                        num[i][i2] = 0;
                                                        num[existentnum][i2] = cbnt;
                                                        existentnum++;
                                                }
                                        }
                                        existentnum = 0;
                                }
                        }
                        break;
                }
                for (int i = 0; i < 4; ++i)//统计空格子的数量,空格子小于等于1就结束游戏
                {
                        for (int i2 = 0; i2 < 4; i2++)
                        {
                                if (num[i][i2] == 0)
                                {
                                        emptynum++;
                                }
                        }
                }
        }
        cout << "游戏结束" << endl;
        cout << "'最终得分:" << score << endl;
        return 0;
}




上一篇:vector数组方面的问题
下一篇:求助,在函数的默认参数这里出错了
32_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-8-7 05:56:52 | 显示全部楼层
num[empty[(rand() % (empty_idx / 2))]][empty[(rand() % (empty_idx / 2)) + 1]] = randnum;//把随机数放到一个随机的空格子里
32_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-8-7 05:57:59 | 显示全部楼层
这一行调试的时候不小心改了,原先是这样的
74_avatar_middle
最佳答案
1 
在线会员 发表于 2020-8-7 08:48:22 | 显示全部楼层
本帖最后由 User_Ghost 于 2020-8-7 09:30 编辑

3恒大于-1的,死循环了可能。应该是要改成i2的【用注释符号标识】
  1.         case 'w':
  2.         case 'W':
  3.             for (int i = 0; i < 4; ++i)
  4.             {
  5.                 for (int i2 = 3;3 > -1; --i2) //
  6.                 {
  7.                     if (num[i][i2] != 0)
  8.                     {
  9.                         if (num[i][i2] == num[i][i2 - 1])
  10.                         {
  11.                             num[i][i2] += num[i][i2 - 1];
  12.                             num[i][i2 - 1] = 0;
  13.                             i2--;
  14.                             cbnt = num[i][i2];
  15.                             num[i][i2] = 0;
  16.                             num[i][3 - existentnum] = cbnt;
  17.                             score += cbnt;
  18.                         }
  19.                         else
  20.                         {
  21.                             cbnt = num[i][i2];
  22.                             num[i][i2] = 0;
  23.                             num[i][3 - existentnum] = cbnt;
  24.                         }
  25.                     }
  26.                     existentnum = 0;
  27.                 }
  28.             }
  29.             break;
复制代码

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-9-19 23:18

Powered by CcTry.CoM

© 2009-2020 cctry.com

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