274 lines
7.6 KiB
C
274 lines
7.6 KiB
C
// By Yixuan Gao on 2022.12.12
|
|
// Made for class homework
|
|
#include <stdio.h>
|
|
#include <stdbool.h>
|
|
#include <stdlib.h>
|
|
#include <windows.h>
|
|
#include <conio.h>
|
|
#include <time.h>
|
|
#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 #
|
|
# #
|
|
########################
|
|
*/ |