加分题好耶
This commit is contained in:
271
PaperScissorsRock/main.c
Normal file
271
PaperScissorsRock/main.c
Normal file
@@ -0,0 +1,271 @@
|
||||
// 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>
|
||||
#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;
|
||||
bool (*playGameFunc)() = &singlePlayerMode;
|
||||
int playerScore[2] = { 0 };
|
||||
|
||||
handle = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
|
||||
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 #
|
||||
# #
|
||||
########################
|
||||
*/
|
||||
Reference in New Issue
Block a user