Skip to content
Snippets Groups Projects
rps.c 5.45 KiB
Newer Older
antnh6@gmail.com's avatar
antnh6@gmail.com committed
#include <rps.h>
antnh6@gmail.com's avatar
antnh6@gmail.com committed
#include <bwio.h>
#include <types.h>
antnh6@gmail.com's avatar
antnh6@gmail.com committed

antnh6@gmail.com's avatar
antnh6@gmail.com committed
	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;
antnh6@gmail.com's avatar
antnh6@gmail.com committed
	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;
antnh6@gmail.com's avatar
antnh6@gmail.com committed

antnh6@gmail.com's avatar
antnh6@gmail.com committed
	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;