Hi, ich habe jetzt das Ping Pong Spiel fertig.
Bitte schauts euch an, und sagt mir eure meinung,
Developer_X
Bitte schauts euch an, und sagt mir eure meinung,
Developer_X
Zuletzt bearbeitet:
ne Möglichkeit das Spiel zu beenden wär gut .. hab aus Verzweiflung Alt+F4 genommen.
Dann eine sinvolle Eingrenzung des Radius vom Ball vornehmen. Ich wusste nich was die Zahl bedeuten würde .. und ich denke das man schon einen gewissen Bereich wahren sollte. Wird dieser unterschritte bei der Eingabe einfach aufs Minimum setzen, analog beim Maximum. Nen 1 Pixel grosser Ball macht kein Sinn. Die Linien sind eher irritierend.
Bei der Geschwindigkeitsangabe fehlt auch eine Art Hinweis oder ne Art Vorstellung wie schnell irgendwas ist .. ich habe 4 gewählt .. was passiert bei 40?
aso ist das 2-spieler oder Mensch vs. CPU?
Geht bei mir nicht
Hast du keine .jar gemacht? :autsch:1.Schritt: Extrahiere alle dateien im zip
2.Schritt: Wenn du die Umgebunsvariablen gesetzt hast,
dann gehe mit der eingabeaufforderung in den ordner ( mit cd und so)
3.Schritt: starte die klassdatei Ping.class mit der eingabe:
java Ping.class
Also das Spiel ist ja ziemlich unspielbar.
Die "KI" bewegt sich zu langsam und die Kollisionsabfragen funktionieren nicht richtig. Selbst wenn der Ball direkt an meinen Schläger kommt und abprallt, bekommt der Gegner häufig Punkte dafür. Ich bekomm hingegen manchmal keine Punkte, obwohl ich Punkte bekommen sollte.
Dann hat der Ball ein größeres Spielfeld indem er sich befinden kann, als der Schläger. Wenn der Ball ganz unten ist, komm ich mit dem Schläger ums verrecken nicht hin. Aber zum Glück gibts dafür auch keine Punkte...
Je nach Spielgeschwindigkeit macht die KI entweder nichts oder bewegt sich einfach leicht hoch und runter, ohne wirklich erkennbarem System.
Die Linien halte ich für extrem störend.
Die ist genauso verbugged.teste die neuere Version, die ist im zweiten Anhang hier
Ja weiß ich aber geht immer noch nicht Fehler:entschuldige, aber weißt du wie man das startet?
Also:
1.Schritt: Extrahiere alle dateien im zip
2.Schritt: Wenn du die Umgebunsvariablen gesetzt hast,
dann gehe mit der eingabeaufforderung in den ordner ( mit cd und so)
3.Schritt: starte die klassdatei Ping.class mit der eingabe:
java Ping.class
so viel dazu developer_X
Exception in thread "main" java.lang.NoClassDefFoundError: Ping (wrong name: Pong/Ping)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:637)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:336)
Could not find the main class: Ping. Program will exit.
Ja weiß ich aber geht immer noch nicht Fehler:
Code:Exception in thread "main" java.lang.NoClassDefFoundError: Ping (wrong name: Pong/Ping) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:637) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:277) at java.net.URLClassLoader.access$000(URLClassLoader.java:73) at java.net.URLClassLoader$1.run(URLClassLoader.java:212) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:205) at java.lang.ClassLoader.loadClass(ClassLoader.java:323) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) at java.lang.ClassLoader.loadClass(ClassLoader.java:268) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:336) Could not find the main class: Ping. Program will exit.
hey, warst du mit der cmd auch in dem ordner und allem drumund dran, ?
dann kann ich mris auch nicht erklären, bei den anderen hats funktioniert,
ich geb dir folgenden tipp:
geh in den ordner source
und tiefen, bis zur klasse "Ping.java"
die kompilirst du dann mit
javac Ping.java
und starte sie dann mit
java Ping
Developer-X
Doch.Vllt. haben die nicht Version 1.6.0
Das liegt daran, dass er die Datei Ping im Package Pong nicht findet.
Alternativ kannst du die erste Zeile "package Pong;" aus der Datei Ping.java löschen. Dann kompilieren und starten.
Oder man geht in das bin Verzeichnis und startet über:Das liegt daran, dass er die Datei Ping im Package Pong nicht findet.
Alternativ kannst du die erste Zeile "package Pong;" aus der Datei Ping.java löschen. Dann kompilieren und starten.
if(left)
{
ball_x=ball_x+(move)/3;
if((ball_x>=d.width-d.width/5-20)&&(ball_y<=player_height&&ball_y>=player_height+(d.height/5))==false)
{
Player_lost();
}
if((ball_x>=d.width-d.width/5-20))
{
righ = true;
left = false;
}
}
if((ball_x>=d.width-d.width/5-20)&&(ball_y<=player_height&&ball_y>=player_height+(d.height/5))==false)
{
Player_lost();
}
if((ballX >= d.width - d.width / 5-20)){
if(!(ballY<= playerHeight && ballY >= playerHeight + (d.height/5)))
{
PlayerLost();
}
}
if(devXsollteMehrAPILesen == false)
if(!devXSollteMehrAPILesen)
if(!devXSollteMehrAPILesen)
?
devXSollteMehrAPILesen!
Benutze doch mal ein paar Leerzeichen und bau ein paar Zeilenumbrüche ein.
Oft hilft es auch mehrere If Bedinungen zu schachteln um das Ganze übersichtlicher zu halten.
Wenn du dann deine Variablen, wie in Java üblich, nicht mit Unterstrichen benennst, sondern ballX, playerHeight schreibst, wird das Ganze viel übersichtlicher.
Aber das scheint dir ja zu einfach zu sein, ich bin ja nicht der Erste, der dir das sagt.
Wo genau dein Fehler liegt keine Ahnung, aberJava:if((ballX >= d.width - d.width / 5-20)){ if(!(ballY<= playerHeight && ballY >= playerHeight + (d.height/5))) { PlayerLost(); } }
schau mal Zeile 1 an: Java beherrscht Punkt vor Strich, es wird also gerechnet:
d.width / 5
davon wird 20 abgezogen
das wird von d.width abgezogen
Willst du das so?
Den Vergleich auf == false, den du drin hattest kannst du dir auch sparen, ! ist ein Operator, der eine Bedingung verneint.
ist das selbe wie:Java:if(devXsollteMehrAPILesen == false)
nur dass das 2. besser lesbar ist.Java:if(!devXSollteMehrAPILesen)
if(left)
{
ball_x=ball_x+(move)/3;
if((ball_x>=d.width-d.width/5-20))
{
if(ball_y>=player_height&&ball_y<=player_height+(d.height/5))
{
Player_lost();
}
righ = true;
left = false;
}
}
if(righ)
{
ball_x=ball_x-(move)/3;
if(ball_x<=d.width/5+20)
{
if(ball_y>=ki_height&&ball_y<=ki_height+(d.height/5))
{
KI_lost();
}
left = true;
righ = false;
}
}
ki_height/player_height
|
|
|
|
" " / " " + d.height/5
ball_y>=ki_height&&ball_y<=ki_height+(d.height/5)
if(ball_y<=player_height&&ball_y>=player_height+(d.height/5))
if(ball_y<=player_height||ball_y>=player_height+(d.height/5))
d.width-d.width/5-20
wenn du schonmal dabei bist divese Fehler zu sucen und dergleichen würde ich dir gleich empfehlen konstrukte wie:
Java:d.width-d.width/5-20
welche ständig in den Bedingungen auftauchen vorher einmal zu berechnen, ich nehme stark an das sich d über die zeit nie ändert, das heisst einmal berechnen sobald d feststeht und dann nur auf den berechneten wert verweisen. Klar ist das der CPU scheinbar egal, weil schnell genug, dennoch sollte man sowas immer berücksichtigen, spart massig CPU-Arbeit ein, die bei komplexen programmen mal schnell zu viel sein könnte!
package Pong;
import java.awt.*;
import java.awt.event.*;
import java.util.Scanner;
import javax.swing.*;
@SuppressWarnings("serial")
public class Ping extends JFrame implements Runnable, KeyListener
{
//Attribute
//Dimension
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
//Ping Pong Attribute
//Player
int player_points = 0;
int player_height = d.height/3;
//KI
int ki_height = d.height/3;
int ki_points = 0;
static int ki_goodness = 0;
//Ball
static int ball_radius = 20;
int ball_x = d.height/2;
int ball_y = d.height/2;
//max
static int max_y = 50;
static int max_points = 20;
//move
static int move = 10;
int count_move = 0;
//info
String infoString = "";
//player
static String player = "";
//boolean
boolean left = false;
boolean righ = true;
boolean up = false;
boolean down = true;
boolean able = true;
static boolean lines = false;
//thread
Thread thread;
//Constructor
public Ping()
{
super("Ping Pong");
setUndecorated(true);
setSize(d);
addKeyListener(this);
thread = new Thread(this);
thread.start();
JPanel mainpanel = new JPanel()
{
public void paintComponent(final Graphics g)
{
g.setColor(Color.black);
g.fillRect(0,0,d.width,d.height);
//Draw Information
g.setColor(Color.green);
g.setFont(new Font("Times New Roman",3,40));
g.drawString("Player : "+player_points+"/"+max_points,d.width/5,d.height-d.height/45);
g.drawString("KI : "+ki_points+"/"+max_points, d.width/2,d.height-d.height/45);
//Draw Arena
g.drawRect(d.width/5-d.width/36,(int) (d.height/22.5),d.width/3+d.width/3,d.height/3+d.height/3+max_y+d.height/18);
//Draw Enemys
g.fillRoundRect(d.width/5,player_height,d.width/72,d.height/5,90,90);
g.fillRoundRect(d.width-d.width/5,ki_height-50,d.width/72,d.height/5,90,90);
if(lines)
{
g.drawLine(0,player_height,d.width,player_height);
g.drawLine(0,player_height+d.height/5,d.width,player_height+d.height/5);
g.drawLine(0,ki_height-50,d.width,ki_height-50);
g.drawLine(0,ki_height-50+d.height/5,d.width,ki_height-50+d.height/5);
}
//Draw Ball
g.setColor(Color.white);
g.fillOval(ball_x,ball_y,ball_radius,ball_radius);
if(lines)
{
g.drawLine(ball_x-ball_radius/2,0,ball_x-ball_radius/2,d.height);
g.drawLine(ball_x+ball_radius,0,ball_x+ball_radius,d.height);
g.drawLine(0,ball_y-ball_radius/2,d.width,ball_y-ball_radius/2);
g.drawLine(0,ball_y+ball_radius,d.width,ball_y+ball_radius);
}
g.drawString(infoString,d.width/5,d.height/2);
}
};
setLayout(null);
mainpanel.setBounds(0,0,d.width,d.height);
add(mainpanel);
setVisible(true);
}
//Implemented Methods
//KeyListener
public void keyPressed(KeyEvent arg0)
{
if(arg0.getKeyCode()==KeyEvent.VK_UP)
{
if(count_move>=-max_y)
{
player_height=player_height-move;
count_move--;
}
}
if(arg0.getKeyCode()==KeyEvent.VK_DOWN)
{
if(count_move<=max_y)
{
player_height=player_height+move;
count_move++;
}
}
if(arg0.getKeyCode()==KeyEvent.VK_SPACE)
{
if(able)
{
able = false;
infoString = "Please Press Space to continue.";
}
else
{
able = true;
infoString = "";
}
}
invalidate();
repaint();
}
public void keyReleased(KeyEvent arg0)
{
}
public void keyTyped(KeyEvent arg0)
{
}
//Runnable
@Override
public void run()
{
try
{
Thread.sleep(2000);
}
catch (InterruptedException e1)
{
e1.printStackTrace();
}
while(true)
{
if(able)
{
if(player_points==max_points)
{
infoString = player+" hat das Spiel gewonnen.";
able = false;
try
{
Thread.sleep(3000);
}
catch (InterruptedException e1)
{
e1.printStackTrace();
}
setVisible(false);
System.exit(0);
}
if(ki_points==max_points)
{
infoString = "KI hat das Spiel gewonnen.";
able = false;
try
{
Thread.sleep(3000);
}
catch (InterruptedException e1)
{
e1.printStackTrace();
}
setVisible(false);
System.exit(0);
}
if(left)
{
ball_x=ball_x+(move)/3;
if((ball_x>=d.width-d.width/5-20)&&(ball_y>=player_height&&ball_y<=player_height+(d.height/5)))
{
righ = true;
left = false;
}
if(ball_x>=d.width)
{
KI_lost();
righ = true;
left = false;
}
}
if(righ)
{
ball_x=ball_x-(move)/3;
if(ball_x<=d.width/5+20&&(ball_y>=ki_height&&ball_y<=ki_height+(d.height/5)))
{
left = true;
righ = false;
}
if(ball_x<=0)
{
Player_lost();
left = true;
righ = false;
}
}
if(up)
{
ball_y=ball_y-(move)/3;
if(ball_y<=(int) (d.height/22.5))
{
up = false;
down = true;
}
}
if(down)
{
ball_y=ball_y+(move)/3;
if(ball_y>=(int) (d.height/22.5)+(d.height/3+d.height/3+max_y+d.height/18))
{
down = false;
up = true;
}
}
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.printStackTrace();
}
invalidate();
repaint();
Move_KI();
}
else
{
}
}
}
//Methods
//lost Methods
@SuppressWarnings("static-access")
public void Player_lost()
{
ki_points++;
Toolkit.getDefaultToolkit().beep();
ball_x = d.width/2;
try
{
thread.sleep(2000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
@SuppressWarnings("static-access")
public void KI_lost()
{
player_points++;
Toolkit.getDefaultToolkit().beep();
ball_x = d.width/2;
try
{
thread.sleep(2000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
//move Method
public void Move_KI()
{
if(ball_y<=ki_height)
{
ki_height = ki_height-move/ki_goodness;
}
else if(ball_y>=ki_height)
{
ki_height = ki_height+move/ki_goodness;
}
}
//start Method
public static void start()
{
Scanner sc = new Scanner(System.in);
// First Step
System.out.println("Ping Pong");
System.out.println(" Please Enter your name : ");
player = sc.next();
// Second Step
do
{
System.out.println(" Please Enter Radius of ball : ");
sc = new Scanner(System.in);
}
while(!sc.hasNextInt());
ball_radius = sc.nextInt();
// Third Step
do
{
System.out.println(" Please Enter Speed of the game : ");
sc = new Scanner(System.in);
}
while(!sc.hasNextInt());
move = sc.nextInt();
max_y = move*5;
// Fourth Step
do
{
System.out.println(" Please Enter Max. Point of the game : ");
sc = new Scanner(System.in);
}
while(!sc.hasNextInt());
max_points = sc.nextInt();
// Fourth Step
do
{
System.out.println(" Please Enter the KI_Hardness (scala 1 is best) : ");
sc = new Scanner(System.in);
}
while(!sc.hasNextInt());
ki_goodness = sc.nextInt();
// Fourth Step
do
{
System.out.println(" Please Enter 'true' for stripes or 'false' against stripes : ");
sc = new Scanner(System.in);
}
while(!sc.hasNextBoolean());
lines = sc.nextBoolean();
// Last Step
System.out.println("To continue enter 'ENTER'");
System.out.println("!Attention!: To break the Game, press Space");
sc.next();
//Fifth Step
Ping p = new Ping();
p.setVisible(true);
}
//main
public static void main(String[]args)
{
start();
}
}
so als kleiner ansporn...(lang ists her und nie über Alpha gekommen)
(unter 100KB gekürzt und Du kannst nicht gewinnen!)
EDIT:
grad rausgefunden..mit recht links kann man ans Netz angreifen
also ich finde ja deine menüführung geil =) ich musste das spiel ca. 3-4 mal neustarten bis ich einstellungen gefunden habe, die einigemraßen spielbar sind(solltest mal min, max-werte vereinbaren und diese vllt dme user anzeigen ^^)
und wieso MUSS ich wenn da steht: to continue ENTER vorher noch was anderes eingeben?
hat mich auch verwirrt, hätte ich direkt danach nicht hier im forum gelesne dass ich vorher noch nen anderes zeichen eintippsern muss, hätte ich direkt eclipse wieder geschloßen![]()
... gestern abend funktionierte alles perfekt, ...
wieso kann ich das nicht glauben?