砖破碎机随机颜色

时间:2016-05-28 22:22:21

标签: java

我遇到的问题是,当我运行游戏时,而不是保持随机颜色,当我在游戏中时,砖块会不断变换颜色。我如何解决这个问题,以便每块砖都保持一种颜色?

public class Game extends JoeApplet implements KeyListener
{
    String status;
    int ballx = 294; // ball spawn x coordinate
    int bally = 640; // ball spawn y coordinate
    int batx = 294; 
    int baty = 654;
    int brickx = 32;
    int bricky = 50;    
    double movex = -16;  // x speed of ball
    double movey = -16;  //y speed of ball
    int count = 0;
    int currentLevel=0;
    int score=0;      //starts score at 0
    int lives=3;      //lives start at 3
    static boolean right = false;
    static boolean left = false;
    boolean ballFallDown = false;
    boolean bricksOver = false;
    Rectangle Ball = new Rectangle(ballx, bally, 12, 12); //creates ball
    Rectangle Bat = new Rectangle(batx, baty, 100, 12);   //creates bat(paddle)
    Rectangle[] Brick = new Rectangle[49];    //creates desired number of bricks
    Random random = new Random();
    static final float MIN_SAT = 0.8f;
    Color color;

    public void paint(Graphics art)
    {
        switch(currentLevel)
        {
        case 0:
            menuScreen(art);
            break;
        case 1:
            game(art);
            break;
        }
    }
    public void menuScreen(Graphics art)
    {
         setSize(700, 700);
         art.setColor(Color.BLACK);
         art.fillRect(0, 0, 698, 698);
         Color ballcolor=new Color(0,0,66);
         art.setColor(ballcolor);
         art.fillOval(Ball.x, Ball.y, Ball.width, Ball.height);
         Color batcolor=new Color(0,0,66);
         art.setColor(batcolor);
         art.fill3DRect(Bat.x, Bat.y, Bat.width, Bat.height, true); 
         art.setColor(Color.green);
         art.drawRect(0, 0, 698, 698);
         art.setColor(Color.yellow);
         Font menu = new Font("Arial", Font.BOLD, 20);
         art.setFont(menu);
         art.drawString("Brick Breaker", 100,400);
         art.drawString("Press P to Play", 100,425);
         art.drawString("Press Q to Quit game", 100,450);
         for (int i = 0; i < Brick.length; i++) 
         {
             if (Brick[i] != null)
             {
                 Color mycolor=new Color(100,0,0);
                 art.setColor(mycolor);
                 art.fill3DRect(Brick[i].x, Brick[i].y, Brick[i].width,
                 Brick[i].height, true);
             }

         }
             art.setColor(Color.YELLOW);
             if (ballFallDown || bricksOver) 
             {
                 Font f = new Font("Arial", Font.BOLD, 20);
                 art.setFont(f);
                 art.drawString(status, 294, 349);
                 ballFallDown = false;
                 bricksOver = false;
             }      
    }
     private  Color color;

    class Brick {
        public  Color getColor() { return color; }
        public  Brick()
        {

            float hue = random.nextFloat();
            float saturation = MIN_SAT + random.nextFloat() * (1f - MIN_SAT);
            float brightness = MIN_SAT + random.nextFloat() * (1f - MIN_SAT);
            Color color = Color.getHSBColor(hue, saturation, 
            brightness);

        }
     }
    public void game(Graphics art) 
    {
         setSize(700, 700);
         art.setColor(Color.BLACK);
         art.fillRect(0, 0, 698, 698);
         Color ballcolor=new Color(0,0,225);
         art.setColor(ballcolor);
         art.fillOval(Ball.x, Ball.y, Ball.width, Ball.height);
         Color batcolor=new Color(0,0,139);
         art.setColor(batcolor);
         art.fill3DRect(Bat.x, Bat.y, Bat.width, Bat.height, true); 
         art.setColor(Color.green);
         art.drawRect(0, 0, 698, 698);
         for (int i = 0; i < Brick.length; i++) 
         {
             if (Brick[i] != null)
             {

                 art.setColor(Brick[i].getColor());
                 art.fill3DRect(Brick[i].x, Brick[i].y, Brick[i].width,
                 Brick[i].height, true);
             }

         }

             if (ballFallDown || bricksOver) 
             {
                 Font f = new Font("Arial", Font.BOLD, 20);
                 art.setFont(f);
                 art.drawString(status, 100,425);
                 ballFallDown = false;
                 bricksOver = false;
             }  

             for (int i = 0; i < Brick.length; i++)
             {
                    if (Brick[i] != null) 
                    {
                        if (Brick[i].intersects(Ball)) 
                        {
                            score=score+10;
                            Brick[i] = null;
                            movey = -movey;
                            count++;
                        }   
                    }
             }      


               if (count == Brick.length) 
               {
                   bricksOver = true;
                   movex=0;
                   movey=0;
                   art.setColor(Color.green);
                   status = "YOU BEAT THE LEVEL!!";
                   art.drawString("Press E to Exit", 100,450);
                   art.drawString("Press N for Next Level", 100,475);
                   repaint();
               }

             repaint();
             Font f = new Font("Arial", Font.BOLD, 20);
             art.setFont(f);
             art.setColor(Color.white);
             art.drawString("Score:"+score, 600, 684);
             Ball.x += movex;
             Ball.y += movey;
             if (left == true) 
             {
                 Bat.x -= 18;
                 right = false;
             }
             if (right == true) 
             {
                 Bat.x += 18;
                 left = false;
             }
             if (Bat.x <= 4)
             {
                 Bat.x = 4;
             } 
             else if (Bat.x >= 586)
             {
                 Bat.x = 596;
             }    
             if (Ball.intersects(Bat))
             {
                 movey = -movey-.1;
             }   
             if (Ball.x <= 0 || Ball.x + Ball.height >= 698)
             {
                 movex = -movex;
             }
             if (Ball.y <= 0) 
             {
                 movey = -movey;
             }
             Font f1 = new Font("Arial", Font.BOLD, 20);
             art.setFont(f1);
             art.setColor(Color.white);
             art.drawString("Lives:"+ lives, 5, 684);
             if (Ball.y >= 698 && (bricksOver==false) && lives>0) 
             {
                   ballFallDown = true;
                   art.setColor(Color.red);
                   status = "";
                   art.drawString("", 100,450);
                   lives=lives-1;
                   ballx = 294; 
                   bally = 640;
                   Ball = new Rectangle(ballx, bally, 12, 12);
                   movex = -16;
                   movey = -16;
                   repaint();  
             } 
             if(lives==0 && Ball.y >= 698)
             {
                 art.setColor(Color.red);
                 art.drawString("You lost!!", 100,425);
                 art.drawString("Press E to Exit", 100,450);
             }
        }   

    public void init() 
    {
        addKeyListener(this);
        for (int i = 0; i < Brick.length; i++)  //creates bricks
        {
            Brick[i] = new Rectangle(brickx, bricky, 40, 20);
            if (i == 12)        //1st row of bricks
            {
                brickx = 32;
                bricky = 84;
            }
            if (i == 23)    //2nd row of bricks
            {
                brickx = 82;
                bricky = 118;
            }
            if (i == 32)    //3rd row of bricks
            {
                brickx = 132;
                bricky = 152;
            }
            if (i == 39)        //4th row of bricks
            {
                brickx = 182;
                bricky = 186;
            }
            if (i == 44)    //5th row of bricks
            {
                brickx = 232;
                bricky = 220;
            }
            if (i == 47)        //6th row of bricks
            {
                brickx = 282;
                bricky = 254;
            }
            if (i == 48)        //7th row of bricks
            {
                brickx = 144;
                bricky = 132;
            }
            brickx += 50;   //spacing between each brick        
        }   
    }

    public void restart()  //if player chooses to exit(E) game will reset back to level one
    {

         ballx = 294; 
         bally = 640;
         batx = 294;
         baty = 654;
         brickx = 32;
         bricky = 50;   
         Ball = new Rectangle(ballx, bally, 12, 12);
         Bat = new Rectangle(batx, baty, 100, 12);
         movex = -16;
         movey = -16;
         ballFallDown = false;
         bricksOver = false;
         count = 0;
        status = null;
        for (int i = 0; i < Brick.length; i++)  //recreates bricks
        {
            Brick[i] = new Rectangle(brickx, bricky, 40, 20);
            if (i == 12)        
            {
                brickx = 32;
                bricky = 84;
            }
            if (i == 23)    
            {
                brickx = 82;
                bricky = 118;
            }
            if (i == 32)    
            {
                brickx = 132;
                bricky = 152;
            }
            if (i == 39)        
            {
                brickx = 182;
                bricky = 186;
            }
            if (i == 44)    
            {
                brickx = 232;
                bricky = 220;
            }
            if (i == 47)        
            {
                brickx = 282;
                bricky = 254;
            }
            if (i == 48)        
            {
                brickx = 144;
                bricky = 132;
            }
            brickx += 50;           
        }   
          repaint();
    }

    @Override
    public void keyPressed(KeyEvent e)  //allows each key to do desired action
    {
        int keyCode = e.getKeyCode();
        if (keyCode == KeyEvent.VK_LEFT) 
        {
            left = true;     
        }

        if (keyCode == KeyEvent.VK_RIGHT) 
        {
            right = true;
        }
        if (keyCode == e.VK_P && currentLevel == 0)
        {
            currentLevel = 1;
        }       
        else if (keyCode == e.VK_E && currentLevel == 1)
        {
            currentLevel = 0;
            score=0;
            lives=3;
            restart();
        }   
        else if(keyCode == e.VK_Q)
        {
            System.exit(0);
        }
    }

    @Override
    public void keyReleased(KeyEvent e) 
    {
        int keyCode = e.getKeyCode();
        if (keyCode == KeyEvent.VK_LEFT) 
        {
            left = false;
        }

        if (keyCode == KeyEvent.VK_RIGHT)
        {
            right = false;
        }
    }

    @Override
    public void keyTyped(KeyEvent e)
    {

    }

    public static void main(String[] args)
    {   
        Game prog = new Game();
        prog.init();        
    }
}

代码,我尝试给每块砖一个随机颜色:

if (Brick[i] != null)
             {
                 float hue = random.nextFloat();
                 float saturation = MIN_SAT + random.nextFloat() * (1f - 
MIN_SAT);
                 float brightness = MIN_SAT + random.nextFloat() * (1f - 
MIN_SAT);
                 Color color = Color.getHSBColor(hue, saturation, 
brightness);
                 art.setColor(color);
                 art.fill3DRect(Brick[i].x, Brick[i].y, Brick[i].width,
                 Brick[i].height, true);
             }

         }

1 个答案:

答案 0 :(得分:1)

您为Brick - 方法中的每个game生成一个随机颜色,该方法是从paintComponent内调用的。这意味着:每次重新绘制屏幕,​​所有Bricks都会获得新的Color。不要采用这种方式,只需在每个Brick生成一个随机颜色时生成它并保持这种方式。这需要在Color - 类中引入Brick作为变量。最简单的解决方案是直接在构造函数中生成颜色:

private Color color;

public Brick(){
    ...

    float hue = random.nextFloat();
    float saturation = MIN_SAT + random.nextFloat() * (1f - MIN_SAT);
    float brightness = MIN_SAT + random.nextFloat() * (1f - MIN_SAT);
    color = Color.getHSBColor(hue, saturation, 

    ...
}

使用Brick方法中game中存储的颜色来渲染每个Brick

for (int i = 0; i < Brick.length; i++) 
     {
         if (Brick[i] != null)
         {
             art.setColor(Brick[i].getColor());
             art.fill3DRect(Brick[i].x, Brick[i].y, Brick[i].width, Brick[i].height, true);
         }

     }

一些一般建议:
请重构您的代码,并在您提出的最后一个问题上实施我们为您提供的有关代码的建议。继续沿着您目前所处的道路前进,您将获得简单无法读取且无法调试的代码。我知道我们不应该在这里介绍任何奇闻轶事,但是当我开始编码时,我用与你现在使用的几乎相同的意大利面代码风格写了Snake。最后,我想解决一个小错误,所以我更改了一行代码。结果:整个代码都破了,我从那时起就无法解决任何问题,因为代码无法使用。故事的道德:在spaghettic-code修复中,一个bug引入了100个新bug。写出正确的代码,过上幸福的生活。

这里是固定代码:

public class Game extends JoeApplet implements KeyListener
{
    String status;
    int ballx = 294; // ball spawn x coordinate
    int bally = 640; // ball spawn y coordinate
    int batx = 294;
    int baty = 654;
    int brickx = 32;
    int bricky = 50;
    double movex = -16;  // x speed of ball
    double movey = -16;  //y speed of ball
    int count = 0;
    int currentLevel=0;
    int score=0;      //starts score at 0
    int lives=3;      //lives start at 3
    static boolean right = false;
    static boolean left = false;
    boolean ballFallDown = false;
    boolean bricksOver = false;
    Rectangle Ball = new Rectangle(ballx, bally, 12, 12); //creates ball
    Rectangle Bat = new Rectangle(batx, baty, 100, 12);   //creates bat(paddle)
    Brick[] Brick = new Brick[49];    //creates desired number of bricks
    Random random = new Random();
    static final float MIN_SAT = 0.8f;

    public void paint(Graphics art)
    {
        switch(currentLevel)
        {
            case 0:
                menuScreen(art);
                break;
            case 1:
                game(art);
                break;
        }
    }
    public void menuScreen(Graphics art)
    {
        setSize(700, 700);
        art.setColor(Color.BLACK);
        art.fillRect(0, 0, 698, 698);
        Color ballcolor=new Color(0,0,66);
        art.setColor(ballcolor);
        art.fillOval(Ball.x, Ball.y, Ball.width, Ball.height);
        Color batcolor=new Color(0,0,66);
        art.setColor(batcolor);
        art.fill3DRect(Bat.x, Bat.y, Bat.width, Bat.height, true);
        art.setColor(Color.green);
        art.drawRect(0, 0, 698, 698);
        art.setColor(Color.yellow);
        Font menu = new Font("Arial", Font.BOLD, 20);
        art.setFont(menu);
        art.drawString("Brick Breaker", 100,400);
        art.drawString("Press P to Play", 100,425);
        art.drawString("Press Q to Quit game", 100,450);
        for (int i = 0; i < Brick.length; i++)
        {
            if (Brick[i] != null)
            {
                art.setColor(Brick[i].getColor());
                art.fill3DRect(Brick[i].x, Brick[i].y, Brick[i].width,
                        Brick[i].height, true);
            }

        }
        art.setColor(Color.YELLOW);
        if (ballFallDown || bricksOver)
        {
            Font f = new Font("Arial", Font.BOLD, 20);
            art.setFont(f);
            art.drawString(status, 294, 349);
            ballFallDown = false;
            bricksOver = false;
        }
    }
    private  Color color;

    class Brick
        extends Rectangle
    {
        private Color color;

        public  Color getColor() { return color; }
        public  Brick(int x, int y, int width, int height)
        {
            super(x, y, width, height);

            float hue = random.nextFloat();
            float saturation = MIN_SAT + random.nextFloat() * (1f - MIN_SAT);
            float brightness = MIN_SAT + random.nextFloat() * (1f - MIN_SAT);
            color = Color.getHSBColor(hue, saturation,
                    brightness);
        }
    }
    public void game(Graphics art)
    {
        setSize(700, 700);
        art.setColor(Color.BLACK);
        art.fillRect(0, 0, 698, 698);
        Color ballcolor=new Color(0,0,225);
        art.setColor(ballcolor);
        art.fillOval(Ball.x, Ball.y, Ball.width, Ball.height);
        Color batcolor=new Color(0,0,139);
        art.setColor(batcolor);
        art.fill3DRect(Bat.x, Bat.y, Bat.width, Bat.height, true);
        art.setColor(Color.green);
        art.drawRect(0, 0, 698, 698);
        for (int i = 0; i < Brick.length; i++)
        {
            if (Brick[i] != null)
            {

                art.setColor(Brick[i].getColor());
                art.fill3DRect(Brick[i].x, Brick[i].y, Brick[i].width,
                        Brick[i].height, true);
            }

        }

        if (ballFallDown || bricksOver)
        {
            Font f = new Font("Arial", Font.BOLD, 20);
            art.setFont(f);
            art.drawString(status, 100,425);
            ballFallDown = false;
            bricksOver = false;
        }

        for (int i = 0; i < Brick.length; i++)
        {
            if (Brick[i] != null)
            {
                if (Brick[i].intersects(Ball))
                {
                    score=score+10;
                    Brick[i] = null;
                    movey = -movey;
                    count++;
                }
            }
        }


        if (count == Brick.length)
        {
            bricksOver = true;
            movex=0;
            movey=0;
            art.setColor(Color.green);
            status = "YOU BEAT THE LEVEL!!";
            art.drawString("Press E to Exit", 100,450);
            art.drawString("Press N for Next Level", 100,475);
            repaint();
        }

        repaint();
        Font f = new Font("Arial", Font.BOLD, 20);
        art.setFont(f);
        art.setColor(Color.white);
        art.drawString("Score:"+score, 600, 684);
        Ball.x += movex;
        Ball.y += movey;
        if (left == true)
        {
            Bat.x -= 18;
            right = false;
        }
        if (right == true)
        {
            Bat.x += 18;
            left = false;
        }
        if (Bat.x <= 4)
        {
            Bat.x = 4;
        }
        else if (Bat.x >= 586)
        {
            Bat.x = 596;
        }
        if (Ball.intersects(Bat))
        {
            movey = -movey-.1;
        }
        if (Ball.x <= 0 || Ball.x + Ball.height >= 698)
        {
            movex = -movex;
        }
        if (Ball.y <= 0)
        {
            movey = -movey;
        }
        Font f1 = new Font("Arial", Font.BOLD, 20);
        art.setFont(f1);
        art.setColor(Color.white);
        art.drawString("Lives:"+ lives, 5, 684);
        if (Ball.y >= 698 && (bricksOver==false) && lives>0)
        {
            ballFallDown = true;
            art.setColor(Color.red);
            status = "";
            art.drawString("", 100,450);
            lives=lives-1;
            ballx = 294;
            bally = 640;
            Ball = new Rectangle(ballx, bally, 12, 12);
            movex = -16;
            movey = -16;
            repaint();
        }
        if(lives==0 && Ball.y >= 698)
        {
            art.setColor(Color.red);
            art.drawString("You lost!!", 100,425);
            art.drawString("Press E to Exit", 100,450);
        }
    }

    public void init()
    {
        addKeyListener(this);
        for (int i = 0; i < Brick.length; i++)  //creates bricks
        {
            Brick[i] = new Brick(brickx, bricky, 40, 20);
            if (i == 12)        //1st row of bricks
            {
                brickx = 32;
                bricky = 84;
            }
            if (i == 23)    //2nd row of bricks
            {
                brickx = 82;
                bricky = 118;
            }
            if (i == 32)    //3rd row of bricks
            {
                brickx = 132;
                bricky = 152;
            }
            if (i == 39)        //4th row of bricks
            {
                brickx = 182;
                bricky = 186;
            }
            if (i == 44)    //5th row of bricks
            {
                brickx = 232;
                bricky = 220;
            }
            if (i == 47)        //6th row of bricks
            {
                brickx = 282;
                bricky = 254;
            }
            if (i == 48)        //7th row of bricks
            {
                brickx = 144;
                bricky = 132;
            }
            brickx += 50;   //spacing between each brick        
        }
    }

    public void restart()  //if player chooses to exit(E) game will reset back to level one
    {

        ballx = 294;
        bally = 640;
        batx = 294;
        baty = 654;
        brickx = 32;
        bricky = 50;
        Ball = new Rectangle(ballx, bally, 12, 12);
        Bat = new Rectangle(batx, baty, 100, 12);
        movex = -16;
        movey = -16;
        ballFallDown = false;
        bricksOver = false;
        count = 0;
        status = null;
        for (int i = 0; i < Brick.length; i++)  //recreates bricks
        {
            Brick[i] = new Brick(brickx, bricky, 40, 20);
            if (i == 12)
            {
                brickx = 32;
                bricky = 84;
            }
            if (i == 23)
            {
                brickx = 82;
                bricky = 118;
            }
            if (i == 32)
            {
                brickx = 132;
                bricky = 152;
            }
            if (i == 39)
            {
                brickx = 182;
                bricky = 186;
            }
            if (i == 44)
            {
                brickx = 232;
                bricky = 220;
            }
            if (i == 47)
            {
                brickx = 282;
                bricky = 254;
            }
            if (i == 48)
            {
                brickx = 144;
                bricky = 132;
            }
            brickx += 50;
        }
        repaint();
    }

    @Override
    public void keyPressed(KeyEvent e)  //allows each key to do desired action
    {
        int keyCode = e.getKeyCode();
        if (keyCode == KeyEvent.VK_LEFT)
        {
            left = true;
        }

        if (keyCode == KeyEvent.VK_RIGHT)
        {
            right = true;
        }
        if (keyCode == e.VK_P && currentLevel == 0)
        {
            currentLevel = 1;
        }
        else if (keyCode == e.VK_E && currentLevel == 1)
        {
            currentLevel = 0;
            score=0;
            lives=3;
            restart();
        }
        else if(keyCode == e.VK_Q)
        {
            System.exit(0);
        }
    }

    @Override
    public void keyReleased(KeyEvent e)
    {
        int keyCode = e.getKeyCode();
        if (keyCode == KeyEvent.VK_LEFT)
        {
            left = false;
        }

        if (keyCode == KeyEvent.VK_RIGHT)
        {
            right = false;
        }
    }

    @Override
    public void keyTyped(KeyEvent e)
    {

    }

    public static void main(String[] args)
    {
        Game prog = new Game();
        prog.init();
    }
}

很难解决问题。