0

2人の競技者間のレースをシミュレートするのに問題があります。これは、乱数ジェネレーターを使用して、競合他社が使用する「動き」を判断する典型的なレースプログラムです。以下の私のコードに見られるように、トラックは50個の長方形で構成されており、塗りつぶされた長方形は、トラック上の各競技者の位置を示しています。たとえば、一部の「移動」により、競技者は右に9マス、または2マス後ろにジャンプします。アプレットを実行すると、最初の開始位置のみが表示されます。アプレットは機能しません。たくさんのコードがあることに気づきましたが、問題を解決するにはどうすればよいですか?私はこの時点で本当に立ち往生しています。どんな助けでも大歓迎です。私はAWTしか使用できず、swingは使用できません。これはクラスの割り当てです:/コードは次のとおりです。

import java.awt.*;
import java.applet.*;


    public class Example extends Applet
    {
        Image tortoise, hare;
        int tortX = 250, hareX = 250; 
        final int tortY = 100, hareY = 300, WIDTH = 15, HEIGHT = 50;
        int turn; String turnNum;
        int move; String tMove, hMove;

        public void init()
        {
            tortoise = getImage( getDocumentBase(), "images/tortoise.gif" );
            hare = getImage( getDocumentBase(), "images/hare.gif" );
            move = 0; turn = 0;
        }


        public void control()
        {
            while (( tortX < 985 ) || ( hareX < 985 ))
            {
                move = (int)(10 * Math.random());
                switch (move)
                {
                    case 1:
                    case 2:
                        tortX += (3 * WIDTH);
                        hareX += (9 * WIDTH);
                        tMove = "Fast Plod"; hMove = "Big Hop";
                        break;
                    case 3:
                    case 4:
                    case 5:
                        tortX += (3 * WIDTH);
                        hareX += WIDTH;
                        tMove = "Fast Plod"; hMove = "Small Hop";
                        break;
                    case 6:
                        tortX += WIDTH;
                        if (hareX == 250) {} // DO NOTHING
                        else if (hareX <= (250 + (11 * WIDTH)))
                            hareX = 250;
                        else 
                            hareX -= (12 * WIDTH);
                        tMove = "Slow Plod"; hMove = "Big Slip";
                        break;
                    case 7:
                    case 8:
                        tortX += (1 * WIDTH);
                        if (hareX == 250) {} // DO NOTHING
                        else if (hareX <= (250 + (WIDTH)))
                            hareX = 250;
                        else 
                            hareX -= (2 * WIDTH);
                        tMove = "Slow Plod"; hMove = "Small Slip";
                        break;
                    case 9:
                    case 10:
                        if (tortX == 250) {} // DO NOTHING
                        else if (tortX <= (250 + (5 * WIDTH)))
                            tortX = 250;
                        else 
                            tortX -= (6 * WIDTH);
                        tMove = "Slip"; hMove = "Fall Asleep. Zzz...";
                        break;
                        // Hare falls asleep. No action. 
                }

                turn++; turnNum = (turn + "");
                repaint();
                for (int i = 1; i <= 10; i++)
                {
                    delay();
                }
            }

            tortX = 985; hareX = 985;
            repaint();
        }

        public void paint( Graphics screen )
        {
            drawRace(screen);

            if (tortX >= 985)
            {
                screen.setFont(new Font("Times New Roman", Font.ITALIC, 48));
                screen.drawString("Tortoise Wins", 650, 240);
                clearCurrent(screen); 
                fillNext(screen);
            }
            else if (hareX >= 985)
            {
                screen.setFont(new Font("Times New Roman", Font.ITALIC, 48));
                screen.drawString("Tortoise Wins", 650, 240);
                clearCurrent(screen); 
                fillNext(screen);
            }
            else
            {       
                screen.drawString(("Turn " + turnNum), 621, 55);
                screen.setFont(new Font("Times New Roman", Font.ITALIC, 12));
                screen.drawString(tMove, 59, 65); screen.drawString(hMove, 66, 255); 
                clearCurrent(screen);
                fillNext(screen);
            }

            stop();
        }

        public void clearCurrent( Graphics s )
        {
            s.clearRect(tortX+1, tortY+1, WIDTH-1, HEIGHT-1);
            s.clearRect(hareX+1, hareY+1, WIDTH-1, HEIGHT-1);

        }

        public void fillNext( Graphics s )
        {
            s.fillRect(tortX+1, tortY+1, WIDTH-1, HEIGHT-1);
            s.fillRect(hareX+1, hareY+1, WIDTH-1, HEIGHT-1);

        }

        public void drawRace( Graphics s )
        {
            // GENERATES INITIAL GRAPHICS FOR RACE
            s.drawRect(250, 100, 750, 50);
            s.drawRect(250, 300, 750, 50);
            int lineX = 265, lineYi = 100, lineYf = 150;
            for (int i = 1; i <= 98; i++)
            {
                if (lineX == 1000)
                {
                    lineX = 265; lineYi = 300; lineYf = 350;
                }
                s.drawLine(lineX, lineYi, lineX, lineYf);
                lineX += 15;
            }
            s.fillRect(tortX+1, tortY+1, WIDTH-1, HEIGHT-1);
            s.fillRect(hareX+1, hareY+1, WIDTH-1, HEIGHT-1);
            s.drawImage(tortoise, 59, 80, this);
            s.drawImage(hare, 66, 271, this);
            s.setFont(new Font("Times New Roman", Font.BOLD, 24));
            s.drawString("Race", 250, 55);
        }

        public void delay()
        {
            for (int i = 0; i < 90000000; i++)
            {
            }
        }

        public void stop()
        {
        }
    }
4

1 に答える 1

3

最初の問題は、実際には決してレースを「開始」しないことです...initアプレットを確認してください。しかし、その後は何も...

2番目の問題は、controlメソッドがイベントディスパッチスレッドをブロックすることです。つまり、このメソッドを使用している間は、画面に何もペイントされません。これは、イベントディスパッチスレッドが再描画要求のディスパッチも担当しているためです。

3番目の問題は、連絡先に違反していることpaintです。あなたには呼び出す責任がありますsuper.paint(screen)-ペイントは複雑な方法であり、本当に正当な理由がない限り、決して無視してはなりません。

4番目の問題は、のApplet代わりにを使用することですJApplet。Swingコントロールを優先して、AWTコントロールを無視することをお勧めします。スイングはより柔軟で、簡単に伸ばすことができます。

5番目の問題は、トップレベルのコンテナにペイントすることです。これは決してお勧めできません。のようなものを使用して、そのメソッドJPanelをオーバーライドすることをお勧めしますpaintComponent(呼び出すことを忘れないでくださいsuper.paintComponent)。他のすべてとは別に、それは二重にバッファリングされ、画面が更新されるときにフリックを減らします。

を見てみましょう...

于 2013-01-10T22:41:59.240 に答える