|
用来在控制台里模拟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数组方面的问题下一篇: 求助,在函数的默认参数这里出错了
|