package cnam.nsy208.sudoku.model;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Vector;
/**
*
* @author lca
*/
public class Ranking {
private Vector _players ;
/**
* Permet d'initialiser les variables
* @return
*/
public Ranking() {
_players = new Vector();
}
/**
* Modifie le score d'un joueur
* @param number : Numéro du joueur
* @param score : score du joueur
* @return
*/
public void setScore(int number, int score) {
for (int i = 0; i < _players.size(); i++) {
if (((Player) (_players.elementAt(i))).getNumber() == number) {
((Player) (_players.elementAt(i))).setScore(score);
}
}
}
/**
* Ajoute un joueur au classement
* @param Player : Joueur à ajouter
* @return
*/
public void addPlayer(Player player) {
_players.addElement(player);
}
/**
* Ajoute un joueur au classement avec son score, pseudo et numéro
* @param number : Numéro du joueur
* @param pseudo : pseudo du joueur
* @param score : score du joueur
* @return
*/
public void addPlayer(int number, String pseudo, int score) {
_players.addElement(new Player(number, pseudo, score));
}
/**
* Supprime un joueur au classement
* @param Player : Joueur à supprimer
* @return
*/
public void delPlayer(Player player) {
_players.removeElement(player);
}
/**
* Retourne le nombre de joueur du classement
* @return Nombre de joueur du classement
*/
public int getNbPlayer() {
return _players.size();
}
/**
* Trie les joueurs en fonction de leurs scores
* @return Classement trié
*/
public Vector sortRanking() {
// Classement décroissant car le score correspond au temps en secondes
// Donc le meilleur est le score de plus petit
for (int i = 0; i < _players.size() - 1; ++i) {
for (int j = i; j < _players.size(); ++j) {
Player player1 = (Player) _players.elementAt(i);
Player player2 = (Player) _players.elementAt(j);
if (player1.getScore() > player2.getScore()) {
_players.setElementAt(player2, i);
_players.setElementAt(player1, j);
}
}
}
return _players;
}
/**
* Retourne le classement au format texte
* @return Classement au format texte
*/
public String toString() {
String msg = "";
for (int i = 0; i < _players.size(); ++i) {
msg = msg + ((Player) (_players.elementAt(i))).toString() + "\n";
}
return msg;
}
/**
* Transforme le classement en tableau de BYTE
* @return Classement au format BYTE
*/
public byte[] getBytes() throws Exception {
ByteArrayOutputStream baos = null;
baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
baos.reset();
for (int i = 0; i < 10 && i < _players.size(); ++i) {
Player play = (Player) _players.elementAt(i);
dos.writeInt(play.getNumber());
dos.writeInt(play.getScore());
char[] name = play.getPseudo().toCharArray();
for (int j = 0; j < play.getPseudo().length(); j++) {
dos.writeChar(name[j]);
}
if (play.getPseudo().length() < 5) {
for (int j = play.getPseudo().length(); j < 5; j++) {
dos.writeChar(' ');
}
}
}
dos.flush();
return baos.toByteArray();
}
/**
* Affecte le classement à partir d'un tableau de BYTE
* @param data
* Tableau de BYTE
*/
public void setBytes(byte[] data) {
try {
ByteArrayInputStream bais = new ByteArrayInputStream(data);
DataInputStream dis = new DataInputStream(bais);
for (int i = 0; i < 9 && dis.available() > 0; ++i) {
try {
int number = dis.readInt();
int score = dis.readInt();
char[] name = new char[5];
for (int j = 0; j < 5; j++) {
name[j] = dis.readChar();
}
String pseudo = new String(name);
Player play = new Player(number, pseudo, score);
this.addPlayer(play);
} catch (IOException ex) {
ex.printStackTrace();
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}