2

そこで、Java を使用してゲーム Snake を再作成しようとしてきましたが、よくわからない問題に遭遇しました。

プログラムの基本は、プレイヤーがどの方向を選択したかを 1 秒間隔でチェックする無限ループがあることです。プレーヤーはいつでも「int 方向」の値を変更するボタンを押すことができますが、ヘビはループのタイマーが切れた後にのみその方向に移動します。

私が抱えている問題は、プログラムの実行中にボタンをクリックして方向を変更しても何も起こらないことです。方向の変更は、プログラムが終了してから有効になり、プレイヤーはヘビの動きを誘導できなくなります。

できればプログラム全体を再設計することなく、この問題を修正できる方法はありますか? . . .

変数の定義: グリッドの空の部分には値 0 が割り当てられ、ヘビが占める部分には値 1 が割り当てられます。

public static int x = 5;
public static int y = 5;

public static int grid[][] = new int[11][11];

public static int snakeLength = 1;

public static boolean alive = true;

public static int direction = 1;



public void paint(Graphics g)
{
            for(int r = 0; r<11; r++)
            {
                    for(int e = 0; e<11; e++)
                    {
                            grid[r][e] = 0;
                    }
            }



        grid[5][5] = 1;

ヘビの方向を理論的に変更するために使用するボタン

                Rectangle up = new Rectangle(250,550,50,50);
                Rectangle down = new Rectangle(250,650,50,50);
                Rectangle left = new Rectangle(200,600,50,50);
                Rectangle right = new Rectangle(300,600,50,50);

        g.setColor(Color.black);
        g.fillRect(250,550,50,50);
        g.fillRect(250,650,50,50);
        g.fillRect(200,600,50,50);
        g.fillRect(300,600,50,50);     

}

次の動きを決める無限ループと一連の分岐ループ

上: 方向 = 1

下: 方向 = 2

左: 方向 = 3

右: 方向 = 4

  while(alive == true)
  {
                   try 
                   {
                   Thread.sleep(1000);
                   } 
                   catch(InterruptedException ex) 
                   {
                   Thread.currentThread().interrupt();
                   }


        if(direction == 1)
        {
            if(grid[x][y - 1] == 0)
            {
                moveUp(g);

            }

            if(y  == -1)
            {
                fail(g);

            }

            if(grid[x][y - 1] == 1)
            {
                fail(g);

            }

            if(grid[x][y - 1] == 2)
            {
                y = y-1;
                food(g);

            }
        }
        if(direction == 2)
        {
            if(grid[x][y + 1] == 0)
            {

                moveDown(g);
            }

            if(y  == 11)
            {
                fail(g);
            }

            if(grid[x][y + 1] == 1)
            {
                fail(g);
            }

            if(grid[x][y + 1] == 2)
            {
                y = y+1;
                food(g);
            }
        }

        if(direction == 3)
        {
            if(grid[x - 1][y] == 0)
            {
                moveLeft(g);
            }

            if(x  == -1)
            {
                fail(g);
            }

            if(grid[x - 1][y] == 1)
            {
                fail(g);
            }

            if(grid[x - 1][y] == 2)
            {
                x = x-1;
                food(g);
            }
        }

        if(direction == 4)
        {
            if(grid[x + 1][y] == 0)
            {
                moveRight(g);
            }

            if(x == 11)
            {
                fail(g);
            }

            if(grid[x + 1][y] == 1)
            {
                fail(g);
            }

            if(grid[x + 1][y] == 2)
            {
                x = x+1;
                food(g);
            }
        }


    }

悩んでいる方法。プログラムが終了するまで方向の値を変更しないようです

public boolean mouseDown(Event e, int x, int y)
{
   if(up.inside(x,y))
   {
    direction = 1;
    System.out.println(direction);

   }
   if(down.inside(x,y))
   {
    direction = 2;
    System.out.println(direction);

   }
   if(left.inside(x,y))
   {
    direction = 3;
    System.out.println(direction);

   }
   if(right.inside(x,y))
   {
    direction = 4;
    System.out.println(direction);

   }

   return true;

}

簡潔にするために残りのコードを省略しましたが、実際に関連する場合は提供できます。

前もって感謝します。

4

0 に答える 0