优化我的代码? C ++比较数组&计算奖金

时间:2013-08-14 18:23:02

标签: c++ arrays optimization 2d

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

我的代码要做什么:

  • 生成2D数组(3x3)并随机分配3个字符 字母。
  • 将比较并查看数组中的元素所属的“if” 相互之间相同的字符(彼此相邻的字符) 列/行/对角线)。
  • “if else”将占用列/行/对角线的总量 并根据行中的总行数从中奖励 老虎机和赌注。

所以我现在想知道你是否有任何关于如何改进“if”代码的建议,程序会检查是否有行/列/对角线?游戏的工作原理应该如此,但我只是想知道是否有任何优化方法 - 也许是“for-loop”? 我也想知道你是否有关于“奖品”代码的任何提示,其中代码计算行/列/对角线的总数,并将其与赌注相乘。

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

PS!我不是要求解决方案,而是我可以用来优化它的方法的建议/提示。 这是一个功课,所以没有解决方案,只有建议/提示!

我的阵列比较和奖金计算代码:

5 个答案:

答案 0 :(得分:0)

取决于您提到的数组大小。对于小数组,if语句可能比使用循环(或两个嵌套)迭代所有元素更有效(这也称为'loop unrolling',并且被认为是性能改进)。

对于任何数组大小的“优化”(我更好地说概括)您应该使用for循环来迭代x / y索引。

答案 1 :(得分:0)

要进行优化,运行探查器会为您提供大量信息。如果您正在讨论优化应用程序的一般指导原则,请参阅以下内容:

1 - 使用线程并行处理

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

即:

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

VS

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

3-不要处理您不需要处理或用户看不到的内容。例如,某些东西可能不会影响当前状态 - 不需要处理它(在图形中,我们使用类似octtrees的场景管理,但同样适用于所有 - 如果你不需要它,不要处理它)。 / p>

4-减少浮点运算量。

请参阅这篇文章 - 它提供了一些优化的C ++参考资料:C++ Optimization Techniques

答案 2 :(得分: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);

答案 3 :(得分:0)

关于优化:

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

    你应该有更好的方法来编写代码,这是完全正确的。你写的是工人的工作,但你需要聪明的程序员才能让它变得更容易。

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

    是的,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;
    

答案 4 :(得分:0)

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

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

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

由于您的乘数是2的指数,因此数学是相当直接的。应将SOMEMAXIMUMVALUE声明为您期望的最大匹配行数。对于3x3设置,将有8个可能的匹配(3行,3列,2个对角线),因此SOMEMAXIMUMVALUE应设置为8。