简体   繁体   English

如何重新启动while循环以重新启动游戏?

[英]How to restart while loop in order to restart game?

I want the game to restart when the player pressed the y key on the keyboard after dying or getting hit by the small ball. 我希望游戏在死亡或被小球击中后按键盘上的y键重新启动。

BoxX and BoxY are the coordinates for enemy balls BoxXBoxY是敌人的球坐标

Ball holds the rectangle or hitbox for all the enemy balls 球可容纳所有敌人球的矩形或命中框

ReverseX and Y , IndexX and Y , and BallXchange and Y all have to do with the movement of the enemy balls. ReverseXYIndexXY以及BallXchangeY都与敌人球的运动有关。

Here is the code: 这是代码:

import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.*;
import java.util.ArrayList;
import java.awt.Font;
import java.awt.Color;


import java.io.File;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;



public class GameNotes extends JPanel implements KeyListener{
int x1=1;
int y1=1;

int ballx = 40;
int bally = 60;
boolean gameRunning = true;
BufferedImage image;
int windowx = 500;
int windowy = 500;
int score = 0;

int rectX = (int)(Math.random()*400)+30;
int rectY = (int)(Math.random()*400)+30;

int enemyX = (int)(Math.random()*300)+100;
int enemyY = (int)(Math.random()*250)+100;



int count = 1;
int num = 0;



boolean reverseX = false;
boolean reverseY = false;


boolean right = false;
boolean left = false;
boolean up = false;
boolean down = false;


 ArrayList<Integer> BoxX = new ArrayList<Integer>();
 ArrayList<Integer> BoxY = new ArrayList<Integer>();
 ArrayList<Rectangle> Ball = new ArrayList<Rectangle>();
 ArrayList<Integer> ReverseX = new ArrayList<Integer>();
 ArrayList<Integer> ReverseY = new ArrayList<Integer>();


 ArrayList<Integer> BallYchange = new ArrayList<Integer>();
 ArrayList<Integer> BallXchange = new ArrayList<Integer>();
 ArrayList<Integer> indexY = new ArrayList<Integer>();
 ArrayList<Integer> indexX = new ArrayList<Integer>();


public GameNotes(){
    setFocusable(true);

    JFrame frame = new JFrame("GameDemo");
    frame.setSize(windowx, windowy);
    frame.add(this);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    addKeyListener(this);

    try{
     image = ImageIO.read(new File("C:\\Users\\10021707\\Desktop\\Game\\b.jpg"));
    }catch (Exception e){
        System.out.println("image not found \n E000384JW29400119482938WJDI39");
    }

    game:
    while(gameRunning){
    try{
        Thread.sleep(3);
}catch(Exception e){
    System.out.println("error");
}
        Rectangle r = new Rectangle (ballx,bally,20,20);
        Rectangle r2 = new Rectangle (rectX,rectY,30,30);
        Rectangle rE = new Rectangle (enemyX,enemyY,10,10);
        if(count == 1){
        BoxX.add(enemyX);
        BoxY.add(enemyY);
        Ball.add(rE);
        ReverseX.add(1);
        BallXchange.add(enemyX);
        num++;
        indexX.add(num);


        count--;
        }

        //System.out.println("ReverseY" + ReverseY.size());

        if(ballx >= 461)
            ballx = 461;

        if(ballx <= 0)
            ballx = 0;

        if(bally >= 432)
            bally = 432;

        if(bally <= 0)
            bally = 0;





        if(r.intersects(r2)){
            score+=5;

            rectX = (int)(Math.random()*400)+30;
            rectY = (int)(Math.random()*400)+30;

            enemyX = (int)(Math.random()*300)+50;
            enemyY = (int)(Math.random()*300)+50;


            BoxX.add(enemyX);
            BoxY.add(enemyY);


            int x = (int)(Math.random()*10)+1;
            //System.out.println(x);
            if(x > 5){
                ReverseX.add(1);
                BallXchange.add(enemyX);
                num++;
                indexX.add(num);
            }


            if(x <= 5){
                ReverseY.add(1);
                BallYchange.add(enemyY);
                num++;
                indexY.add(num);
            }




            Rectangle En = new Rectangle (enemyX,enemyY,10,10);
            Ball.add(En);


            //System.out.println(Ball);

        }


            for(int i = 0; i < Ball.size(); i++){
                Rectangle w = new Rectangle (BoxX.get(i),BoxY.get(i),10,10);
                Ball.set(i,w);
            }



            for(int i = 0; i < BoxX.size(); i++){
                if(r.intersects(Ball.get(i))){
                    gameRunning = false;
                }
            }





            //System.out.println(ReverseY);

            for(int i = 0; i < ReverseX.size(); i++){
                BallXchange.set(i,BallXchange.get(i)+ReverseX.get(i));
                BoxX.set(indexX.get(i)-1,BallXchange.get(i));
                    if(BallXchange.get(i) >= 470 || BallXchange.get(i) <= 0){
                        ReverseX.set(i,ReverseX.get(i)*-1);
                    }
            }

            for(int i = 0; i < ReverseY.size(); i++){
                BallYchange.set(i,BallYchange.get(i)+ReverseY.get(i));
                BoxY.set(indexY.get(i)-1,BallYchange.get(i));
                    if(BallYchange.get(i) >= 445 || BallYchange.get(i) <= 0){
                        ReverseY.set(i,ReverseY.get(i)*-1);
                    }
            }






        if(right)
            ballx++;
        if(left)
            ballx--;
        if(up)
            bally--;
        if(down)
            bally++;


        repaint();
    }
}


public void paintComponent(Graphics g){
    super.paintComponent(g);
    g.drawImage(image,0,0,null);
    g.fillOval(ballx,bally,20,20);
    g.fillRect(rectX,rectY,30,30);

    for(int i = 0; i < BoxX.size(); i++){
        g.fillOval(BoxX.get(i),BoxY.get(i),10,10);
    }

    if(!gameRunning){
        g.setColor(getBackground());
        g.clearRect(rectX,rectY,30,30);
        g.fillRect(rectX,rectY,30,30);
            for(int i = 0; i < BoxX.size(); i++){
                g.clearRect(BoxX.get(i),BoxY.get(i),10,10);
                g.fillOval(BoxX.get(i),BoxY.get(i),10,10);
                g.fillRect(BoxX.get(i),BoxY.get(i),10,10);
            }

        BoxX.clear();
        BoxY.clear();
        Ball.clear();
        ReverseX.clear();
        ReverseY.clear();
        BallXchange.clear();
        BallYchange.clear();
        indexX.clear();
        indexY.clear();

        g.setColor(Color.BLACK);
        g.setFont(new Font("TimesRoman", Font.PLAIN, 30));
        g.drawString("Game Over", 165, 200);
        g.setFont(new Font("TimesRoman", Font.PLAIN, 25));
        g.drawString("Do you want to play again?", 100, 230);
        g.setFont(new Font("TimesRoman", Font.PLAIN, 20));
        g.drawString("(y or n)", 200, 250);

    }

    if(gameRunning){
        g.setFont(new Font("TimesRoman", Font.PLAIN, 25));;
        g.drawString("Score: "+score, 100, 450);
    }

    /*for(int i = 0; i < Ball.size(); i++){
        g.fillRect((int)Ball.get(i).getX(),(int)Ball.get(i).getY(),10,10);
    }*/



}

public void keyReleased(KeyEvent e){
    if(e.getKeyCode() == KeyEvent.VK_D || e.getKeyCode() == KeyEvent.VK_RIGHT)
        right = false;
    if(e.getKeyCode() == KeyEvent.VK_A || e.getKeyCode() == KeyEvent.VK_LEFT)
        left = false;
    if(e.getKeyCode() == KeyEvent.VK_W || e.getKeyCode() == KeyEvent.VK_UP)
        up = false;
    if(e.getKeyCode() == KeyEvent.VK_S || e.getKeyCode() == KeyEvent.VK_DOWN)
        down = false;

}

public void keyPressed(KeyEvent e){


 int key = e.getKeyCode();

 if(gameRunning == false && key == e.VK_Y){
    score = 0;
    gameRunning = true;




 }



    if(e.getKeyCode() == KeyEvent.VK_D || e.getKeyCode() == KeyEvent.VK_RIGHT)
        right = true;
    if(e.getKeyCode() == KeyEvent.VK_A || e.getKeyCode() == KeyEvent.VK_LEFT)
        left = true;




    if(e.getKeyCode() == KeyEvent.VK_W || e.getKeyCode() == KeyEvent.VK_UP)
        up = true;
    if(e.getKeyCode() == KeyEvent.VK_S || e.getKeyCode() == KeyEvent.VK_DOWN)
        down = true;


}
public void keyTyped(KeyEvent e){

}



public static void main (String [] samay){
    GameNotes test = new GameNotes();
}


}

Any help would be appreciated! 任何帮助,将不胜感激!

As ordonezalex suggested in his comment you can take the while loop and put it in a method such as this: 正如ordonezalex在他的评论中建议的那样,您可以使用while循环并将其放入这样的方法中:

public void runGame() {

    while(gameRunning){
        try{
            Thread.sleep(3);
        }catch(Exception e){
            System.out.println("error");
        }
        Rectangle r = new Rectangle (ballx,bally,20,20);
        Rectangle r2 = new Rectangle (rectX,rectY,30,30);
        Rectangle rE = new Rectangle (enemyX,enemyY,10,10);
        if(count == 1){
        BoxX.add(enemyX);
        BoxY.add(enemyY);
        Ball.add(rE);
        ReverseX.add(1);
        BallXchange.add(enemyX);
        num++;
        indexX.add(num);


        count--;
        }

        //System.out.println("ReverseY" + ReverseY.size());

        if(ballx >= 461)
            ballx = 461;

        if(ballx <= 0)
            ballx = 0;

        if(bally >= 432)
            bally = 432;

        if(bally <= 0)
            bally = 0;





        if(r.intersects(r2)){
            score+=5;

            rectX = (int)(Math.random()*400)+30;
            rectY = (int)(Math.random()*400)+30;

            enemyX = (int)(Math.random()*300)+50;
            enemyY = (int)(Math.random()*300)+50;


            BoxX.add(enemyX);
            BoxY.add(enemyY);


            int x = (int)(Math.random()*10)+1;
            //System.out.println(x);
            if(x > 5){
                ReverseX.add(1);
                BallXchange.add(enemyX);
                num++;
                indexX.add(num);
            }


            if(x <= 5){
                ReverseY.add(1);
                BallYchange.add(enemyY);
                num++;
                indexY.add(num);
            }




            Rectangle En = new Rectangle (enemyX,enemyY,10,10);
            Ball.add(En);


            //System.out.println(Ball);

        }


            for(int i = 0; i < Ball.size(); i++){
                Rectangle w = new Rectangle (BoxX.get(i),BoxY.get(i),10,10);
                Ball.set(i,w);
            }



            for(int i = 0; i < BoxX.size(); i++){
                if(r.intersects(Ball.get(i))){
                    gameRunning = false;
                }
            }





            //System.out.println(ReverseY);

            for(int i = 0; i < ReverseX.size(); i++){
                BallXchange.set(i,BallXchange.get(i)+ReverseX.get(i));
                BoxX.set(indexX.get(i)-1,BallXchange.get(i));
                    if(BallXchange.get(i) >= 470 || BallXchange.get(i) <= 0){
                        ReverseX.set(i,ReverseX.get(i)*-1);
                    }
            }

            for(int i = 0; i < ReverseY.size(); i++){
                BallYchange.set(i,BallYchange.get(i)+ReverseY.get(i));
                BoxY.set(indexY.get(i)-1,BallYchange.get(i));
                    if(BallYchange.get(i) >= 445 || BallYchange.get(i) <= 0){
                        ReverseY.set(i,ReverseY.get(i)*-1);
                    }
            }






        if(right)
            ballx++;
        if(left)
            ballx--;
        if(up)
            bally--;
        if(down)
            bally++;


        repaint();
    }
}

Then replace the while loop with this: 然后用以下代码替换while循环:

runGame();

And each time you want to re-run the game you can use that again, as long as the boolean gameRunning is true. 每次您要重新运行游戏时,只要boolean gameRunning为true,就可以再次使用它。

There are a few things you would need to update in your code: 您需要在代码中进行一些更新:

A. Create a boolean called programRunning and set it to true : A.创建一个名为programRunning的布尔并将其设置为true

boolean gameRunning = true;
boolean programRunning = true;

B. Create a private void method called initGame() and place all the game initialization code there: B.创建一个名为initGame()的私有void方法,并将所有游戏初始化代码放在此处:

private void initGame()
{
    x1=1;
    y1=1;

    ballx = 40;
    bally = 60;
    windowx = 500;
    windowy = 500;
    score = 0;

    rectX = (int)(Math.random()*400)+30;
    rectY = (int)(Math.random()*400)+30;

    enemyX = (int)(Math.random()*300)+100;
    enemyY = (int)(Math.random()*250)+100;

    count = 1;
    num = 0;

    reverseX = false;
    reverseY = false;

    right = false;
    left = false;
    up = false;
    down = false;

    BoxX = new ArrayList<Integer>();
    BoxY = new ArrayList<Integer>();
    Ball = new ArrayList<Rectangle>();
    ReverseX = new ArrayList<Integer>();
    ReverseY = new ArrayList<Integer>();

    BallYchange = new ArrayList<Integer>();
    BallXchange = new ArrayList<Integer>();
    indexY = new ArrayList<Integer>();
    indexX = new ArrayList<Integer>();
}

C. Modify the following code under the section where you are assigning a JPG to the image variable: C.在将JPG分配给image变量的部分下修改以下代码:

try{
 image = ImageIO.read(new File("C:\\Users\\10021707\\Desktop\\Game\\b.jpg"));
}catch (Exception e){
    System.out.println("image not found \n E000384JW29400119482938WJDI39");
}

//CODE CHANGED BELOW THIS COMMENT
do {
    initGame();
    while (gameRunning) {
        runGame();
    }
} while (programRunning);

D. Create the runGame() method that contains all of your code within the while (gameRunning) loop: D.创建runGame()方法,该方法包含while (gameRunning)循环内的所有代码:

private void runGame()
{
    try{
        Thread.sleep(3);
}catch(Exception e){
    System.out.println("error");
}
        Rectangle r = new Rectangle (ballx,bally,20,20);
        Rectangle r2 = new Rectangle (rectX,rectY,30,30);
        Rectangle rE = new Rectangle (enemyX,enemyY,10,10);
        if(count == 1){
        BoxX.add(enemyX);
        BoxY.add(enemyY);
        Ball.add(rE);
        ReverseX.add(1);
        BallXchange.add(enemyX);
        num++;
        indexX.add(num);


        count--;
        }

        //System.out.println("ReverseY" + ReverseY.size());

        if(ballx >= 461)
            ballx = 461;

        if(ballx <= 0)
            ballx = 0;

        if(bally >= 432)
            bally = 432;

        if(bally <= 0)
            bally = 0;





        if(r.intersects(r2)){
            score+=5;

            rectX = (int)(Math.random()*400)+30;
            rectY = (int)(Math.random()*400)+30;

            enemyX = (int)(Math.random()*300)+50;
            enemyY = (int)(Math.random()*300)+50;


            BoxX.add(enemyX);
            BoxY.add(enemyY);


            int x = (int)(Math.random()*10)+1;
            //System.out.println(x);
            if(x > 5){
                ReverseX.add(1);
                BallXchange.add(enemyX);
                num++;
                indexX.add(num);
            }


            if(x <= 5){
                ReverseY.add(1);
                BallYchange.add(enemyY);
                num++;
                indexY.add(num);
            }




            Rectangle En = new Rectangle (enemyX,enemyY,10,10);
            Ball.add(En);


            //System.out.println(Ball);

        }


            for(int i = 0; i < Ball.size(); i++){
                Rectangle w = new Rectangle (BoxX.get(i),BoxY.get(i),10,10);
                Ball.set(i,w);
            }



            for(int i = 0; i < BoxX.size(); i++){
                if(r.intersects(Ball.get(i))){
                    gameRunning = false;
                }
            }





            //System.out.println(ReverseY);

            for(int i = 0; i < ReverseX.size(); i++){
                BallXchange.set(i,BallXchange.get(i)+ReverseX.get(i));
                BoxX.set(indexX.get(i)-1,BallXchange.get(i));
                    if(BallXchange.get(i) >= 470 || BallXchange.get(i) <= 0){
                        ReverseX.set(i,ReverseX.get(i)*-1);
                    }
            }

            for(int i = 0; i < ReverseY.size(); i++){
                BallYchange.set(i,BallYchange.get(i)+ReverseY.get(i));
                BoxY.set(indexY.get(i)-1,BallYchange.get(i));
                    if(BallYchange.get(i) >= 445 || BallYchange.get(i) <= 0){
                        ReverseY.set(i,ReverseY.get(i)*-1);
                    }
            }






        if(right)
            ballx++;
        if(left)
            ballx--;
        if(up)
            bally--;
        if(down)
            bally++;


        repaint();
    }

E. Add this code to your keyPressed(KeyEvent e) method: E.将此代码添加到您的keyPressed(KeyEvent e)方法中:

if (gameRunning == false && key == KeyEvent.VK_N)
{
    programRunning = false;
    System.exit(0); //Closes the application.
}

Just giving you the main idea : 只是给你主要思想:

do{
//All logic goes here

//At the end of the game take input from user in the form of 'Y|y' or 'N|n'

System.out.println("Do you want to continue : press 'Y' for yes and 'N' for no");  
Scanner sc=new Scanner(System.in);
String choice=sc.nextLine();   
} while(choice.equalsIgnoreCase("Y"))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM