// By Yixuan Gao on 2022.12.12 // Made for class homework #include #include #include #include #include #include #pragma warning(disable:4996) #define PAPER 0 #define SICSSORS 1 #define ROCK 2 #define CONTINUE_GAME 0 #define NOT_CONTINUE_GAME 1 #define RIGHTMARGIN 5 #define TOPMARGIN 10 void singlePlayerMode(); void twoPlayerMode(); int userSelect(char* promptString, int selectionCount, char** selectionList, int prevLineCount); void outputSelection(int selection, char** selectionList); int determineWinner(int player1, int player2, char* player1Name, char* player2Name, char* player1WinString, char* player2WinString); void makeScoreBoard(int scores[], char* player1Name, char* player2Name); void makeResults(int scores[], char* player1Name, char* player2Name); char* paperScissorsRock[3] = {"Paper", "Scissors", "Rock"}; char* playerNumber[2] = { "Single Player", "Two Players" }; char* yesNo[2] = { "Yes", "No" }; HANDLE handle; int main() { char playerCount = 0; void (*playGameFunc)() = &singlePlayerMode; int playerScore[2] = { 0 }; handle = GetStdHandle(STD_OUTPUT_HANDLE); system("cls"); switch (userSelect("Please choose game mode:\n", 2, playerNumber, 0)) { case 0: playGameFunc = &singlePlayerMode; break; case 1: playGameFunc = &twoPlayerMode; break; } system("cls"); playGameFunc(); system("pause"); return 0; } int userSelect(char *promptString, int selectionCount, char** selectionList, int prevLineCount) { int selected = 0; COORD position; char userInputChar = 0; position.X = 15; position.Y = prevLineCount + 1; printf("%s", promptString); printf("Please select: %s", selectionList[selected]); while (true) { if (kbhit()) { SetConsoleCursorPosition(handle, position);//Set to the position after : printf(" "); //Clear previous output SetConsoleCursorPosition(handle, position);//Set to the position after : userInputChar = getch(); if (userInputChar == 13) { //13 Stands for 'Enter' outputSelection(selected, selectionList); break; } else if (userInputChar == -32) { // when typing up, down, left , right arrows, we actually input // two userInputChararacters in one hit userInputChar = getch(); switch (userInputChar) { case 72: selected = (selected + 1) % selectionCount; // UP outputSelection(selected, selectionList); break; case 80: selected = (selected + selectionCount - 1) % selectionCount; // DOWN, 75 LEFT, 77 RIGHT outputSelection(selected, selectionList); break; default: outputSelection(selected, selectionList); printf(" (Use up and down arrows to change selection, use Enter to confirm)"); } } else { outputSelection(selected, selectionList); printf(" (Use up and down arrows to change selection, use Enter to confirm)"); } } } return selected; } void outputSelection(int selection, char** selectionList) { printf("%s", selectionList[selection]); } void singlePlayerMode() { int user, computer; int scores[2] = { 0 }; int winner = 0; do { system("cls"); makeScoreBoard(scores, "You", "Computer"); srand((unsigned int)(time(NULL))); computer = rand() % 3; printf("The computer has made its choice.\n"); user = userSelect("Your choice:\n", 3, paperScissorsRock, 1); system("cls"); makeScoreBoard(scores, "You", "Computer"); winner = determineWinner(user, computer, "You", "Computer", "You win!", "Computer Wins!"); if (winner != -1) { scores[winner] += 100; scores[winner] %= 100000; makeScoreBoard(scores, "You", "Computer"); } printf("\n\n-----\n\n"); } while (userSelect("Play again?\n", 2, yesNo, 7) == CONTINUE_GAME); makeResults(scores, "You", "Computer"); } void twoPlayerMode() { int player1, player2; int scores[2] = { 0 }; int winner = 0; do { system("cls"); makeScoreBoard(scores, "Player 1", "Player 2"); player1 = userSelect("Player1's Choice:\n", 3, paperScissorsRock, 0); system("cls"); makeScoreBoard(scores, "Player 1", "Player 2"); printf("Player 1 has made his/hers choise.\n"); player2 = userSelect("Player2's Choice:\n", 3, paperScissorsRock, 1); system("cls"); makeScoreBoard(scores, "Player 1", "Player 2"); winner = determineWinner(player1, player2, "Player1", "Player2", "Player1 wins!", "Player2 wins!"); if (winner != -1) { scores[winner] += 100; scores[winner] %= 100000; makeScoreBoard(scores, "Player 1", "Player 2"); } printf("\n\n-----\n\n"); } while (userSelect("Play again?\n", 2, yesNo, 7) == CONTINUE_GAME); makeResults(scores, "Player 1", "Player 2"); } int determineWinner(int player1, int player2, char* player1Name, char* player2Name, char* player1WinString, char* player2WinString) { int winner = -1; printf("%s chose: %s\n%s chose: %s\n\n", player1Name, paperScissorsRock[player1], player2Name, paperScissorsRock[player2]); if (player1 == player2) { printf("Tie!"); } else if ((player1 + 1) % 3 == player2) { printf("%s", player2WinString); winner = 1; } else { printf("%s", player1WinString); winner = 0; } return winner; } void makeScoreBoard(int scores[], char* player1Name, char* player2Name) { CONSOLE_SCREEN_BUFFER_INFO bufferInfo; COORD outputPos; GetConsoleScreenBufferInfo(handle, &bufferInfo); outputPos.X = bufferInfo.dwMaximumWindowSize.X - 11 - RIGHTMARGIN; outputPos.Y = TOPMARGIN; SetConsoleCursorPosition(handle, outputPos); printf("Scores"); outputPos.X = bufferInfo.dwMaximumWindowSize.X - 15 - RIGHTMARGIN; outputPos.Y = 1 + TOPMARGIN; SetConsoleCursorPosition(handle, outputPos); printf("%s", player1Name); outputPos.X = bufferInfo.dwMaximumWindowSize.X - 5 - RIGHTMARGIN; SetConsoleCursorPosition(handle, outputPos); printf("%5d", scores[0]); outputPos.X = bufferInfo.dwMaximumWindowSize.X - 15 - RIGHTMARGIN; outputPos.Y = 2 + TOPMARGIN; SetConsoleCursorPosition(handle, outputPos); printf("%s", player2Name); outputPos.X = bufferInfo.dwMaximumWindowSize.X - 5 - RIGHTMARGIN; SetConsoleCursorPosition(handle, outputPos); printf("%5d", scores[1]); SetConsoleCursorPosition(handle, bufferInfo.dwCursorPosition); } void makeResults(int scores[], char* player1Name, char* player2Name) { CONSOLE_SCREEN_BUFFER_INFO bufferInfo; GetConsoleScreenBufferInfo(handle, &bufferInfo); COORD outputPos; int middle = bufferInfo.dwMaximumWindowSize.X / 2; system("cls"); outputPos.X = middle - 11; outputPos.Y = 3; SetConsoleCursorPosition(handle, outputPos); printf("########################"); outputPos.Y++; SetConsoleCursorPosition(handle, outputPos); printf("# #"); outputPos.Y++; SetConsoleCursorPosition(handle, outputPos); printf("# RESULTS #"); outputPos.Y++; SetConsoleCursorPosition(handle, outputPos); printf("# #"); outputPos.Y++; SetConsoleCursorPosition(handle, outputPos); printf("# %8s %5d #", player1Name, scores[0]); outputPos.Y++; SetConsoleCursorPosition(handle, outputPos); printf("# #"); outputPos.Y++; SetConsoleCursorPosition(handle, outputPos); printf("# %8s %5d #", player2Name, scores[1]); outputPos.Y++; SetConsoleCursorPosition(handle, outputPos); printf("# #"); outputPos.Y++; SetConsoleCursorPosition(handle, outputPos); printf("########################"); outputPos.Y += 5; outputPos.X = 0; SetConsoleCursorPosition(handle, outputPos); } /* ######################## # # # RESULTS # # # # Player 1 12345 # # # # Computer 15525 # # # ######################## */