[英]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 BoxX
和BoxY
是敌人的球坐标
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. ReverseX
和Y
, IndexX
和Y
以及BallXchange
和Y
都与敌人球的运动有关。
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.