Merge remote-tracking branch 'origin/SerainaSpiellogik' into SerainaSpiellogik

This commit is contained in:
Alexander Sazonov 2022-04-09 23:36:01 +02:00
commit 1db4042bc7
4 changed files with 86 additions and 48 deletions

View File

@ -77,30 +77,50 @@ public class Client {
* Tells user to enter a position to vote for passenger at that position * Tells user to enter a position to vote for passenger at that position
*/ */
public void voteGetter(String msg) { public void voteGetter(final String msg) {
int msgIndex = msg.indexOf('$'); /*TODO(Jonas): find a way to integrate this with userInput listener, so we can still send the
String position = msg.substring(0, msgIndex);; * position to the server. This way doesnt work, after a game is finished it thinks you still
msg = msg.substring(msgIndex + 1); * want to vote when entering /c msg
Scanner userInput = new Scanner(System.in); */
//TODO(Seraina): implement new Thread(new Runnable() {
System.out.println(msg); @Override
System.out.println("Please enter your vote"); public void run() {
int vote; int msgIndex = msg.indexOf('$');
String input = ""; String position = msg.substring(0, msgIndex);
try { String justMsg = msg.substring(msgIndex + 1);
input = userInput.nextLine(); BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
vote = Integer.parseInt(input); while (socket.isConnected() && !socket.isClosed()) {
LOGGER.info("input is: " + vote); try {
} catch (Exception e) { if (bfr.ready()) {
LOGGER.warn(e.getMessage()); System.out.println(justMsg);
System.out.println("Invalid vote"); System.out.println("Please enter your vote");
input = String.valueOf(Integer.MAX_VALUE); String msgInput = bfr.readLine();
} int vote;
sendMsgToServer(Protocol.votedFor + "$" + position + "$" + input); try {
LOGGER.debug("msg to server is: " + Protocol.votedFor + "$" + position + "$" + input); vote = Integer.parseInt(msgInput);
LOGGER.info("input is: " + vote);
} catch (Exception e) {
LOGGER.warn(e.getMessage());
System.out.println("Invalid vote");
msgInput = String.valueOf(Integer.MAX_VALUE);
}
sendMsgToServer(Protocol.votedFor + "$" + position + "$" + msgInput);
LOGGER.debug(
"msg to server is: " + Protocol.votedFor + "$" + position + "$" + msgInput);
Thread.sleep(5);
}
//LOGGER.debug("just checked next line");
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
} }
/** /**
* Starts a thread which listens for incoming chat messages / other messages that the user * Starts a thread which listens for incoming chat messages / other messages that the user
* has to see * has to see

View File

@ -98,7 +98,7 @@ public class Protocol {
public static final String startANewGame = "STGAM"; public static final String startANewGame = "STGAM";
/** /**
* Client informs server that they have voted and delivers this vote in the form of "CVOTE$position" * Client informs server that they have voted and delivers this vote in the form of "CVOTE$position$vote"
*/ */
public static final String votedFor = "CVOTE"; public static final String votedFor = "CVOTE";

View File

@ -1,6 +1,9 @@
package ch.unibas.dmi.dbis.cs108.multiplayer.server; package ch.unibas.dmi.dbis.cs108.multiplayer.server;
import ch.unibas.dmi.dbis.cs108.BudaLogConfig; import ch.unibas.dmi.dbis.cs108.BudaLogConfig;
import ch.unibas.dmi.dbis.cs108.gamelogic.Game;
import ch.unibas.dmi.dbis.cs108.gamelogic.TrainOverflow;
import ch.unibas.dmi.dbis.cs108.gamelogic.VoteHandler;
import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.Protocol; import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.Protocol;
import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.ServerPinger; import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.ServerPinger;
import java.io.*; import java.io.*;
@ -182,6 +185,44 @@ public class ClientHandler implements Runnable {
} }
} }
/**
* Takes a msg of the form position$vote and extracts vote and position from it and saves it
* in VoteHandler.getClientVoteData
* @param msg the messaged to decode
*/
public void decodeVote(String msg){
int msgIndex = msg.indexOf('$');
int vote = Integer.MAX_VALUE;
int position = 0;
LOGGER.debug("Message is " + msg);
try {
position = Integer.parseInt(msg.substring(0,msgIndex));
vote = Integer.parseInt(msg.substring(msgIndex + 1));
LOGGER.debug("Vote is:" + vote);
} catch (Exception e) {
LOGGER.warn("Invalid vote " + e.getMessage());
}
LOGGER.debug("Vote is:" + vote);
if(vote != Integer.MAX_VALUE) { //gets MAX_VALUE when the vote wasn't valid
VoteHandler.getClientVoteData().setVote(position,vote);
LOGGER.debug("Player vote: " + vote);
VoteHandler.getClientVoteData().setHasVoted(position,true);
}
}
/**
* Initializes a new Game instance and starts its run method in a new thread
*/
public void startNewGame() {
try {
Game game = new Game(this,6,1, ClientHandler.getConnectedClients().size());
Thread t = new Thread(game);
t.start();
} catch (TrainOverflow e) {
LOGGER.warn(e.getMessage());
}
}
/** /**
* Removes & disconnects the client. To be used if a severe connection loss is detected (i.e. if trying to * Removes & disconnects the client. To be used if a severe connection loss is detected (i.e. if trying to
* send / receive a message throws an exception, not just if ping-pong detects a connection loss). * send / receive a message throws an exception, not just if ping-pong detects a connection loss).

View File

@ -78,34 +78,11 @@ public class JServerProtocolParser {
case Protocol.votedFor: case Protocol.votedFor:
LOGGER.debug("Made it here"); LOGGER.debug("Made it here");
msg = msg.substring(6); msg = msg.substring(6);
int msgIndex = msg.indexOf('$'); h.decodeVote(msg);
int vote = Integer.MAX_VALUE;
int position = 0;
LOGGER.debug("Message is " + msg);
try {
position = Integer.parseInt(msg.substring(0,msgIndex));
vote = Integer.parseInt(msg.substring(msgIndex + 1));
LOGGER.debug("Vote is:" + vote);
} catch (Exception e) {
LOGGER.warn("Invalid vote " + e.getMessage());
}
LOGGER.debug("Vote is:" + vote);
if(vote != Integer.MAX_VALUE) { //gets MAX_VALUE when the vote wasn't valid
VoteHandler.getClientVoteData().setVote(position,vote);
LOGGER.debug("Player vote: " + vote);
VoteHandler.getClientVoteData().setHasVoted(position,true);
}
break; break;
case Protocol.startANewGame: case Protocol.startANewGame:
try { h.startNewGame();
break;
Game game = new Game(h,6,1, ClientHandler.getConnectedClients().size());
Thread t = new Thread(game);
t.start();
} catch (TrainOverflow e) {
LOGGER.warn(e.getMessage());
}
default: default:
System.out.println("Received unknown command"); System.out.println("Received unknown command");
} }