import javax.swing.*; import java.awt.*; import java.util.*; class SnakeBuilder implements Runnable{ private Paper paper = null; //Konstant som anger med vilken frekvens frukterna placeras ut private static final int ROUND_TIME = 60; private static final int SLEEP_TIME = 85; private static final int UP = 0; private static final int DOWN = 1; private static final int LEFT = 2; private static final int RIGHT = 3; //Alla knapptryckningar lagras i denna lista tills programmet reagerar på //dem. Detta förhindrar fel som uppstår vid för snabba knapptryckningar //samt bidrar till bättre spelkänsla private LinkedList directionList = null; private int direction = 0; private int x = 0; private int y = 0; public boolean gameOver; private int snakeSize = 15; public LinkedList fr = null; public SnakeBuilder(Paper paper){ gameOver = false; directionList = new LinkedList(); fr = new LinkedList(); if (paper.isServer){ x = 1; y = 2; direction = RIGHT; }else{ x = 47; y = 35; direction = LEFT; } this.paper = paper; Thread thread = new Thread(this); thread.start(); } //Om riktningen är vänster ska programmet inte reagera vid varken vänster -eller högerknapp. //Samma princip gäller alla riktningsfunktioner public void snakeLeft(){ int last; if (!directionList.isEmpty()) last = directionList.getLast(); else last = direction; if (last != RIGHT && last != LEFT) directionList.add(new Integer(LEFT)); } public void snakeRight(){ int last; if (!directionList.isEmpty()) last = directionList.getLast(); else last = direction; if (last != RIGHT && last != LEFT) directionList.add(new Integer(RIGHT)); } public void snakeUp(){ int last; if (!directionList.isEmpty()) last = directionList.getLast(); else last = direction; if (last != UP && last != DOWN) directionList.add(new Integer(UP)); } public void snakeDown(){ int last; if (!directionList.isEmpty()) last = directionList.getLast(); else last = direction; if (last != UP && last != DOWN) directionList.add(new Integer(DOWN)); } public Point nextPoint(){ if (!directionList.isEmpty()) direction = directionList.remove(); switch (direction){ case 0: y--;break; case 1: y++;break; case 2: x--;break; case 3: x++;break; } Point p = new Point(x, y); //Om det i nästa punkt finns en frukt så tar vi bort den från fruktlistan //och ökar på ormens storlek. if (fr.remove(p)) snakeSize+=7; //Om nästa punkt inte är tillåten är spelet slut if (paper.hostList.contains(p) || paper.remoteList.contains(p) || x < 0 || x > 49 || y < 0 || y > 37){ gameOver = true; paper.sendGameOver(); paper.whoWon = "Game Over"; return new Point(-1, -1); } return p; } public void run(){ int fruitsRound = ROUND_TIME; Point p = null; Random rand = new Random(); String fruitsToSend; while (!gameOver){ //frukter hanteras endast av den som utsetts till server if (paper.isServer){ fruitsRound--; if (fruitsRound == 0){ fr.clear(); fruitsRound = ROUND_TIME; fruitsToSend = ""; for (int i = 0; i < paper.fruits.length; i++){ p = new Point(rand.nextInt(48), rand.nextInt(36)); if (!paper.hostList.contains(p) && !paper.remoteList.contains(p)){ fr.add(p); paper.fruits[i] = p; fruitsToSend += (int)p.getX()+" "+(int)p.getY()+" "; }else i--; } paper.sendFruits(fruitsToSend); paper.newFruits = true; } } if (snakeSize > 0){ paper.addPoint(nextPoint()); snakeSize--; } //När ormen inte längre växer måste vi ta bort sista kvadraten else if (snakeSize == 0) paper.addPoint(nextPoint(), (Point)paper.hostList.remove(0)); try{ Thread.sleep(SLEEP_TIME); }catch(Exception e){ e.printStackTrace(); } } } }