📄 main.java
字号:
import java.awt.*;
import java.util.*;
import java.applet.*;
import java.net.*;
public class Main extends Applet implements Runnable
{
// Deklaration der Variablen und Objekte
public int score1; // Z鋒lt die Tore des Spielers
public int score2; // Z鋒lt die Tore des Computers
public int maus_y; // Speichert die Mausposition an Stelle y
Ball puck; // Ballobject
Player bat1; // Playerobject Tor
Player bat2; // Playerobject St黵mer
Computer bat3; // Computerobject Tor
Computer bat4; // Computerobject St黵mer
Thread th;
// F鋘gt den von wheresBall gelieferten Wert auf und zeitg an, wer ein Tor geschossen hat
public int whosgoal;
// Titelbild
private Image titleImg;
// Variablen f黵 die Doppelpufferung
private Image dbImage;
private Graphics dbg;
// Variablen f黵 die Audiodateien
AudioClip kicknoise; // Ball trifft Paddel
AudioClip goalnoise; // Tor
// Variablen f黵 die momentanen Spielzust鋘de (Pause und Run)
boolean play;
boolean end;
boolean title;
// Initialisierung des Applets
public void init ()
{
// Initialisierung der scores
score1 = 0;
score2 = 0;
// Hintergrundfarbe
setBackground (Color.black);
// Objekte initialisieren
puck = new Ball (8, 250, 175, 0, 0, Color.black, this);
bat1 = new Player (15, 175);
bat2 = new Player (375, 175);
bat3 = new Computer (475, 175);
bat4 = new Computer (115, 175);
// Initialisierung der Spielzust鋘de
play = false;
end = false;
title = true;
// Laden des Titelbildes
titleImg = getImage(getCodeBase(), "Title.gif");
// Audiodateien initialisieren
kicknoise = getAudioClip (getCodeBase(), "hit.au");
kicknoise.play();
kicknoise.stop();
goalnoise = getAudioClip (getCodeBase(), "chime.au");
goalnoise.play();
goalnoise.stop();
}
// Start - Methode, hier beginnt das Applet zu laufen
public void start ()
{
// Schaffen eines neuen Threads, in dem das Spiel l鋟ft
th = new Thread (this);
th.start ();
}
public void stop ()
{
th.stop();
}
// Implementierung der Runmethode
public void run ()
{
// Erniedrigen der ThreadPriority um zeichnen zu erleichtern
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
while (true)
{
// Neumalen des Fensters
repaint();
// Bewegen des Pucks
puck.move ();
// bewegen der Computerpaddel
bat3.ComputerMove (puck);
// Testen wo sich der Ball im Moment befindet
whosgoal = puck.wheresBall ();
// Wenn jemand ein Tor geschossen hat, Punkte hinzuz鋒len und Ball zur點ksetzen
if (whosgoal != 0)
{
if (whosgoal == 1)
{
score1 += 1;
goalnoise.play();
puck.pos_x = 250;
puck.vx = 4;
puck.vy = -4;
if (score1 == 10)
{
play = false;
end = true;
puck.isStoped = true;
puck.vx = 0;
puck.vy = 0;
}
}
else if (whosgoal == 2)
{
score2 += 1;
goalnoise.play();
puck.pos_x = 250;
puck.vx = 4;
puck.vy = 4;
if (score2 == 10)
{
play = false;
end = true;
puck.isStoped = true;
puck.vx = 0;
puck.vy = 0;
}
}
}
/** Testet nach Collisionen von Ball und Spielerpaddel. Dies ist nur relevant, wenn
sich der Ball auf die Paddel zubewegt */
if (puck.vx < 0)
{
puck.PCollision (bat1, bat2, kicknoise);
}
else if (puck.vx > 0)
{
puck.CCollision (bat3, bat4, kicknoise);
}
try
{
// Stoppen des Threads f黵 10 Millisekunden
Thread.sleep (10);
}
catch (InterruptedException ex)
{
break;
}
// Zur點ksetzen der ThreadPriority auf Maximalwert
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
}
}
/** Diese Methode f鋘gt Mausereignisse im Frame auf und Speichert die Y Position des Mauszeigers
desweiteren bestimmt sie die neue Position der beiden Spielerpaddel und testet, ob sich das Paddel
im Aus befindet*/
public boolean mouseMove (Event e, int x, int y)
{
maus_y = y;
// Testen, ob das Paddel im Aus ist, wenn nicht, Paddel bewegen
if (maus_y > 25 & maus_y < 325)
{
bat1.PaddelMove (maus_y);
bat2.PaddelMove (maus_y);
}
return true;
}
public boolean mouseDown (Event e, int x, int y)
{
if (!play)
{
play = true;
end = false;
title = false;
puck.vx = 4;
puck.vy = 4;
score1 = 0;
score2 = 0;
puck.isStoped = false;
}
return true;
}
/** Paint - Methode */
public void paint (Graphics g)
{
// Spielfeld malen
g.setColor (Color.cyan);
g.fillRect (0, 0, 500, 8); // Obere Linie
g.fillRect (0, 342, 500, 8); // Untere Linie
g.fillRect (0, 0, 8, 75); // Linke obere Seitenlinie
g.fillRect (0, 275, 8, 75); // Linke untere Seitenlinie
g.fillRect (492, 0, 8, 75); // Rechte obere Seitenlinie
g.fillRect (492, 275, 8, 75); // Rechte untere Seitenlinie
// Ball malen
puck.DrawBall (g);
// Paddel 1 malen
bat1.DrawPaddel (g);
// Paddel 2 malen
bat2.DrawPaddel (g);
// Paddel 3 malen
bat3.DrawPaddel (g);
// Paddel 4 malen
bat4.DrawPaddel (g);
// Farbe f黵 strings
g.setColor (Color.yellow);
// Spielertore zeichnen
g.drawString ("Player: " + score2, 50, 370);
// Computertore zeichnen
g.drawString ("Computer: " + score1, 400, 370);
if (title)
{
g.drawImage (titleImg, 150, 70, this);
g.drawString ("This game was programmed by FBI", 155, 200);
g.drawString ("Please visit us at www.javacooperation.gmxhome.de", 125, 220);
g.drawString ("Click on Applet to start game!", 175, 240);
}
else if (end)
{
g.drawImage (titleImg, 150, 70, this);
g.drawString ("This game was programmed by FBI", 155, 200);
g.drawString ("Please visit us at www.javacooperation.gmxhome.de", 125, 220);
if (score1 == 10)
{
g.drawString ("Computer won the game!!", 180, 240);
}
else if (score2 == 10)
{
g.drawString ("Player won the game!!", 180, 240);
}
g.drawString ("Click on Applet to restart game!", 170, 260);
}
}
/** Update - Methode, Realisierung der Doppelpufferung zur Reduzierung des Bildschirmflackerns */
public void update (Graphics g)
{
// Initialisierung des DoubleBuffers
if (dbImage == null)
{
dbImage = createImage (this.getSize().width, this.getSize().height);
dbg = dbImage.getGraphics ();
}
// Bildschirm im Hintergrund l鰏chen
dbg.setColor (getBackground ());
dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);
// Auf gel鰏chten Hintergrund Vordergrund zeichnen
dbg.setColor (getForeground());
paint (dbg);
// Nun fertig gezeichnetes Bild Offscreen auf dem richtigen Bildschirm anzeigen
g.drawImage (dbImage, 0, 0, this);
}
}
class Ball
{
/** Diese Klasse enth鋖t alle Funktionen, die f黵 die Bewegung, Konstruktion, Positionsbestimmung,
Graphik und Abschiesen des Ball - Objektes von Bedeutung sind. */
// Deklaration der Variablen
public int pos_x; // X - Position des Balles
public int pos_y; // Y - Position des Balles
public int vx; // X - Geschwindigkeit des Balles
public int vy; // Y - Geschwindigkeit des Balles
public int radius; // Radius des Balles
public boolean isStoped; // Zeigt an, ob der Ball gestoped ist
private int ball_top; // Obergrenze des Balles
private int ball_bottom; // Untergrenze des Balles
private int ball_left; // Linke Grenze des Balles
private int ball_right; // Rechte Grenze des Balles
private int player_top; // Oberkante des Paddels
private int player_bottom; // Unterkante des Paddels
private int player_right; // rechte Kante des Paddels
private int comp_top; // Oberkante des Computerpaddels
private int comp_bottom; // Unterkante des Computerpaddels
private int comp_left; // Rechte Seite des Computerpaddels
private final int max_vx; // Variable f黵 die maximale Ballgeschwindigkeit in x - Richtung
private final int max_vy; // Variable f黵 die maximale Ballgeschwindigkeit in y - Richtung
public Color ballfarbe; // Frage des Balles
Image ballImg; // Bild des Balles
Component mom; // Wird ben鰐igt um Ball mit Bild zu 黚erlagern
/** Construktor */
public Ball (int r, int x, int y, int vx, int vy, Color c, Component parent)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -