1

現在、グリッドとグリッド内のドット間に描画される線を含むプログラムがあります。標準ドローを使用します。ラインの長さを制限して、隣接するポイントからのみ移動できるようにしたいのですが、これを行う方法がわかりません。

ありがとう

StdDraw.setCanvasSize(400, 400);
StdDraw.setXscale(0, 10);
StdDraw.setYscale(0, 10);      

//dots
double radius = .15;
double spacing = 2.0;

for (int i = 0; i <= 4; i++) {
    for (int j = 0; j <= 4; j++) {
        StdDraw.setPenColor(StdDraw.GRAY); 
        StdDraw.filledCircle(i * spacing, j * spacing, radius );
    }
}
StdDraw.setPenColor(StdDraw.BLUE); 
StdDraw.text(0, 9.5, player1_name);
StdDraw.setPenColor(StdDraw.RED); 
StdDraw.text(5, 9.5, player2_name);
int turn = 1;
     for (int i = 0; i <= 40; i++) { 
         if (turn % 2 == 0)
           StdDraw.setPenColor(StdDraw.RED);
         else
           StdDraw.setPenColor(StdDraw.BLUE);

         while(!StdDraw.mousePressed()) { }
         double x = StdDraw.mouseX();
         double y = StdDraw.mouseY();
   System.out.println(x + " " + y);
         StdDraw.setPenRadius(.01);
         StdDraw.show(200); 
               while(!StdDraw.mousePressed()) { }
               double x2 = StdDraw.mouseX();
               double y2 = StdDraw.mouseY();
               StdDraw.show(200); 
double xround = Math.round(x); 
double yround = Math.round(y);
double x2round = Math.round(x2);
double y2round = Math.round(y2);
  int xroundb = (int) xround; 
  int yroundb = (int) yround;
  int x2roundb = (int) x2round;
  int y2roundb = (int) y2round;
StdDraw.line(xround, yround, x2round, y2round);
System.out.println("Line Drawn"); 
StdDraw.show(); 
4

1 に答える 1

1

ああ、わかりました。line正しく機能する実際のメソッドについて質問しているわけでlineはありません。隣接するドットが選択されていない場合に呼び出されないようなロジックが必要です。

まず、どの隣接接続が許可されているかを知る必要があります。つまり、垂直にできますか?水平?対角線?念のため一つ一つ説明します

だからあなたは持っていspacing = 2.0ます。隣接関係を確認するには、これで十分なはずです。

if (Math.abs(x2round - xround) > spacing) {
   // don't draw
} else if (Math.abs(y2round - yround) > spacing)) {
   // don't draw
} else if (Math.abs(y2round - yround) > 0.0) && Math.abs(x2round - xround) > 0.0) {
   // don't draw if diagonal connections are forbidden
   // if diagonal is allowed, remove this else if condition
} else {
   StdDraw.line(xround, yround, x2round, y2round);
}

したがって、描画しない場合は、ゲーム ロジックを適用する必要があります。おそらく、プレイヤーはターンを失います。おそらく、プレーヤーには、隣接するドットを選択する別の機会が与えられます。それはあなた次第です。double を比較するのは丸めのためにいつも少しおかしいので、0.0 を使用する代わりに、非常に小さいイプシロン double 値を選択して、すべてのケースを確実にキャッチすることをお勧めします。

于 2013-01-04T20:38:51.770 に答える