/* Ping-Pongi mäng kahele (üle võrgu) Grupp: Märt Ringmäe, Martin Alev, Kaido Heinsalu, Roman German, Pjotr Savitski */ import java.applet.*; import java.awt.*; import java.io.*; import java.net.*; import java.awt.event.*; import java.util.*; public class PingPong extends Applet implements ActionListener, Runnable, KeyListener,ItemListener{ Panel cmdSeaded=new Panel(new GridLayout(3,1)); Panel cmdValikud=new Panel(new GridLayout(4,2)); TextField cmdKasutajaNimi=new TextField(12); TextField cmdServeriAadress=new TextField("localhost",12); Button cmdAlusta=new Button("Valmis"); Button cmdTyhjenda=new Button("Puhasta väljad"); Button cmdTagasi=new Button("Stopp!"); Label cmdTeated=new Label(""); Checkbox cmdOlenServer=new Checkbox("Olen server"); boolean olenServer=false; String kasutajaNimi=""; String vastaseNimi=""; int olek=0; // 0 - esimene ekraan (tekstiväljad, nupud); 1 - mäng; 2 - sekundid (3 .. 2 .. 1 ..); // 3 - ühendus katkes; 4 - kaotus; 5 - vastane kaotas Socket vastasePistik; PrintWriter valja; BufferedReader sisse; ServerSocket serverPistik; Yhendus uusYhendus; VastaseKuular uusVastaseKuular; final static int laius=400; final static int korgus=320; final static int maxElud=5; Rectangle Laud=new Rectangle(0,48,laius, korgus-48); Rectangle Reket1=new Rectangle(Laud.x+10,80,13,66); Rectangle Reket2=new Rectangle(Laud.x+Laud.width-23,80,13,66); Rectangle Pall=new Rectangle(Laud.x+Laud.width/2-10,Laud.y+Laud.height/2-10,20,20); int pKiirusX=0; // palli kiirus x-teljes int pKiirusY=0; Image puhver; Graphics puhverg; MediaTracker meedia; Image imTaust; Image imReket; Image imTeateAken; int serveriElud=maxElud; int kliendiElud=maxElud; boolean vastaneValmis=false; boolean iseValmis=false; Vector SIGNAAL=new Vector(); //edastatavate teadete järjekord class TSignaal{ public int info; public TSignaal(int i){ info=i; } } class Yhendus extends Thread{ public Yhendus(){ start(); } public void run(){ try{ if (olenServer){ cmdTeated.setText("Server ootab klienti ..."); serverPistik=new ServerSocket(2003); vastasePistik=serverPistik.accept(); }else{ cmdTeated.setText("Püüan ühenduda serveriga: "+cmdServeriAadress.getText().trim()); vastasePistik=new Socket(cmdServeriAadress.getText().trim(),2003); Reket1.x=laius-23; // klient juhib akna paremal küljel olevat reketit Reket2.x=10; } yhendusOlemas(); }catch(Exception e){ cmdTeated.setText("Viga ühenduse loomisel!"); } } } class VastaseKuular extends Thread{ public VastaseKuular(){ start(); } public void run(){ while(true){ try{ Reket2.y=Integer.parseInt(sisse.readLine()); if (!olenServer){ Pall.x=Integer.parseInt(sisse.readLine()); Pall.y=Integer.parseInt(sisse.readLine()); } int teateSisu=Integer.parseInt(sisse.readLine()); switch(teateSisu){ case 1: vastaneValmis=true; break; case 2: peataM2ng(); break; case 3: serveriElud--; peataM2ng(); break; case 4: kliendiElud--; peataM2ng(); break; case 5: olek=5; peataM2ng(); break; case 6: olek=4; peataM2ng(); break; case 7: olek=2; break; } }catch(Exception e){ olek=3; // ühendus vastasega katkes! break; } } } } class ValmisolekuKuular extends Thread{ public ValmisolekuKuular(){ start(); } public void run(){ while(!(iseValmis && vastaneValmis)) try{Thread.sleep(100);}catch(Exception viga){} alustaM2ngu(); } } ////////////////////////////////////////////////////////////////////////////////////////// public void alustaM2ngu(){ pKiirusX=pKiirusY=(serveriElud>kliendiElud?-4:4); SIGNAAL.add(new TSignaal(7)); olek=2; // loe sekundeid! } Image laePilt(String failinimi){ try{ return getImage(getCodeBase(), failinimi); }catch(Exception e){} return Toolkit.getDefaultToolkit().getImage(failinimi); } public void yhendusOlemas(){ try{ valja=new PrintWriter(vastasePistik.getOutputStream(), false); sisse=new BufferedReader(new InputStreamReader(vastasePistik.getInputStream())); valja.println(kasutajaNimi); valja.flush(); vastaseNimi=sisse.readLine(); uusVastaseKuular=new VastaseKuular(); }catch(Exception e){ cmdTeated.setText("Probleemid ühenduse loomisel!"); return; } new Thread(this).start(); removeAll(); olek=1; } public PingPong(){ addKeyListener(this); /////////////// MEEDIA //////////////// meedia=new MediaTracker(this); imTaust=laePilt("taust.gif"); imReket=laePilt("reket.gif"); imTeateAken=laePilt("teateaken.gif"); meedia.addImage(imTaust, 0); meedia.addImage(imReket, 1); meedia.addImage(imTeateAken, 2); try{ meedia.waitForID(0); meedia.waitForID(1); meedia.waitForID(2); }catch(InterruptedException e){ System.out.println("Meedia laadimine ebaõnnestus! Lõpetan ..."); System.exit(1); } ///////////////// KASUTAJALIIDES ////////////////////// cmdValikud.add(new Label("Kasutajanimi: ")); cmdValikud.add(cmdKasutajaNimi); cmdValikud.add(new Label("Stiil: ")); cmdValikud.add(cmdOlenServer); cmdOlenServer.addItemListener(this); cmdValikud.add(new Label("Serveri aadress: ")); cmdValikud.add(cmdServeriAadress); cmdValikud.add(cmdTyhjenda); cmdTyhjenda.addActionListener(this); cmdValikud.add(cmdAlusta); cmdAlusta.addActionListener(this); cmdSeaded.add(new Label("")); cmdSeaded.add(cmdValikud); Panel cmdOlukorraPaneel=new Panel(new GridLayout(2,1)); cmdOlukorraPaneel.add(cmdTeated); cmdOlukorraPaneel.add(cmdTagasi); cmdTagasi.setVisible(false); cmdTagasi.addActionListener(this); cmdSeaded.add(cmdOlukorraPaneel); add(cmdSeaded); } public void run(){ while(true){ repaint(); try{ valja.println(Reket1.y); if (olenServer){ valja.println(Pall.x); valja.println(Pall.y); } valja.println((SIGNAAL.isEmpty()?0:((TSignaal)SIGNAAL.remove(0)).info)); valja.flush(); Thread.sleep(40); //~25fps }catch(Exception e){ System.out.println("Viga renderdamisel!"); l6pp(); } } } public void itemStateChanged(ItemEvent e){ if (e.getSource()==cmdOlenServer) cmdServeriAadress.setEnabled(!cmdOlenServer.getState()); } public void l6pp(){ olek=0; SIGNAAL.clear(); tagasiAlgusesse(); serveriElud=kliendiElud=maxElud; olenServer=false; Reket1.x=Laud.x+10; Reket2.x=Laud.x+Laud.width-23; } public void tagasiAlgusesse(){ if (uusYhendus!=null)uusYhendus.interrupt(); if (uusVastaseKuular!=null)uusVastaseKuular.interrupt(); try{ vastasePistik.close(); }catch(Exception eee){} try{ serverPistik.close(); }catch(Exception ee){} add(cmdSeaded); cmdValikud.setVisible(true); cmdTagasi.setVisible(false); cmdTeated.setText(""); } public void actionPerformed(ActionEvent e){ if(e.getSource()==cmdTyhjenda){ cmdKasutajaNimi.setText(""); cmdServeriAadress.setText("localhost"); cmdServeriAadress.setEnabled(true); cmdTeated.setText(""); cmdOlenServer.setState(false); } if(e.getSource()==cmdTagasi){ tagasiAlgusesse(); } if (e.getSource()==cmdAlusta){ String nimi=cmdKasutajaNimi.getText().trim(); if (nimi.length()==0){ cmdTeated.setText("Viga: Palun sisestage kasutajanimi!"); return; } if (!cmdOlenServer.getState() && cmdServeriAadress.getText().trim().length()==0){ cmdTeated.setText("Viga: Palun sisestage serveri aadress!"); return; } cmdValikud.setVisible(false); cmdTagasi.setVisible(true); kasutajaNimi=nimi; olenServer=cmdOlenServer.getState(); uusYhendus=new Yhendus(); } } public void keyPressed(KeyEvent e){ int kood=e.getKeyCode(); if(kood==KeyEvent.VK_UP && Reket1.y>Laud.y){ Reket1.y-=8; } if(kood==KeyEvent.VK_DOWN && Reket1.y<(Laud.y+Laud.height-Reket1.height-20)){ Reket1.y+=8; } if(kood==KeyEvent.VK_S){ if (iseValmis==false){ iseValmis=true; SIGNAAL.add(new TSignaal(1)); new ValmisolekuKuular(); } } } public void keyReleased(KeyEvent e){} public void keyTyped(KeyEvent e){} public void liigutaPalli(){ Pall.x+=pKiirusX; Pall.y+=pKiirusY; if (Pall.y(Laud.y+Laud.height-Pall.height-15)){ Pall.y=(Laud.y+Laud.height-Pall.height-15); pKiirusY*=-1; } } public void pallReketil(Rectangle reket){ if (reket.intersects(Pall)){ if (((Pall.x+Pall.width/2)>(reket.x+reket.width/2) && pKiirusX<0)|| ((Pall.x+Pall.width/2)<(reket.x+reket.width/2) && pKiirusX>0)){ pKiirusX*=-1; } } } public void paint(Graphics g){ if (olek==0){ g.setColor(Color.white); g.fillRect(0,0,getWidth(), getHeight()); return; } if (puhver==null){ puhver=createImage(laius, korgus); puhverg=puhver.getGraphics(); } puhverg.setColor(Color.green); g.setColor(Color.green); puhverg.drawImage(imTaust,0,0,this); switch(olek){ case 2: // loetud sekundid mänguni ... for (int i=3; i>0; i--){ g.setColor(Color.black); g.fillRect(0,0,getWidth(), getHeight()); g.setColor(Color.green); g.drawString(""+i, 200,150); try{Thread.sleep(1000);}catch(Exception e3){} } olek=1; break; case 3: // ühendus katkes case 4: // mäng on läbi. sina võitsid case 5: // mäng läbi. sina kaotasid g.drawImage(imTeateAken, 47,140,this); g.drawString((olek==3?"Ühendus vastasega katkes!":("Mäng on läbi! Sina "+(olek==5?"VÕITSID":"KAOTASID"))),120,170); try{Thread.sleep(3000);}catch(Exception e3){} l6pp(); break; case 1: // mäng käib! if (olenServer) { liigutaPalli(); pallReketil(Reket1); pallReketil(Reket2); if (Pall.xLaud.x+Laud.width-Pall.width){ kliendiElud--; peataM2ng(); if (kliendiElud<=0) { SIGNAAL.add(new TSignaal(6)); olek=5; }else SIGNAAL.add(new TSignaal(4)); } } puhverg.drawImage(imReket, Reket1.x, Reket1.y, this); puhverg.drawImage(imReket, Reket2.x, Reket2.y, this); puhverg.fillOval(Pall.x, Pall.y, Pall.width, Pall.height); puhverg.drawString((olenServer?kasutajaNimi:vastaseNimi), 10,35); puhverg.drawString((olenServer?vastaseNimi:kasutajaNimi), 300,35); puhverg.drawString(""+ (maxElud-kliendiElud)+ " - "+(maxElud-serveriElud),180,35); for(int i=0; i