修改文件结构。

This commit is contained in:
unlockable
2023-02-21 10:56:54 +08:00
parent a64cfdd9f3
commit 40182871f4
83 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,274 @@
// 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 #
# #
########################
*/