//Tennis Boll spel import java.awt.*; public class rzpong extends java.applet.Applet implements Runnable { static final int statusBarHt=20; static final int numTopScores=5; static final int minSleepTime=20; static final int openingScreen=1; static final int fadeOut=2; static final int gameOver=3; static final int limbo=4; static final int normalPlay=5; static final int ballDiameter=50; //storlek på boll i diameter static final int maxBallVelocity=10; static final int paddleHt=70; //stöt höjd static final int paddleWidth=10; //stöt bredd static final int serveBall=10; static final int you=0; static final int pc=1; static final double lookForBallFreq=1; static final int X=0; static final int Y=1; static final int oldX=2; static final int oldY=3; Button avsl = new Button("Avsluta"); static int gameMode=openingScreen; long startTime; int height,width; // höjd och bredd of applet int topScores[][]=new int[numTopScores][2]; // lagrar 5 top poäng int yStatusBar,topStatusBar; int sleepTime; // värde som används vid sleep i Trådar int fadeCt; // Räknare för fadeCt int yPaddle[],xPaddle[],yPaddleOld[],paddleScore[]; int ball[],ballsUsed,maxBalls; int yPaddleMax,ballVelocity[]; int yPaddleVelocityPc=10; int lastPoint=pc; int timeToServe=0; int xMidCourt; boolean ballInPlay; Thread myThread=null; Image offScrImage; Graphics offScrGraphics; FontMetrics fontMetrics; Rectangle rBall; Rectangle paddle[]=new Rectangle[2]; public final void init() { String s; //sträng s int i; add(avsl); //lägger till knapp i containern width=size().width; //bredden är lika med storlek().bredd height=size().height; //samma som ovanför xMidCourt=width/2; yStatusBar=height - (statusBarHt/4); topStatusBar=height-statusBarHt; s = getParameter("sleepTime"); //snabbhet sleepTime= (s==null) ? 10: Integer.parseInt(s); s = getParameter("maxBalls"); //hur många bollar i varje omgång maxBalls= (s==null) ? 10: Integer.parseInt(s); ball=new int[4]; //boll=nytt heltals array som tar 4 heltal ballVelocity=new int[2]; yPaddleMax=topStatusBar-paddleHt; yPaddle=new int[2]; //y = 2 arrays xPaddle=new int[2]; //x = 2 arrays xPaddle[you]=15; //x stöt tar 15 xPaddle[pc]=width-paddleWidth-xPaddle[you]; //hur pc ska uppfatta var varje boll är yPaddleOld=new int[2]; paddleScore=new int[2]; for (i=0; i 0.5) //om i är större än 0.5 i=1; //då sätts i s värde till 1 else //annars i=-1; //i sätts till -1 ballVelocity[X]=(int)((Math.random()*maxBallVelocity)+7); //BESTÄMMER ETT SLUMPVÄRDE OCH HUR SNABBT VARJE SKA STUDSA I X LED ballVelocity[Y]= (int)(i) * (int)((Math.random()*maxBallVelocity)+7); //SAMMA SOM OVAN BARA I Y LED!! } public final void start() //start tråden!!! { startTime=System.currentTimeMillis(); if (myThread==null) { myThread= new Thread(this); myThread.start(); } } public final void stop() //stopp tråden { myThread.stop(); myThread=null; gameMode=gameOver; //antingen sant eller falskt } public final void run() //tråden går { while (myThread !=null) { repaint(); //ritar om och anropar paint try { myThread.sleep(Math.max(startTime-System.currentTimeMillis(), minSleepTime)); } catch (InterruptedException e) {} startTime=System.currentTimeMillis()+sleepTime; } } public final void showNormalPlay() { int i,j=0; if (ballInPlay) { // tar bort stötarna offScrGraphics.setColor(Color.red); //sätter spelplanen till röd for (i=0; i<2; i++) { // lägger poängen i ordning offScrGraphics.fillRect(xPaddle[i],yPaddleOld[i],paddleWidth,paddleHt); } // tar bort boll offScrGraphics.fillRect(ball[oldX],ball[oldY],ballDiameter,ballDiameter); // sätter ny position för stöten // kollar om bollen är ovanför eller under stöten "PC:n tänkande" if (ballVelocity[X] > 0 && ball[X] > xMidCourt && Math.random() <= lookForBallFreq) { if (ballVelocity[Y] > 0 && ball[Y] + ballDiameter > yPaddle[pc]) j=Math.abs(yPaddleVelocityPc); //Math.abs=gör ett minustal till + tal else if (ballVelocity[Y] < 0 && ball[Y] < yPaddle[pc]+paddleHt) j=-1 * (Math.abs(yPaddleVelocityPc)); //GÖR SÅ ATT Y PADDELN KAN ÄVEN GÅ I Y RIKTNING } if (yPaddle[pc]+j <= 0 || yPaddle[pc]+j >= topStatusBar-paddleHt) j*=-1;//J=J*-1 yPaddle[pc]+=j;//SAMMA SOM YPADDLE[PC]=YPADDLE[PC]+J; // ritar stötarna offScrGraphics.setColor(Color.blue); //blå färg på stötarna for (i=0; i<2; i++) { offScrGraphics.fillRect(xPaddle[i],yPaddle[i],paddleWidth,paddleHt); paddle[i]=new Rectangle(xPaddle[i],yPaddle[i],paddleWidth,paddleHt); yPaddleOld[i]=yPaddle[i]; } // sätter ny boll position // datorn vinner poängen if (ball[X]+ballVelocity[X] < 0) { ballsUsed++; //ÖKAR BOLLSANVÄNDNING paddleScore[pc]++; lastPoint=pc; //SISTA POÄNG ÄR PC ballInPlay=false; showNewScore(); //ANROPAR showNewScore } // I win poÄNG DU VINNER POÄNGEN else if (ball[X]+ballVelocity[X] > width-ballDiameter) { ballsUsed++; //ÖKA MED 1 paddleScore[you]++; lastPoint=you; //SÄTTER SISTA POÄNGEN TILL DIG ballInPlay=false; //bollar igång går ej showNewScore(); } else { // ritar boll if (ball[Y]+ballVelocity[Y] < 0 || ball[Y]+ballDiameter+ballVelocity[Y] > topStatusBar-ballDiameter) ballVelocity[Y]*=-1; rBall=new Rectangle(ball[X]+ballVelocity[X],ball[Y]+ballVelocity[Y], ballDiameter,ballDiameter); if (rBall.intersects(paddle[you])) setBallVelocity(); //anropar setBallVelocity else if (rBall.intersects(paddle[pc])) { setBallVelocity(); ballVelocity[X]*=-1; } ball[X]+=ballVelocity[X]; ball[Y]+=ballVelocity[Y]; ball[oldX]=ball[X]; ball[oldY]=ball[Y]; //färg på Bollen offScrGraphics.setColor(Color.yellow); offScrGraphics.fillOval(ball[X],ball[Y],ballDiameter,ballDiameter); //fylld oval som boll } } else timeToServe++; // kollar om antingen mina eller datorns poäng är större eller lika med if (paddleScore[you] >=maxBalls || paddleScore[pc] >= maxBalls) { gameMode=fadeOut; fadeCt=0; } if (timeToServe == serveBall) createBall(); } public final void showNewScore() //visar poängen i statusbaren { offScrGraphics.setColor(Color.green); //under färg offScrGraphics.fillRect(0,height-statusBarHt,width,statusBarHt); offScrGraphics.setColor(Color.black); //färg på bokstäverna offScrGraphics.drawString("Du: "+paddleScore[you],10,yStatusBar); offScrGraphics.drawString("Pc: "+paddleScore[pc],width-60,yStatusBar); //visar poängen på statusbaren } public final void showOpeningScreen() //första bilden { String buf; //sträng hantering int i, j=height/2; offScrGraphics.setColor(Color.white); //färg offScrGraphics.fillRect(0,0,width,height); offScrGraphics.setColor(Color.blue); buf="Spela Ping-Pong-tennis mot Datorn!"; offScrGraphics.drawString(buf, (width-fontMetrics.stringWidth(buf))/2, j - 50); offScrGraphics.setColor(Color.black); buf="Tryck på musen för att starta nytt spel."; offScrGraphics.drawString(buf, (width-fontMetrics.stringWidth(buf))/2,j); buf="Flytta musen för att kontrollera stöten."; offScrGraphics.drawString(buf, (width-fontMetrics.stringWidth(buf))/2,j+25); buf="Först till 10 poäng Vinner!!"; offScrGraphics.drawString(buf, (width-fontMetrics.stringWidth(buf))/2,j+48); gameMode=limbo; ballInPlay=false; ballsUsed=0; timeToServe=0; return; } public final void showScoreBoard() //slut poängen { String buf; int i,k,j=height/2; sortScores(); //anropar sortScores offScrGraphics.setColor(Color.white); offScrGraphics.fillRect(0,0,width,height); buf="Top Poäng"; k=(width-fontMetrics.stringWidth(buf))/2; offScrGraphics.setColor(Color.black); offScrGraphics.drawString(buf, k,j - 85); buf="Du - PC"; k=(width-fontMetrics.stringWidth(buf))/2; offScrGraphics.setColor(Color.blue); offScrGraphics.drawString(buf, k,j - 65); for (i=0; i topScores[i][you]) { j=i; break; } } // System.out.println("j="+j); for (i=numTopScores-1; i>j; i--) { topScores[i][you]=topScores[i-1][you]; topScores[i][pc ]=topScores[i-1][pc ]; } topScores[j][you]=paddleScore[you]; topScores[j][pc] =paddleScore[pc]; return; } public final void showFadeOut() { int i, j=topStatusBar/2; fadeCt+=4; offScrGraphics.setColor(Color.black); if (fadeCt <= j) { offScrGraphics.fillRect(0,j-fadeCt ,width,4); offScrGraphics.fillRect(0,j+fadeCt-4,width,4); } else { offScrGraphics.setColor(Color.red); offScrGraphics.fillRect(0,0,width,topStatusBar); if (ballsUsed >= maxBalls) //om bollar är större än maxBollar gameMode=gameOver; //är det game over else gameMode=normalPlay; showNewScore(); } return; } // tar emot händelserna public boolean handleEvent(Event e) { if (e.target == avsl) //knapp System.exit(1); //avslutar if (e.id == Event.MOUSE_MOVE) //mouse_move event styr paddeln { if (e.y < 0) yPaddle[you]=0; else if (e.y > yPaddleMax) yPaddle[you]=yPaddleMax; else yPaddle[you]=e.y; } else if (e.id == Event.MOUSE_DOWN) { if (gameMode==limbo) { gameMode=fadeOut; fadeCt=0; } //else if (gameMode==normalPlay && ! ballInPlay) createBall(); } return super.handleEvent(e); } public final void update (Graphics g) //updaterar varje bild spel!! { if (gameMode != limbo) { if (gameMode==fadeOut) showFadeOut(); else if (gameMode==gameOver) showScoreBoard(); //anropar showscoreboard om man är klar else if (gameMode==openingScreen) showOpeningScreen(); else showNormalPlay(); paint(g); } } public final void paint(Graphics g) { g.drawImage(offScrImage,0,0,this); /*g.setColor(Color.black); for(int ab=0;ab<2;ab++) { if (ab!=1) g.drawLine(300/2,0,300/2,300); else System.out.println("fel"); } */ } }