0

私は、4 x 4 の数独ゲームを作成し、プレーヤーに不足している数字を再生グリッドに入力させる処理スケッチを作成する割り当てを持っています。私が現在直面している問題は、プレーヤーがループまたは何かを実行できるようにすることです不足しているすべての数字を入力しますか? switch ステートメントと if ステートメントを使用してプレーヤーが最初の 4 つの数字を入力できるようにすることに成功しましたが、プログラムは各ケースの最初の if ステートメントのみを通過し、残りを通過させたいですか? これが私が作る鱈です。

void setup ()
{
  background (255);
  size (125,125);
  board();
}

void cell (int x , int y , int s )
{
  rect (x,y,s,s);
}

void triple (int x , int y , int s )
{
  for (int i = 0 ; i < 2 ; i ++)
  {
    cell ( x,y,s);
    x += s;
  }
}

void block (int x , int y , int s )
{
  for (int i = 0 ; i < 2 ; i ++)
  {
    triple ( x , y , s);
    y += s;
  }
}

void row (int x , int y , int s )
{
  for ( int i = 0 ; i < 2 ; i ++)
  {
    block ( x , y , s);
    x += (s*2);
  }
}

void cellArray ( int x , int y , int s)
{
  for (int i = 0 ; i < 2 ; i ++)
  {
    row ( x , y , s);
    y += (s*2);

  }
}

void darwLines ( int x , int y , int s)
{
  strokeWeight (3);

  for (int i = 0 ; i < 1 ; i ++)
  {
    x += (s*2);
    line ( x , 0 , x , (s*4));
  }

  for ( int j = 0 ; j < 1 ; j ++)
  {
    y += (s*2);
    line ( 0 , y , (s*4) , y );
  }

  strokeWeight (1);
}

void board ()
{
  cellArray (0,0,30);
  darwLines (0,0,30);
}

void draw ()
{
   int [][] fixedArray = new int [4][4];
   fill (0);
   textSize(28);
    for (int i = 0 ; i < 4 ; i ++)
    {
      for (int j = 0 ; j < 4 ; j ++)
      {
        fixedArray [0][2] = 3; 
        fixedArray [1][1] = 4; 
        fixedArray [2][2] = 4;
        fixedArray [3][3] = 3;

        text(fixedArray [0][2], 65,25);
        text(fixedArray [1][1],35,58);
        text(fixedArray [2][2],65,88);
        text(fixedArray [3][3],95,117);
      }//end of inner loop.
    }//end of outter loop.

  if (mousePressed)
  {
    mouseClicked ();
  }
}
/*------------------------------------------------------------------------------------------*/
void mouseClicked ()
{
  int s = 30 ; 
  int cellX = mouseX / s;
  int cellY = mouseY / s;


  int [][] userInputArray = new int [4][4];



  for (int m = 0 ; m < 4 ; m ++)
  {
    for (int n = 0 ; n < 4 ; n ++)
    {

      switch (key)
     {
        case '1':

          if (mouseX > userInputArray [0][0] -s && mouseX < userInputArray [0][0]+s && mouseY > userInputArray [0][0] -s && mouseY < userInputArray [0][0] +s )
          {
            fill (0,0,255);
            text (key , 10,25);

          }

          else  if (mouseX > userInputArray [1][2] -30 && mouseX < userInputArray [1][2]+30 && mouseY > userInputArray [1][2] -30 && mouseY < userInputArray [1][2] +30)
             {
               fill (0,0,255);
               text ('1' , 65,58);
             }




          else  if (mouseX > userInputArray [2][3] -30 && mouseX < userInputArray [2][3]+30 && mouseY > userInputArray [2][3] -30 && mouseY < userInputArray [2][3] +30)
            {
              fill (0,0,255);
              text('1' ,95,88);
            }



         else   if (mouseX > userInputArray [3][1] -30 && mouseX < userInputArray [3][1]+30 && mouseY > userInputArray [3][1] -30 && mouseY < userInputArray [3][1] +30)
            {
              fill (0,0,255);
              text('1' ,35,117);
            }

          break ; 


          case '2':

            if (mouseX > userInputArray [0][1] -(s-s) && mouseX < userInputArray [0][1]+(s*2) && mouseY > userInputArray [0][1] -s && mouseY < userInputArray [0][1] +s )
            {
              fill (0,0,255);
              text(key ,35,25);
            }
           else  if (mouseX > userInputArray [1][3] - (s-s) && mouseX < userInputArray [1][3] +(s*2) && mouseY > userInputArray [1][3] -(s*2) && mouseY < userInputArray [1][3] +(s*2))
            {
              fill(0,0,255);
              text(key,95,58);
            }
           else  if (mouseX > userInputArray [2][0] -(s-s) && mouseX < userInputArray [2][0] +(s*2) && mouseY > userInputArray [2][0] -(s*2) && mouseY < userInputArray [2][0] +(s*2))
            {
              fill(0,0,255);
              text(key,10,88);
            }
            else if (mouseX > userInputArray [3][2] -(s-s) && mouseX < userInputArray [3][2] +(s*2) && mouseY > userInputArray [3][2] -(s*2) && mouseY < userInputArray [3][2] +(s*2))
            {
              fill(0,0,255);
              text(key,65,117);
            }

          break;

          case '3':

            if ( mouseX > userInputArray [1][0] -s && mouseX < userInputArray [1][0]+s && mouseY > userInputArray [1][0] -(s-s) && mouseY < userInputArray [1][0] +(s*2))
            {
              fill(0,0,255);
              text(key,10,58);
            }
            else if (mouseX > userInputArray [2][1] -s && mouseX < userInputArray [2][1]+s && mouseY > userInputArray [2][1] -(s-s) && mouseY < userInputArray [2][1] +(s*2))
            {
              fill(0,0,255);
              text(key,35,88);
            }

          break ;

          case '4':

            if (mouseX > userInputArray [0][3] +60 && mouseX < userInputArray [0][3]+120 && mouseY > userInputArray [0][3] -30 && mouseY < userInputArray [0][3] +30 )
            {
              fill(0,0,255);
              text(key,95,25);
            }

           else if (mouseX > userInputArray [3][0] +60 && mouseX < userInputArray [3][0]+120 && mouseY > userInputArray [3][0] -30 && mouseY < userInputArray [3][0] +30 )
            {
              fill(0,0,255);
              text(key,10,117);
            }
          break;

          default :
          {
            fill (255);
            rect ((cellX * s),(cellY*s),s,s);
          }
      }//end of switch.

    }//end of the inner loop.
  }//end of the outter for loop.
}
4

1 に答える 1

0

私はあなたのコードを調べて、いくつかの問題を観察しました:

  • まず、コードが非常に面倒です。drawlines + cellArray + row + ... は、そのような複雑な関数のネストを必要とせずに、はるかにエレガントに解決できます。

  • どうやら、fixedArray を常に一定のままにしたいようです。したがって、描画ループごとに定義して値を割り当てる必要はありません。その宣言をコードの先頭に移動できます。

  • userInputArray でも同じことが起こります。値はどこにも定義されていないため、0 に等しくなります。

  • それぞれの数字をそれ自体の上に 16 回描画しているため、非常にぎこちなく見えます... テキストを描画するときにネストされた for ループは必要ありません。

これは、強化されたコードの提案を添付して見つけてください。すべての問題が修正され、数独のサイズと位置を変更する必要がある場合はより柔軟になり、一般的にコードの一貫性が向上します。

それにもかかわらず、これを本当に面白くしたい場合は、すべての数独が前のものとは異なるように、ランダムな値を生成する方法を見つけてみてください! オンラインには数独生成アルゴリズムがたくさんあります。

幸運を!

// GLOBAL VARS DECLARATION
int[][] resultsValue = {
  {1,2,3,4},
  {3,4,1,2},
  {2,3,4,1},
  {4,1,2,3}};
boolean[][] resultsSolved = new boolean[4][4];
int cellsX = 4;
int cellsY = 4;
float cellSize = 30; 
float xPos = 0;
float yPos = 0;

void setup ()
{
  background (255);
  size (130, 130);
  smooth();

  // GLOBAL VARS VALUE ASSIGNMENT            
  resultsSolved[0][2] = true;
  resultsSolved[1][1] = true;
  resultsSolved[2][2] = true;
  resultsSolved[3][3] = true;
}

void draw ()
{
  background(255);

  drawBoard(cellsX, cellsY, cellSize, xPos, yPos, 2);

  pushStyle();
  fill (0);
  textSize(28);

  for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 4; j++) {
      if (resultsSolved[i][j] == true) {
         text(resultsValue[i][j], 5 + xPos + j * cellSize, -5 + yPos + (i + 1) * cellSize);
      }
    }
  }

  popStyle();

  if (mousePressed)
  {
    mouseClicked ();
  }

}

/*------------------------------------------------------------------------------------------*/

void drawBoard(int rows, int cols, float cellSize, float xPos, float yPos, int cellBlocks) {
  pushStyle();
  noFill();
  stroke(0);
  strokeWeight(1);

  // DRAW RECTANGLES
  for (int i = 0; i < cols; i++) {
    for (int j = 0; j < rows; j++) {
      rect(xPos + i * cellSize, yPos + j * cellSize, cellSize, cellSize);
    }
  }

  strokeWeight(3);

  // DRAW LINES
  for (int i = 0; i < cols / cellBlocks; i++) {
      line(xPos + i * cellSize * cellBlocks, yPos, xPos + i * cellSize  * cellBlocks, yPos + rows * cellSize); 
  }
  for (int i = 0; i < rows / cellBlocks; i++) {
      line(xPos, yPos + i * cellSize * cellBlocks, xPos + cols * cellSize, yPos + i * cellSize * cellBlocks); 
  }

  popStyle();
} 

void mouseClicked ()
{
  int cellX = (int) ((mouseX - xPos) / cellSize); 
  if (cellX > cellsX - 1) cellX = cellsX - 1;
  else if (cellX < 0) cellX = 0;

  int cellY = (int) ((mouseY - yPos) / cellSize); 
  if (cellY > cellsY - 1) cellY = cellsY - 1;
  else if (cellY < 0) cellY = 0;

  int lastKeyInt = int(key - '0');

  if (resultsValue[cellY][cellX] == lastKeyInt) {
    resultsSolved[cellY][cellX] = true;
  }
}
于 2013-01-17T17:16:41.893 に答える