#include <rps.h> #include <bwio.h> #include <types.h> int RPSServer(){ char Name[] = "RPSServer"; int TaskID, Result, Client1, Client2, Diff; RPSMessage ReceiveMsg, ReplyMsg; RPSChoice Client1Move = None, Client2Move = None; Result = RegisterAs(&Name); if(Result == FAILURE) { bwprintf(COM2, "RPSClient1: Cannot register Client1\n\r"); return FAILURE; } FOREVER { Status = Receive(&TaskID, &ReceiveMsg, sizeof(ReceiveMsg)); switch (ReceiveMsg.Msg) { case Quit: if (Client1 == TaskID) { Client1 = 0; } else Client2 = 0; ReplyMsg.Msg = Bye; Reply(TaskID, &ReplyMsg, sizeof(ReplyMsg)); break; case SignUp: if (Client1 == 0 && Client2 != Client1) Client1 = TaskID; else Client2 = TaskID; if (Client1 && Client2) ReplyMsg.Msg = LetsPlay; Reply(TaskID, &ReplyMsg, sizeof(ReplyMsg)); break; case Play: // only one player if (Client1 == 0 || Client2 == 0) { Reply.Msg = OnePlayer; Reply(TaskID, &ReplyMsg, sizeof(ReplyMsg)); break; } if (Client1 == TaskID) Client1Move = ReceiveMsg.Choice; else Client2Move = ReceiveMsg.Choice; if (Client1Move != None && Client2Move != None) { Diff = (int) Client1Move - (int)Client2Move; if (Diff == 0) { Reply.Msg = Draw; bwprintf(COM2, "We have a Draw."); Reply(Client1, &ReplyMsg, sizeof(ReplyMsg)); Reply(Client2, &ReplyMsg, sizeof(ReplyMsg)); } else if (Diff == 1 || Diff == -2) { bwprintf(COM2, "Client1 Wins."); Reply.Msg = Win; Reply(Client1, &ReplyMsg, sizeof(ReplyMsg)); Reply.Msg = Lose; Reply(Client2, &ReplyMsg, sizeof(ReplyMsg)); } else { bwprintf(COM2, "Client2 Wins."); Reply.Msg = Lose; Reply(Client1, &ReplyMsg, sizeof(ReplyMsg)); Reply.Msg = Win; Reply(Client2, &ReplyMsg, sizeof(ReplyMsg)); } } Client1Move = Client2Move = None; break; default: break; } } return SUCCESS; } int RPSClient1(){ char Name[] = "RPSClient1" char Input = 'U'; // for Undefined RPSMsgType RPSResult = TIE; int Client1ID, ServerID, Result; RPSMessage SendMsg, ReplyMsg; Result = RegisterAs(&Name); if(Result == FAILURE) { bwprintf(COM2, "RPSClient1: Cannot register Client1\n\r"); return FAILURE; } TaskID = MyTid(); bwprintf(COM2, "Client 1 with TaskID(%d) is about to Play\n\r", TaskID); ServerTID = WhoIs("RPSServ"); if (ServerTID < 0) return FAILURE; SendMsg.Msg = SignUp; Result = Send(ServerTID, &SendMsg, sizeof(SendMsg), &ReplyMsg, sizeof(ReplyMsg)); if (Result != sizeof(ReplyMsg)) { bwprintf(COM2, "Sign Up Request to Server did not go through."); return Result; } if (ReplyMsg.MsgType == ServerFull) TODOTODOTODOTODO while (RPSResult == Draw) { while (Input == 'U') { Input = bwgetc(COM2); if (Input == 'r' || Input == 'R') { SendMsg.Choice = Rock; break; } else if (Input == 'p' || Input == 'P') { SendMsg.Choice = Paper; break; } else if (Input == 's' || Input == 'S') { SendMsg.Choice = Scissors; break; } else { Input = 'U'; bwprintf(COM2, "Please enter r/R for Rock, p/P for Paper, s/S for Scissors.\n\r"); } } SendMsg.Msg = Play; Result = Send(ServerTID, &SendMsg, sizeof(SendMsg), &ReplyMsg, sizeof(ReplyMsg)); if (Result != sizeof(ReplyMsg)) { bwprintf(COM2, "Client 1: Game obstructed!"); return FAILURE; } GameResult = ReplyMsg.MsgType; } SendMsg.Msg = Quit; Result = Send(ServerTID, (void*)SendMsg, sizeof(SendMsg), (void*)&ReplyMsg, sizeof(ReplyMsg)); if (Result != sizeof(ReplyMsg)) { bwprintf(COM2, "Request for QUIT from Client 1 did not go through gracefully."); return FAILURE; } bwprintf(COM2, "Client 1 exitting...") Exit(); return SUCCESS; } int RPSClient2(){ char Name[] = "RPSClient2" char Input = 'U'; // for Undefined RPSMsgType RPSResult = TIE; int Client1ID, ServerID, Result; RPSMessage SendMsg, ReplyMsg; Result = RegisterAs(&Name); if(Result == FAILURE) { bwprintf(COM2, "RPSClient1: Cannot register Client1\n\r"); return FAILURE; } TaskID = MyTid(); bwprintf(COM2, "Client 1 with TaskID(%d) is about to Play\n\r", TaskID); ServerTID = WhoIs("RPSServ"); if (ServerTID < 0) return FAILURE; SendMsg.Msg = SignUp; Result = Send(ServerTID, &SendMsg, sizeof(SendMsg), &ReplyMsg, sizeof(ReplyMsg)); if (Result != sizeof(ReplyMsg)) { bwprintf(COM2, "Sign Up Request to Server did not go through."); return Result; } if (ReplyMsg.MsgType == ServerFull) TODOTODOTODOTODO while (RPSResult == Draw) { while (Input == 'U') { Input = bwgetc(COM2); if (Input == 'r' || Input == 'R') { SendMsg.Choice = Rock; break; } else if (Input == 'p' || Input == 'P') { SendMsg.Choice = Paper; break; } else if (Input == 's' || Input == 'S') { SendMsg.Choice = Scissors; break; } else { Input = 'U'; bwprintf(COM2, "Please enter r/R for Rock, p/P for Paper, s/S for Scissors.\n\r"); } } SendMsg.Msg = Play; Result = Send(ServerTID, &SendMsg, sizeof(SendMsg), &ReplyMsg, sizeof(ReplyMsg)); if (Result != sizeof(ReplyMsg)) { bwprintf(COM2, "Client 1: Game obstructed!"); return FAILURE; } RPSResult = ReplyMsg.Msg; } SendMsg.Msg = Quit; Result = Send(ServerTID, (void*)SendMsg, sizeof(SendMsg), (void*)&ReplyMsg, sizeof(ReplyMsg)); if (Result != sizeof(ReplyMsg)) { bwprintf(COM2, "Request for QUIT from Client 2 did not go through gracefully."); return FAILURE; } bwprintf(COM2, "Client 2 exitting...") Exit(); return SUCCESS; }