2017-12-11 8 views
0

現在、GomokuゲームではMFCを使用しています。現在、対角線の勝利アルゴリズムに取り組んでいます。私の水平と垂直の仕事は大丈夫です。誰かが私の論理が間違っているところで明るさを少しでも助けてくれることを願っています。コードは次のとおりです。ゴモク対角勝利条件

bool CMainFrame::isWinner(int player){ 
for (int row = 0; row < data.size(); row++) { 
    for (int col = 0; col < data.size(); col++) { 
     if (data[row][col].color == player && data[row + 1][col + 1].color == player && data[row + 2][col + 2].color == player && data[row + 3][col + 3].color == player && data[row + 4][col + 4].color == player) { 
      CheckForGameOver(player); //function that simply shows message box of winning piece 
      return true; 
     } 
    } 
} 
} 

左上隅に接続されている対角線でのみ動作します。かなりプログラミングに新しいので、どんな助けも大いに評価されるでしょう。

+2

ループでは「15」のような数字を使用しないでください。意味のある名前付き定数を使用するか、データのサイズから値を派生させてください。 Goボードは19 x 19ですので、あなたのテストは限界にとどまっていません。応答のために – stark

+0

ありがとう。私のボードは15 X 15です。ああ、私はちょうど私のdata.size()を編集しました。私は自分のコードで使っていますが、それでも何も変えていないようです。 – Elijah

+0

あなたは間違いなく外出しています。 – stark

答えて

1

このゲームのルールでは、5つのアイテムが一列に、列に、または対角線に一致する必要があります。それぞれの行、列、対角線を比較して5つの項目が一致するかどうかを確認し、真を返します。それ以外の場合、関数はfalseを返す必要があります。

bool won(std::vector<std::vector<data_t>> &data, int color) 
{ 
    //check each row: 
    for(int row = 0; row < 15; row++) 
     for(int col = 0; col < 10; col++) 
     { 
      bool match = true; 
      for(int i = 0; i < 5; i++) 
       if(color != data[row][col + i].color) 
        match = false; 
      if(match) return true; 
     } 
    //check each column: 
    for(int col = 0; col < 10; col++) 
     for(int row = 0; row < 15; row++) 
     { 
      bool match = true; 
      for(int i = 0; i < 5; i++) 
       if(color == data[row + i][col].color) 
        match = false; 
      if(match) return true; 
     } 
    //check diagonal lines from top-left to bottom-right 
    for(int col = 0; col < 10; col++) 
     for(int row = 0; row < 10; row++) 
     { 
      bool match = true; 
      for(int i = 0; i < 5; i++) 
       if(color == data[row + i][col + i].color) 
        match = false; 
      if(match) return true; 
     } 
    //lastly check diagonal lines from top-right to bottom-left 
    return false; 
}