我目前正在开发一个项目来编写一个C程序来克隆流行的iphone游戏" 2048"。如果您不熟悉此游戏,可以访问here查看。
我将简要地谈谈我如何解决这个问题:
只用两个'生成一张表。
用户开始播放。
该程序会弹出一个' 2'在二维数组中的随机位置,它是' 0'
检查是否还有其他动作。如果没有,游戏结束。
我目前写的程序结构是:
生成二维数组。
写了4个函数来移动数组中的数字。 (MoveUP,MoveDown,MoveLeft,Move Right)。
写了4个函数来移动后加上数字。 (AddUp,AddDown,AddLeft,AddRight)。
再次调用移动功能,在添加后重新排列表格。
打印矩阵并等待用户进行下一次移动。
这是我现在的代码的一部分:
代码有点长。
现在我无法找到一种方法来弹出一个' 2'在每次移动后的随机零区块上。任何帮助表示赞赏。
我也愿意接受现有代码的建议。如果你需要整个代码,我也可以给你。
#include<stdio.h>
#include<stdlib.h>
/* The main matrix */
int a[4][4];
/* <- Function declarations begin -> */
void InitMat(int a[4][4]);
void PrintMat(int a[4][4]);
void MoveUp(int a[4][4]);
void MoveLeft(int a[4][4]);
void MoveRight(int a[4][4]);
void MoveDown(int a[4][4]);
void AddUp(int a[4][4]);
void AddDown(int a[4][4]);
void AddLeft(int a[4][4]);
void AddRight(int a[4][4]);
/* -> Function declarations end <- */
/* <- Main function begin -> */
int main(void)
{
int input;
/* Initialize the starting matrix */
InitMat(a);
/* Display the main matrix */
PrintMat(a);
while ((input = getchar()) != 'q')
{
switch (input)
{
case 'w':
MoveUp(a);
AddUp(a);
MoveUp(a);
PrintMat(a);
break;
case 'a':
MoveLeft(a);
AddLeft(a);
MoveLeft(a);
PrintMat(a);
break;
case 'd':
MoveRight(a);
AddRight(a);
MoveRight(a);
PrintMat(a);
break;
case 's':
MoveDown(a);
AddDown(a);
MoveDown(a);
PrintMat(a);
break;
}
}
return 0;
}
/* -> Main function end <- */
/* <- Function definitions begin -> */
/* Function1: initializing the main matrix */
void InitMat(int a[4][4])
{
int i, j;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
a[i][j] = 0;
}
}
a[1][2] = a[2][2] = 2;
a[0][0] = 2;
a[3][0] = 2;
a[3][3] = 2;
}
/* Function2: Print the main matrix */
void PrintMat(int a[4][4])
{
printf("+-------+-------+-------+-------+\n");
printf("| %d | %d | %d | %d |\n", a[0][0], a[0][1], a[0][2], a[0][3]);
printf("+-------+-------+-------+-------+\n");
printf("| %d | %d | %d | %d |\n", a[1][0], a[1][1], a[1][2], a[1][3]);
printf("+-------+-------+-------+-------+\n");
printf("| %d | %d | %d | %d |\n", a[2][0], a[2][1], a[2][2], a[2][3]);
printf("+-------+-------+-------+-------+\n");
printf("| %d | %d | %d | %d |\n", a[3][0], a[3][1], a[3][2], a[3][3]);
printf("+-------+-------+-------+-------+\n");
}
/* Function3: Move upwards */
void MoveUp(int a[4][4])
{
int j;
/* i: rows; j: columns */
for (j = 0; j < 4; j++)
{
if (a[0][j] == 0)
{
if (a[1][j] == 0)
{
if (a[2][j] == 0)
{
if (a[3][j] == 0)
{
}
else
{
a[0][j] = a[3][j];
a[3][j] = 0;
}
}
else
{
a[0][j] = a[2][j];
a[2][j] = 0;
}
}
else
{
a[0][j] = a[1][j];
a[1][j] = 0;
}
}
else
{
a[0][j] = a[0][j];
}
if (a[1][j] == 0)
{
if (a[2][j] == 0)
{
if (a[3][j] == 0)
{
}
else
{
a[1][j] = a[3][j];
a[3][j] = 0;
}
}
else
{
a[1][j] = a[2][j];
a[2][j] = 0;
}
}
else
{
a[1][j] = a[1][j];
}
if (a[2][j] == 0)
{
if (a[3][j] == 0)
{
}
else
{
a[2][j] = a[3][j];
a[3][j] = 0;
}
}
else
{
a[2][j] = a[2][j];
}
}
}
/* Function7: addition after moving up */
void AddUp(int a[4][4])
{
int i, j;
/* i: rows; j: columns */
for (j = 0; j < 4; j++)
{
for (i = 0; i < 4; i++)
{
if (a[i][j] == a[i + 1][j])
{
a[i][j] += a[i + 1][j];
a[i + 1][j] = 0;
}
else
{
}
}
}
答案 0 :(得分:1)
您可以使用函数rand()
生成0和maxint值之间的随机值。
你必须做这样的事情:
#define MAXRANDOMVALUE 3
/.../ //functions and everything
void poprandomtwo() {
int i,j; //your indexs
i=(rand ())%(MAXRANDOMVALUE+1));
j=(rand ())%(MAXRANDOMVALUE+1));
/../ //here comes your job ;)
}
int main {
srand(time(NULL)); //do this one time at the beginning of your code to set the seed
/.../
return 0;
}
希望有所帮助