@@ -9,8 +9,9 @@
import java.util.Set;

import model.Game;
import model.Player;
import model.Tile;
import player.Player;
import model.TileBag;

public class Server {

@@ -23,11 +24,11 @@ public class Server {
private int skipCount;
private int AItime = 3000;

public Server() {
public Server() {
running = true;
game = new Game();
players = new ArrayList<PlayerHandler>();
skipCount =0;
skipCount = 0;
setup = false;
}

@@ -43,27 +44,29 @@ public void run() {
// if connection is closed, use serverSocket.close();

while (running) {
while(!setup){
while (!setup) {
Socket clientSoc;
if(players.size() < GAMESIZE){
if (players.size() < GAMESIZE) {
clientSoc = serverSocket.accept();
System.out.println("ready");
PlayerHandler playerHandler = new PlayerHandler(clientSoc, this);
PlayerHandler playerHandler = new PlayerHandler(
clientSoc, this);
players.add(playerHandler);
new Thread(playerHandler).start();
}
boolean allSet = true;
for(PlayerHandler pH : players){
System.out.println("player " + pH.getplayer() + " is selected");
if(pH.getplayer() == null){
for (PlayerHandler pH : players) {
System.out.println("player " + pH.getplayer()
+ " is selected");
if (pH.getplayer() == null) {
allSet = false;
System.out.println("allSet= " + allSet);
}
}
if(allSet){
if (allSet) {
System.out.println("Let's Go!");
startGame();

}
}
// addHandler(playerHandler);
@@ -74,50 +77,52 @@ public void run() {
e.printStackTrace();
}
}
public void kickplayerFromLobby(PlayerHandler p){
kickPlayerFromLobby(p, "Fock u");

public void kickplayerFromLobby(PlayerHandler p) {
kickPlayerFromLobby(p, "Er is foute informatie naar de server gestuurd");
}
public void kickPlayerFromLobby(PlayerHandler p, String reason){

public void kickPlayerFromLobby(PlayerHandler p, String reason) {
System.out.println("Kicking player " + p + " for " + reason);
if(players.contains(p.getplayer())){
if (players.contains(p.getplayer())) {
int tilesBackToBag = p.getplayer().getHand().size();
broadCast("KICKED " + game.getPlayerNr(p.getplayer()) + " " + tilesBackToBag + " " + reason);
broadCast("KICKED " + game.getPlayerNr(p.getplayer()) + " "
+ tilesBackToBag + " " + reason);
game.kickFromGame(p.getplayer());
players.remove(p);
players.remove(p);
p.quit();
}
}
public void broadCast(String s){

public void broadCast(String s) {
System.out.println("Broadcasting: " + s);
for(PlayerHandler p: players){
for (PlayerHandler p : players) {
p.writeMe(s);
}
}
public Game getGame(){

public Game getGame() {
return game;
}
public void sendNext(){

public void sendNext() {
System.out.println("NEXT send");
game.nextTurn();
broadCast("NEXT " + game.getTurn());
}
public void sendTurn(Player p, Set<Tile> set){

public void sendTurn(Player p, Set<Tile> set) {
System.out.println("Sending TURN");
StringBuilder sb = new StringBuilder();
for(Tile tile : set){
for (Tile tile : set) {
sb.append(" " + tile.toString());
}
broadCast("TURN " + game.getPlayerNr(p) + " " +sb.toString());
broadCast("TURN " + game.getPlayerNr(p) + " " + sb.toString());
}
public void startGame(){

public void startGame() {
TileBag tilebag = game.getTileBag();
for(PlayerHandler p : players){
for (PlayerHandler p : players) {
Set<Tile> tiddies = tilebag.drawSix();
p.getplayer().setHand(tiddies);
p.sendTiles(tiddies);
@@ -126,49 +131,49 @@ public void startGame(){
sendNames();
sendNext();
}
public void sendNames(){

public void sendNames() {
StringBuilder sb = new StringBuilder();
sb.append("NAMES");
for(PlayerHandler p: players){
sb.append(" " + p.getplayer().getName() + " " + game.getPlayerNr(p.getplayer()));
for (PlayerHandler p : players) {
sb.append(" " + p.getplayer().getName() + " "
+ game.getPlayerNr(p.getplayer()));
}
sb.append(" " + AItime);
broadCast(sb.toString());
}
public void skipped(){

public void skipped() {
System.out.println("SKIP received");
if(skipCount >= game.getPlayerAmount()){
int score =0;
if (skipCount >= game.getPlayerAmount()) {
int score = 0;
ArrayList<Player> peoples = new ArrayList<Player>();
for(Map.Entry<Player, Integer> p : game.getScores().entrySet()){
if(p.getValue() > score){
peoples = new ArrayList<Player>();
peoples.add(p.getKey());
score = p.getValue();
} else if(p.getValue() == score){

for (Map.Entry<Player, Integer> p : game.getScores().entrySet()) {
if (p.getValue() > score) {
peoples = new ArrayList<Player>();
peoples.add(p.getKey());
score = p.getValue();
} else if (p.getValue() == score) {
peoples.add(p.getKey());
}
}
if(peoples.size() != 1){
if (peoples.size() != 1) {
broadCast("WINNER " + -1);
} else {
broadCast("WINNER " + game.getPlayerNr(peoples.get(0)));
broadCast("WINNER " + game.getPlayerNr(peoples.get(0)));
}
}else{
skipCount++;
} else {
skipCount++;
}
}
public void skipReset(){

public void skipReset() {
skipCount = 0;
}

public static void main(String[] args) {
new Server().run();
}



}

This file was deleted.

@@ -24,7 +24,8 @@ public boolean validMove(Move move) {
}

// @ pure;
// @ ensures \result == (inLineV(theMove) && inLineH(theMove)) || (theMove.getCoord() == new Coord(MID,MID);
// @ ensures \result == (inLineV(theMove) && inLineH(theMove)) ||
// (theMove.getCoord() == new Coord(MID,MID);
public boolean validMove(Move theMove, List<Move> movesMade) {
boolean answer = true;
if (theMove != null && movesMade != null) {
@@ -70,9 +71,10 @@ public boolean validMove(Move theMove, List<Move> movesMade) {
return answer;
}

//@ pure;
//@ requires m != null;
//@ ensures \result == (\forall Tile tit; m.getShape == tit.getShape) || (\forall Tile tit; m.getColor == tit.getColor);
// @ pure;
// @ requires m != null;
// @ ensures \result == (\forall Tile tit; m.getShape == tit.getShape) ||
// (\forall Tile tit; m.getColor == tit.getColor);
public boolean inLineV(Move m) {
Coord c = m.getCoord();
Tile t = m.getTile();
@@ -115,9 +117,11 @@ public boolean inLineV(Move m) {
}
return answer;
}
//@ pure;
//@ requires m != null;
//@ ensures \result == (\forall Tile tit; m.getShape == tit.getShape) || (\forall Tile tit; m.getColor == tit.getColor);

// @ pure;
// @ requires m != null;
// @ ensures \result == (\forall Tile tit; m.getShape == tit.getShape) ||
// (\forall Tile tit; m.getColor == tit.getColor);
public boolean inLineH(Move m) {
Coord c = m.getCoord();
Tile t = m.getTile();
@@ -161,39 +165,42 @@ public boolean inLineH(Move m) {
return answer;
}

//@ requires move != null;
//@ requires 0 >= move.getCoord().getX() >= DIM;
//@ requires 0 >= move.getCoord().getY() >= DIM;
//@ requires move.getTile != null;
//@ ensures boardSpaces[move.getCoord().getX()][move.getCoord().getY()] == move.getTile();
// @ requires move != null;
// @ requires 0 >= move.getCoord().getX() >= DIM;
// @ requires 0 >= move.getCoord().getY() >= DIM;
// @ requires move.getTile != null;
// @ ensures boardSpaces[move.getCoord().getX()][move.getCoord().getY()] ==
// move.getTile();
public void boardAddMove(Move move) {
if(move != null){
boardSpaces[move.getCoord().getX()][move.getCoord().getY()] = move
.getTile();
usedSpaces = getUsedSpaces();
if (move != null) {
boardSpaces[move.getCoord().getX()][move.getCoord().getY()] = move
.getTile();
usedSpaces = getUsedSpaces();
} else {
//exception for empty move cannot be placed
// exception for empty move cannot be placed
}
}

//@ requires move != null;
//@ ensures (\forall movie; [movie.getCoord().getX()][movie.getCoord().getY()] == movie.getTile());
// @ requires move != null;
// @ ensures (\forall movie;
// [movie.getCoord().getX()][movie.getCoord().getY()] == movie.getTile());
public void boardAddMove(Set<Move> move) {
for (Move movie : move) {
boardAddMove(movie);
}
}
//@ requires coord != null;
//@ requires 0 >= coord.getX() >= DIM;
//@ requires 0 >= coord.getY() >= DIM;
//@ ensures boardSpaces[coord.getX()][coord.getY()] == null

// @ requires coord != null;
// @ requires 0 >= coord.getX() >= DIM;
// @ requires 0 >= coord.getY() >= DIM;
// @ ensures boardSpaces[coord.getX()][coord.getY()] == null
public void boardRemove(Coord coord) {
boardSpaces[coord.getX()][coord.getY()] = null;
}

//@ pure;
//@ ensures (\forall boardSpaces[i][j] != null; result.contains(new Move(boardSpaces[i][j], new Coord(i, j)));

// @ pure;
// @ ensures (\forall boardSpaces[i][j] != null; result.contains(new
// Move(boardSpaces[i][j], new Coord(i, j)));
public Set<Move> getUsedSpaces() {
Set<Move> result = new HashSet<Move>();
for (int i = 0; i < DIM; i++) {
@@ -206,7 +213,7 @@ public Set<Move> getUsedSpaces() {
return result;
}

//@ pure;
// @ pure;
public String toString() {
String sideBox = "|";
String topBox = "────";
@@ -1,19 +1,17 @@
package player;
package model;

import java.util.Set;

import model.Tile;
public class ComputerPlayer extends Player {

public class ComputerPlayer extends Player{

private Strategy strat;

public ComputerPlayer(String name, Set<Tile> hand) {
super(name, hand);
strat = new RetardedStrategy(super.getBoard(), hand);
}
public ComputerPlayer(String name, Set<Tile> hand, Strategy strat){

public ComputerPlayer(String name, Set<Tile> hand, Strategy strat) {
super(name, hand);
this.strat = strat;
}
@@ -36,8 +36,8 @@ public Coord[] getAdjacentCoords() {
return coords;

}
public String toString(){
return horizontal + " "+ vertical;

public String toString() {
return horizontal + " " + vertical;
}
}
@@ -5,66 +5,63 @@
import java.util.Map;
import java.util.Set;

import controller.TileBag;
import player.Player;

public class Game {

private Map<Player, Integer> scores;
private Board board;
private int turn;
private ArrayList<Player> players;
private TileBag tilebag;
public Game(){
board = new Board();
scores = new HashMap();
turn = -1;
players = new ArrayList<Player>();
tilebag = new TileBag();

public Game() {
board = new Board();
scores = new HashMap();
turn = -1;
players = new ArrayList<Player>();
tilebag = new TileBag();
}
public void nextTurn(){

public void nextTurn() {
turn++;
}
public void addPlayer(Player p){
if(!scores.containsKey(p)){
scores.put(p, 0);
players.add(p);
}else{

public void addPlayer(Player p) {
if (!scores.containsKey(p)) {
scores.put(p, 0);
players.add(p);
} else {
System.out.println("Player is already in Game");
}
}
public int getPlayerNr(Player p){

public int getPlayerNr(Player p) {
return players.indexOf(p);
}
public int getPlayerAmount(){

public int getPlayerAmount() {
return players.size();
}
public Board getBoard(){

public Board getBoard() {
return board;
}
public TileBag getTileBag(){

public TileBag getTileBag() {
return tilebag;
}
public int getTurn(){
return turn%getPlayerAmount();

public int getTurn() {
return turn % getPlayerAmount();
}
public void kickFromGame(Player p){
if(players.contains(p)){
players.remove(p);

public void kickFromGame(Player p) {
if (players.contains(p)) {
players.remove(p);
}
}
public Map<Player, Integer> getScores(){

public Map<Player, Integer> getScores() {
return scores;
}

}
@@ -0,0 +1,79 @@
package model;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Set;

public class Player {

private String name;

private Set<Tile> hand;
// A deepCopy is made in case we need to reset the board from the player's
// moves, it is not needed yet.
private Board deepCopy;

private Board board;

private ArrayList<Move> currentMoves;

public Player(String name, Set<Tile> hand) {
this.name = name;
this.hand = hand;
currentMoves = new ArrayList<Move>();
board = new Board();
}

public String getName() {
return name;
}

public Set<Tile> getHand() {
return hand;
}

public void setHand(Set<Tile> newHand) {
hand.addAll(newHand);
}

public void addToHand(Tile tile) {
hand.add(tile);
}

public void makeMove(Tile tile, Coord coord) {
Move movie = new Move(tile, coord);
if (currentMoves.size() == 0) {
deepCopy = board;
}
if (hand.contains(tile) && board.validMove(movie, currentMoves)) {
board.boardAddMove(movie);
currentMoves.add(movie);
hand.remove(movie.getTile());
}
}

public void makeMove(Move move) {
makeMove(move.getTile(), move.getCoord());
}

public void undoMove() {
Move lastMove = currentMoves.get(currentMoves.size() - 1);
board.boardRemove(lastMove.getCoord());
hand.add(lastMove.getTile());
currentMoves.remove(lastMove);
}

public ArrayList<Move> getCurrentMoves() {
return currentMoves;
}

public void confirmTurn() {
currentMoves.removeAll(currentMoves);
}

public Board getBoard() {
return board;
}

}
@@ -0,0 +1,49 @@
package model;

import java.util.HashSet;
import java.util.Set;

public class RetardedStrategy implements Strategy {
// /what
// private Player player;
// Player p = new ComputerPlayer("IDontKnowWhatImDoing", hand);
// what
// public RetardedStrategy(Player player) {
// this.player = player;
// }
private Board board;
private Set<Tile> hand;

public RetardedStrategy(Board b, Set<Tile> h) {
board = b;
hand = h;
}

@Override
public Set<Move> determineMoves() {
Set<Move> result = new HashSet<Move>();
for (Tile hTile : hand) {
for (Move boardTile : board.getUsedSpaces()) {
if (boardTile.getTile().getColor() == hTile.getColor()
|| boardTile.getTile().getShape() == hTile.getShape()) {
Coord[] attempts = boardTile.getCoord().getAdjacentCoords();
result = tryAdjacents(hTile, attempts);
}
}
}

return result;
}

public Set<Move> tryAdjacents(Tile selectedTile, Coord[] attempts) {
Set<Move> result = new HashSet<Move>();
for (Coord attempt : attempts) {
Move movie = new Move(selectedTile, attempt);
if (board.validMove(movie)) {
result.add(movie);
}
}
return result;
}

}
@@ -1,11 +1,11 @@
package player;
package model;

import java.util.Set;

import model.*;

public interface Strategy {

public Set<Move> determineMoves();

}
@@ -13,30 +13,34 @@ public static enum Color {
this.c = ch;
}
}
// the second char (u) used to be a UTF-8 character, but it turned out that the UTF-8 caused several errors.

// the second char (u) used to be a UTF-8 character, but it turned out that
// the UTF-8 caused several errors.
public static enum Shape {
CIRCLE('o', 'o'), DIAMOND('d', 'd'), SQUARE('s', 's'), CLOVER('c','c'), CROSS('x', 'x'), STAR('*', '*');
CIRCLE('o', 'o'), DIAMOND('d', 'd'), SQUARE('s', 's'), CLOVER('c', 'c'), CROSS(
'x', 'x'), STAR('*', '*');
public final char c;
public final char u;
Shape(char c, char u){

Shape(char c, char u) {
this.c = c;
this.u = u;
}
}

private final Shape shape;
private final Color color;
public Tile(Color color, Shape shape){

public Tile(Color color, Shape shape) {
this.shape = shape;
this.color = color;
}
public static Tile buildTile(String s){
if(s.matches("^[ROBYGP][odscx*]$")){

public static Tile buildTile(String s) {
if (s.matches("^[ROBYGP][odscx*]$")) {
Color c = null;
switch (s.toCharArray()[0]){
case 'R':
switch (s.toCharArray()[0]) {
case 'R':
c = Color.RED;
break;
case 'O':
@@ -56,7 +60,7 @@ public static Tile buildTile(String s){
break;
}
Shape sh = null;
switch (s.toCharArray()[1]){
switch (s.toCharArray()[1]) {
case 'o':
sh = Shape.CIRCLE;
break;
@@ -76,39 +80,37 @@ public static Tile buildTile(String s){
sh = Shape.STAR;
break;
}


return new Tile(c, sh);

return new Tile(c, sh);
} else {
return null;
}
}


public Color getColor(){
return color;
public Color getColor() {
return color;
}
public Shape getShape(){

public Shape getShape() {
return shape;
}
public String toString(){

public String toString() {
return (String.valueOf(color.c) + String.valueOf(shape.c));
}
public boolean tileInHand(Set<Tile> hand){

public boolean tileInHand(Set<Tile> hand) {
boolean result = false;
for(Tile inHand :hand){
if(inHand.toString().equals(this.toString())){
for (Tile inHand : hand) {
if (inHand.toString().equals(this.toString())) {
result = true;
break;
}
}
return result;
}
public static void main(String[] args){

public static void main(String[] args) {
Tile t = Tile.buildTile("Bs");
System.out.println(t.toString());
Set<Tile> hand = new HashSet<Tile>();
@@ -119,5 +121,5 @@ public static void main(String[] args){
System.out.println(t.tileInHand(hand));
System.out.println(t instanceof Tile);
}

}
@@ -1,71 +1,68 @@
package controller;
package model;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

import model.Tile;
import model.Tile.Color;
import model.Tile.Shape;
//TODO gebruiken voor de server;
public class TileBag {

// Aantal stenen
public static final int SIZE = 108;
//Aantal stenen in hand

// Aantal stenen in hand
public static final int SIZE_HAND = 6;
//Tiles dat in de bag zitten

// Tiles dat in de bag zitten
private ArrayList<Tile> tiles;
//Creates a bag with 108 tiles in it :)

// Creates a bag with 108 tiles in it :)
public TileBag() {
this.tiles = new ArrayList<>();
for (Tile.Color c : Tile.Color.values()){
for( Tile.Shape s : Tile.Shape.values()){

for (Tile.Color c : Tile.Color.values()) {
for (Tile.Shape s : Tile.Shape.values()) {
this.tiles.add(new Tile(c, s));
this.tiles.add(new Tile(c, s));
this.tiles.add(new Tile(c, s));
}
}
shuffle();
}

// Draw the first tile from the bag and delete it
public Tile drawTile(){
public Tile drawTile() {
shuffle();
return tiles.remove(0);
}
public Tile swapThis(Tile t){

public Tile swapThis(Tile t) {
Tile result = drawTile();
tiles.add(t);
return result;
}
//Draw first round 6 tiles;
public Set<Tile> drawSix(){

// Draw first round 6 tiles;
public Set<Tile> drawSix() {
Set<Tile> hand = new HashSet<>();
for (int i = 0; i < SIZE_HAND; i++){
for (int i = 0; i < SIZE_HAND; i++) {
hand.add(this.drawTile());
}
return hand;
}
//shuffles the tiles
public void shuffle(){

// shuffles the tiles
public void shuffle() {
Collections.shuffle(this.tiles);
}
//return amount of tiles
public int remainingTiles(){

// return amount of tiles
public int remainingTiles() {
return this.tiles.size();
}
public static void main(String[] args){

public static void main(String[] args) {
TileBag tilebag = new TileBag();
System.out.println(tilebag.tiles.toString());
System.out.println(tilebag.tiles.size());
@@ -74,6 +71,5 @@ public static void main(String[] args){
tilebag.shuffle();
System.out.println(tilebag.tiles.toString());
}


}

This file was deleted.

This file was deleted.

This file was deleted.

@@ -1,7 +1,5 @@
package view;

import player.Player;

import java.io.*;
import java.net.Socket;
import java.util.ArrayList;
@@ -11,6 +9,7 @@

import model.Coord;
import model.Move;
import model.Player;
import model.Tile;

public class Client implements Runnable {
@@ -91,22 +90,25 @@ public void run() {
}

}

//@ requires elements != null && elements > 1;
//@ loop_invariant 1 <= i && i < elements.getLength;
//@ loop_invariant (\forall int i; 1<=i && i<elements.lenght; Tile.buildTile(elements[j]) != null;
//@ loop_invariant (\forall int j; 1<=j && j<i; Tile.buildTile(elements[j]).tileInHand(player.getHand);
//@ ensures player.getHand().containsAll(\old(player.getHand()));

// @ requires elements != null && elements > 1;
// @ loop_invariant 1 <= i && i < elements.getLength;
// @ loop_invariant (\forall int i; 1<=i && i<elements.lenght;
// Tile.buildTile(elements[j]) != null;
// @ loop_invariant (\forall int j; 1<=j && j<i;
// Tile.buildTile(elements[j]).tileInHand(player.getHand);
// @ ensures player.getHand().containsAll(\old(player.getHand()));
private void readNew(String[] elements) {
if (elements != null && elements.length > 0){
for(int i=1; i<elements.length; i++){
if (elements != null && elements.length > 0) {
for (int i = 1; i < elements.length; i++) {
player.addToHand(Tile.buildTile(elements[i]));
}
System.out.println("Tiles are added to the players hand");
System.out.println("Tiles are added to the players hand");
}
}
//@ pure;
//@ requires elements != null && elements.length == 2;

// @ pure;
// @ requires elements != null && elements.length == 2;
private void readWinner(String[] elements) {
if (elements.length == 2) {
if (Integer.parseInt(elements[2]) == playernum) {
@@ -115,88 +117,107 @@ private void readWinner(String[] elements) {
System.out.println("You lost! Winning player: " + elements[1]);
}
} else {
//exception for incomplete or faulty WINNER message
// exception for incomplete or faulty WINNER message
}
}
//@ pure;
//@ requires elements != null;

// @ pure;
// @ requires elements != null;
private void readKick(String[] elements) {
if(elements != null && elements.length >= 3){
StringBuilder sb = new StringBuilder();
for(int i=3; i<elements.length; i++){
sb.append(" " + elements[i]);
}
if (Integer.parseInt(elements[1]) == playernum) {
System.out.println("You have been kick from the server.\n Reason:" + sb.toString());
if (elements != null && elements.length >= 3) {
StringBuilder sb = new StringBuilder();
for (int i = 3; i < elements.length; i++) {
sb.append(" " + elements[i]);
}
if (Integer.parseInt(elements[1]) == playernum) {
System.out
.println("You have been kick from the server.\n Reason:"
+ sb.toString());
} else {
System.out.println("Player " + elements[1]
+ " has been kicked from the server.\n Reason:"
+ sb.toString());
}
} else {
System.out.println("Player " + elements[1]+ " has been kicked from the server.\n Reason:"+ sb.toString());
}
}else{
// exception for incomplete KICK received.
}
}

//@ requires elements != null &&(elements.length-1)%3 ==0;
//@ loop_invariant (\forall int i = 1; i<elements.length/3; Tile.buildTile(elements[i])!=null && new Coord(Integer.parseInt(elements[i + 1]),Integer.parseInt(elements[i + 2]) != null;
//@ ensures (\forall int j; 1<j && j<i; player.getBoard.getUsedSpaces.contains(new Move(Tile.buildTile(elements[i]), new Coord(Integer.parseInt(elements[i + 1]),Integer.parseInt(elements[i + 2])))
// @ requires elements != null &&(elements.length-1)%3 ==0;
// @ loop_invariant (\forall int i = 1; i<elements.length/3;
// Tile.buildTile(elements[i])!=null && new
// Coord(Integer.parseInt(elements[i + 1]),Integer.parseInt(elements[i + 2])
// != null;
// @ ensures (\forall int j; 1<j && j<i;
// player.getBoard.getUsedSpaces.contains(new
// Move(Tile.buildTile(elements[i]), new Coord(Integer.parseInt(elements[i +
// 1]),Integer.parseInt(elements[i + 2])))
private void readTurn(String[] elements) {
if(elements != null && (elements.length-1)%3 ==0){
if (elements != null && (elements.length - 1) % 3 == 0) {
for (int i = 1; i < (elements.length) / 3; i++) {
Tile tile = Tile.buildTile(elements[i]);
Coord coord = new Coord(Integer.parseInt(elements[i + 1]),Integer.parseInt(elements[i + 2]));
Coord coord = new Coord(Integer.parseInt(elements[i + 1]),
Integer.parseInt(elements[i + 2]));
player.getBoard().boardAddMove(new Move(tile, coord));
}
System.out.println("Another player's turn has been received.");
} else {
// exception for incomplete TURN received.
// exception for incomplete TURN received.
}
}
//@ pure;
//@ requires elements != null && elements.length == 2;

// @ pure;
// @ requires elements != null && elements.length == 2;
private void readNext(String[] elements) {
if (elements != null && elements.length == 2) {
if (Integer.parseInt(elements[1]) == playernum) {
makeMove();
}
} else {
//exception for incomplete NEXT received.
// exception for incomplete NEXT received.
}
}

//@ pure; (not entirely sure as it does readMove())
//@ ensures (\forall Move m; sb.indexOf(moveCollection[j].toString()) !=null); (this is probably not the correct syntax for this specification)

// @ pure; (not entirely sure as it does readMove())
// @ ensures (\forall Move m; sb.indexOf(moveCollection[j].toString())
// !=null); (this is probably not the correct syntax for this specification)
private void makeMove() {
System.out.println(player.getBoard().toString());
System.out.println("It is your turn! Type the tile with the coordinates x and y. To end the turn type end.");
System.out.println("Your hand contains these tiles.\n"+ player.getHand().toString());
System.out
.println("It is your turn! Type the tile with the coordinates x and y. To end the turn type end.");
System.out.println("Your hand contains these tiles.\n"
+ player.getHand().toString());
ArrayList<Move> moveCollection = readClientPlayerMove();
StringBuilder sb = new StringBuilder();
sb.append("MOVE ");
if(moveCollection.isEmpty()){
if (moveCollection.isEmpty()) {
sb.append("empty");
} else {
for (Move m : moveCollection) {
sb.append(m.toString());
}
for (Move m : moveCollection) {
sb.append(m.toString());
}
}
writeMe(sb.toString());
}

//@ requires elements != null && elements.length % 2 == 0 && elements.length >= 4;
//@ ensures AItime != null;
// @ requires elements != null && elements.length % 2 == 0 &&
// elements.length >= 4;
// @ ensures AItime != null;
private void readNames(String[] elements) {
if (elements != null && elements.length % 2 == 0 && elements.length >= 4) {
if (elements != null && elements.length % 2 == 0
&& elements.length >= 4) {
for (int i = 0; i < (elements.length - 2) / 2; i++) {
System.out.println("Player: " + elements[i * 2 + 2] + " - "+ elements[i * 2 + 1]);
System.out.println("Player: " + elements[i * 2 + 2] + " - "
+ elements[i * 2 + 1]);
}
AItime = Integer.parseInt(elements[elements.length - 1]);
System.out.println("AITime = " + AItime);
} else {
//exception for incomplete NAMES.
// exception for incomplete NAMES.
}
}
//@requires elements != null && elements.length ==3;

// @requires elements != null && elements.length ==3;
private void readWelcome(String[] elements) {
if (elements != null && elements.length == 3) {
if (elements[1].equals(player.getName())) {
@@ -205,47 +226,54 @@ private void readWelcome(String[] elements) {
System.out.println("You are player " + playernum);
}
} else {
//exception for incomplete WELCOME.
// exception for incomplete WELCOME.
}
}
//@ ensures \result == player.getCurrentMoves && \result != null;
public ArrayList<Move> readClientPlayerMove(){

// @ ensures \result == player.getCurrentMoves && \result != null;
public ArrayList<Move> readClientPlayerMove() {
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
String lline = scan.nextLine();
String[] words = lline.split(" ");
if(words[0].equals("end")){
System.out.println("You have ended your move.");
break;
}else if(words.length == 3 && words[0].matches("^[ROBYGP][odscx\\*]") && words[1].matches("\\d{1,3}") && words[2].matches("\\d{1,3}") && Tile.buildTile(words[0]).tileInHand(player.getHand())){
Tile t = Tile.buildTile(words[0]);
int x = Integer.parseInt(words[1]);
int y = Integer.parseInt(words[2]);
Move attempt = new Move(t, new Coord(x,y));
if(player.getBoard().validMove(attempt)){
player.makeMove(attempt);
while (scan.hasNext()) {
String lline = scan.nextLine();
String[] words = lline.split(" ");
if (words[0].equals("end")) {
System.out.println("You have ended your move.");
player.confirmTurn();
break;
} else if (words.length == 3
&& words[0].matches("^[ROBYGP][odscx\\*]")
&& words[1].matches("\\d{1,3}")
&& words[2].matches("\\d{1,3}")
&& Tile.buildTile(words[0]).tileInHand(player.getHand())) {
Tile t = Tile.buildTile(words[0]);
int x = Integer.parseInt(words[1]);
int y = Integer.parseInt(words[2]);
Move attempt = new Move(t, new Coord(x, y));
if (player.getBoard().validMove(attempt)) {
player.makeMove(attempt);
System.out.println(player.getBoard().toString());
System.out.println(player.getHand().toString());
System.out
.println("End turn by typing 'end' or make another move.");
} else {
System.out.println("The given move is invalid");
}
} else if (words[0].equals("undo")) {
System.out.println("You undid your previous move.");
player.undoMove();
System.out.println(player.getBoard().toString());
System.out.println(player.getHand().toString());
System.out.println("End turn by typing 'end' or make another move.");
}else{
System.out.println("The given move is invalid");
System.out
.println("End turn by typing 'end' or make another move.");
} else {
System.out.println("The input was not correct, try again.");
}
} else if(words[0].equals("undo")){
System.out.println("You undid your previous move.");
player.undoMove();
System.out.println(player.getBoard().toString());
System.out.println("End turn by typing 'end' or make another move.");
} else {
System.out.println("The input was not correct, try again.");
}
}
System.out.println(player.getCurrentMoves().toString());
scan.close();
return player.getCurrentMoves();
}

//@ pure;
// @ pure;
public void sendHello() {
try {
writeMe("HELLO " + player.getName());
@@ -258,8 +286,9 @@ public void sendHello() {
public static void main(String[] args) {
new Client().run();
}
//@ pure;
public void writeMe(String s){

// @ pure;
public void writeMe(String s) {
try {
out.write(s);
out.newLine();