0

我正在做这个老虎机游戏,其中使用随机字母生成 3x3 2D 阵列。我已经成功地让游戏按我的意愿运行,但我想知道你是否有任何关于如何优化或改进我的代码的提示。

我让我的代码要做的事情:

  • 生成一个二维数组 (3x3) 并随机分配 3 个字母中的字符。
  • 一个“if”,它将比较并查看数组中的哪些元素属于彼此(彼此相邻的相同字符用于获取列/行/对角线)。
  • 一个“if else”,它将根据老虎机中的总行数和下注来获取列/行/对角线的总数并从中获得奖品。

所以我现在想知道您是否对如何改进程序检查是否有任何行/列/对角线的“if”代码有任何建议?游戏可以正常运行,但我只是想知道是否有任何优化它的方法 - 也许使用“for-loop”?我还想知道您是否对“奖品”代码有任何提示,其中代码计算行/列/对角线的总数量并将其与赌注相乘。

我的意思是,必须有一种方法来优化它。如果我要做一个 100x100 数组,比较元素的代码会非常长:) 我是 C++ 新手(这是一门课程),所以我期待着优化它。

PS!我不是在寻求解决方案,而是我可以用来优化它的方法的建议/提示。这是一个家庭作业,所以没有解决方案,只有建议/提示!

我的数组比较和奖金计算代码:

4

5 回答 5

0

在速度方面,你所拥有的不会是低效的。如果您希望概括代码并使其可扩展(例如,如果您想再添加 2 行/列),您可以做几件事(例如循环和更数学形式的奖品计算)。

循环已经讨论过了,但奖金计算可以使用以下内容稍微简化:

if (rows > 0 && rows < SOMEMAXIMUMVALUE)
{
    prize = g_satsning * (1 << rows);
}
else
{
    prize = 0;
}

由于您的乘数是 2 的指数,因此数学相当简单。 SOMEMAXIMUMVALUE应该声明为您期望的最大匹配行数。对于 3x3 设置,将有 8 个潜在匹配项(3 行、3 列、2 条对角线),因此SOMEMAXIMUMVALUE应设置为 8。

于 2013-08-14T19:06:40.437 回答
0

取决于您提到的数组大小。对于小数组,if语句可能比使用循环(或两个嵌套)遍历所有元素更有效(这也称为“循环展开”,被认为是性能改进)。

要为任何数组大小“优化”(我最好说泛化)您的代码,您for当然应该使用循环来迭代 x/y 索引。

于 2013-08-14T18:33:14.873 回答
0

为了进行优化,运行分析器会为您提供大量信息。如果您谈论的是优化应用程序的一般准则,这里有一些:

1 - 使用线程并行处理

2 - 通过根据对其进行的处理保持数据正确对齐来减少缓存未命中。例如,如果您需要使用速度来处理位置,让它们在内存中彼此靠近将减少缓存未命中。

IE:

struct Particle 
{
   float position;
   float speed;
};
Particle particles[NUM_PARTICLES];

对比

float positions[NUM_PARTICLES];
float speeds[NUM_PARTICLES];

3-不要处理你不需要处理或用户看不到的东西。例如,有些东西可能不会影响当前状态 - 不需要处理它(在图形中,我们使用像八叉树这样的场景管理,但同样适用于所有 - 如果你不需要它,不要处理它)。

4-减少浮点运算量。

另请参阅这篇文章 - 它提供了一些很好的 C++ 优化参考:C++ 优化技术

于 2013-08-14T18:33:49.770 回答
0

完成代码:

//Check all horiztonal and vertical locations
for(int i = 0; i <= 2; i++)
    {
    if(matris[i][0] == matris[i][1] && matris[i][1] == matris[i][2])
        rows++;
    if(matris[0][i] == matris[1][i] && matris[1][i] == matris[2][i])
        rows++;
    }

//Now check diagonals
if(matris[0][0] == matris[1][1] && matris[1][1] == matris[2][2])
if(matris[0][2] == matris[1][1] && matris[1][1] == matris[2][0])

//Calculate prize
prize = g_satsning*(1 << rows);
于 2013-08-14T18:47:14.773 回答
0

关于优化:

  1. 不要过早地优化——它不会有任何帮助。我懒得写这个,但是搜索互联网,阅读“代码完整”和“C++ 编码标准:101 条规则、指南和最佳实践”书籍。
  2. 不要浪费 - 如果优化不会花费更多时间并且处于相同的可读性级别,那么您可以使用它。
  3. 出现速度问题后进行优化。

关于你的问题:

您绝对正确,应该有更好的方法来编写代码。你写的是工人所做的,但你需要成为聪明的程序员才能让它更容易。

但是你需要的是更多关于语言的知识。

是的,C++ 有循环的可能性。例如以下代码检查一行是否包含相同的值:

const int rowCount = 3; // Number of rows
const int colCount = 3; // Number of columns

// Variable for counting same rows
int sameRowsCount = 0;

// Following line is loop: first it sets variable row to 0
// and for each pass it increments it until rowCount is reached
for(int row = 0; row < rowCount; ++row)
{
    // This variable stores whether the row contains same values.
    // At beginning we assume that it does.
    bool isSame = true;

    // Now we will check each column in current row. Note that
    // we begin with 1 and not 0 - at 0 position is value which
    // we check against all others.
    for(int col = 1; (col < colCount) && isSame; ++col)
    {
        if(matrix[0] != matrix[col])
        {
            // We found different values
            isSame = false;
        }
    }

    // If row contains same values, isSame remained true and
    // we increment same-rows counter.
    if(isSame)
    {
        ++sameRowsCount;
    }
}

cout << "Number of same rows: " << sameRowsCount << "." << endl;
于 2013-08-14T18:54:31.233 回答