diff options
author | nathansmith117 <nathansmith117@sdf.org> | 2024-05-22 04:51:55 +0000 |
---|---|---|
committer | nathansmith117 <nathansmith117@sdf.org> | 2024-05-22 04:51:55 +0000 |
commit | bdd8d563ff3f0eec41cc45d07f6c00622a531a72 (patch) | |
tree | ceb9cac325b893b20b5d0303e988252136680e03 /rps_game | |
download | forgorttonProjects-bdd8d563ff3f0eec41cc45d07f6c00622a531a72.tar.gz forgorttonProjects-bdd8d563ff3f0eec41cc45d07f6c00622a531a72.tar.bz2 forgorttonProjects-bdd8d563ff3f0eec41cc45d07f6c00622a531a72.zip |
Diffstat (limited to 'rps_game')
-rw-r--r-- | rps_game/Makefile | 8 | ||||
-rw-r--r-- | rps_game/README.md | 2 | ||||
-rw-r--r-- | rps_game/src/Makefile | 24 | ||||
-rw-r--r-- | rps_game/src/main.cpp | 59 | ||||
-rw-r--r-- | rps_game/src/rps.cpp | 99 | ||||
-rw-r--r-- | rps_game/src/rps.h | 47 | ||||
-rw-r--r-- | rps_game/src/rps_logger.cpp | 37 | ||||
-rw-r--r-- | rps_game/src/rps_logger.h | 39 |
8 files changed, 315 insertions, 0 deletions
diff --git a/rps_game/Makefile b/rps_game/Makefile new file mode 100644 index 0000000..7083609 --- /dev/null +++ b/rps_game/Makefile @@ -0,0 +1,8 @@ +all: + @make -C src +debug: + @make -C src debug +clean: + @make -C src clean +%: + @make -C src $@ diff --git a/rps_game/README.md b/rps_game/README.md new file mode 100644 index 0000000..19df8f4 --- /dev/null +++ b/rps_game/README.md @@ -0,0 +1,2 @@ +# rps_game +I started writting a rock paper scissors game with ai but quickly got bored. diff --git a/rps_game/src/Makefile b/rps_game/src/Makefile new file mode 100644 index 0000000..b6bf864 --- /dev/null +++ b/rps_game/src/Makefile @@ -0,0 +1,24 @@ +COMPILER = g++ +LDFLAGS = -static-libstdc++ -static-libgcc + +OBJS = main.o rps.o rps_logger.o +TARGET = ../rps_game + +%.o: %.cpp + @echo compiling $< + @$(COMPILER) $(CFLAGS) -c -o $@ $< +$(TARGET): $(OBJS) + @echo making exe + @$(COMPILER) -o $(TARGET) $(OBJS) $(LDFLAGS) +debug: + $(COMPILER) -c *.cpp -g + $(COMPILER) -o $(TARGET) $(OBJS) $(LDFLAGS) -g + +# Objects +main.o: *.cpp *.h +rps.o: rps.cpp rps.h +rps_logger.o: rps_logger.cpp rps_logger.h rps.cpp rps.h + +clean: + rm *.o + rm $(TARGET) diff --git a/rps_game/src/main.cpp b/rps_game/src/main.cpp new file mode 100644 index 0000000..b7e2dfc --- /dev/null +++ b/rps_game/src/main.cpp @@ -0,0 +1,59 @@ +#include <cstdio> +#include <cstdlib> +#include <cstring> +#include <climits> + +#include "rps.h" +#include "rps_logger.h" + +RPS::OBJECT char_to_obj(char input_char) { + switch (input_char) { + case 'r': + return RPS::ROCK; + case 'p': + return RPS::PAPER; + case 's': + return RPS::SCISSORS; + default: + return RPS::NONE; + } +} + +int main() { + char buf[NAME_MAX]; + + char input_buf[NAME_MAX]; + char input_char; + + RPS::RPSLogger * game_logger = new RPS::RPSLogger(); + RPS::RPSLog game_log; + RPS::OBJECT out_come; + + while (!feof(stdin)) { + // Player one. + printf("Enter p1 value rps: "); + memset(input_buf, 0, NAME_MAX); + fgets(input_buf, NAME_MAX, stdin); + input_char = input_buf[0]; + + game_log.p1_choice = char_to_obj(input_char); + + // Player two. + printf("Enter p2 value rps: "); + memset(input_buf, 0, NAME_MAX); + fgets(input_buf, NAME_MAX, stdin); + input_char = input_buf[0]; + + game_log.p2_choice = char_to_obj(input_char); + + // Get out come. + out_come = RPS::who_won(game_log); + RPS::obj_to_string(out_come, buf, NAME_MAX); + + game_logger->add_log(game_log); + + printf("Out come: %s, p1 wins: %d, p2 wins: %d, duals: %d\n", buf, game_logger->get_p1_wins(), game_logger->get_p2_wins(), game_logger->get_duals()); + } + + return 0; +} diff --git a/rps_game/src/rps.cpp b/rps_game/src/rps.cpp new file mode 100644 index 0000000..7fb9c19 --- /dev/null +++ b/rps_game/src/rps.cpp @@ -0,0 +1,99 @@ +#include "rps.h" + +namespace RPS { + OBJECT what_it_beats(OBJECT obj) { + switch (obj) { + case ROCK: + return ROCK_BEATS; + case PAPER: + return PAPER_BEATS; + case SCISSORS: + return SCISSORS_BEATS; + default: + return NONE; + } + } + + OBJECT what_beats_it(OBJECT obj) { + switch (obj) { + case ROCK: + return BEATS_ROCK; + case PAPER: + return BEATS_PAPER; + case SCISSORS: + return BEATS_SCISSORS; + default: + return NONE; + } + } + + OBJECT who_won(OBJECT a, OBJECT b) { + // Check for weird stuff. + if (!is_game_object(a) || !is_game_object(b)) + return NONE; + if (a == b) + return DUAL; + + return (what_it_beats(a) == b) ? a : b; + } + + OBJECT who_won(RPSLog log) { + return who_won(log.p1_choice, log.p2_choice); + } + + bool is_game_object(OBJECT obj) { + return obj == ROCK || obj == PAPER || obj == SCISSORS; + } + + int obj_to_string(OBJECT obj, char * buf, size_t n) { + int res; + + // Check for stuff. + if (n <= 0 || buf == NULL) + return -1; + + memset(buf, 0, n); + + switch (obj) { + case ROCK: + strncat(buf, "rock", n); + break; + case PAPER: + strncat(buf, "paper", n); + break; + case SCISSORS: + strncat(buf, "scissors", n); + break; + case DUAL: + strncat(buf, "dual", n); + break; + default: + strncat(buf, "none", n); + break; + } + + return 0; + } + + int update_rps_stat(RPSStats * stats, OBJECT new_obj) { + // Check stuff. + if (stats == NULL) + return -1; + + switch (new_obj) { + case ROCK: + stats->rock_count++; + break; + case PAPER: + stats->paper_count++; + break; + case SCISSORS: + stats->scissors_count++; + break; + default: + return -1; + } + + return 0; + } +} diff --git a/rps_game/src/rps.h b/rps_game/src/rps.h new file mode 100644 index 0000000..422df51 --- /dev/null +++ b/rps_game/src/rps.h @@ -0,0 +1,47 @@ +#pragma once + +#include <cstdio> +#include <cstdlib> +#include <cstring> +#include <climits> + +#include <sys/types.h> + +namespace RPS { + enum GAME_OBJECTS { + NONE = -1, + ROCK, + PAPER, + SCISSORS, + DUAL + }; + + typedef int8_t OBJECT; + + struct RPSLog { + OBJECT p1_choice; + OBJECT p2_choice; + }; + + struct RPSStats { + int rock_count; + int paper_count; + int scissors_count; + }; + + constexpr OBJECT ROCK_BEATS = SCISSORS; + constexpr OBJECT PAPER_BEATS = ROCK; + constexpr OBJECT SCISSORS_BEATS = PAPER; + + constexpr OBJECT BEATS_ROCK = PAPER; + constexpr OBJECT BEATS_PAPER = SCISSORS; + constexpr OBJECT BEATS_SCISSORS = ROCK; + + OBJECT what_it_beats(OBJECT obj); + OBJECT what_beats_it(OBJECT obj); + OBJECT who_won(OBJECT a, OBJECT b); + OBJECT who_won(RPSLog log); + bool is_game_object(OBJECT obj); + int obj_to_string(OBJECT obj, char * buf, size_t buf_size); + int update_rps_stat(RPSStats * stats, OBJECT new_obj); // Update the stats structure. +} diff --git a/rps_game/src/rps_logger.cpp b/rps_game/src/rps_logger.cpp new file mode 100644 index 0000000..638f11e --- /dev/null +++ b/rps_game/src/rps_logger.cpp @@ -0,0 +1,37 @@ +#include "rps_logger.h" + +namespace RPS { + + RPSLogger::RPSLogger() { + clear(); + } + + void RPSLogger::clear() { + logs.clear(); + + p1_stats = {0, 0, 0}; + p2_stats = {0, 0, 0}; + + p1_wins = 0; + p2_wins = 0; + duals = 0; + } + + void RPSLogger::add_log(RPS::RPSLog log) { + logs.push_back(log); + update_rps_stat(&p1_stats, log.p1_choice); + update_rps_stat(&p2_stats, log.p2_choice); + + RPS::OBJECT out_come = RPS::who_won(log); + + // Add to win count. I saddly can't use a switch here ): + if (out_come == RPS::NONE) + return; + if (out_come == RPS::DUAL) + duals++; + if (out_come == log.p1_choice) + p1_wins++; + if (out_come == log.p2_choice) + p2_wins++; + } +} diff --git a/rps_game/src/rps_logger.h b/rps_game/src/rps_logger.h new file mode 100644 index 0000000..0fa3929 --- /dev/null +++ b/rps_game/src/rps_logger.h @@ -0,0 +1,39 @@ +#pragma once + +#include <cstdio> +#include <cstdlib> +#include <cstring> +#include <vector> + +#include "rps.h" + +namespace RPS { + + class RPSLogger { + public: + RPSLogger(); + + void clear(); // Clear everything. + size_t size() { return logs.size(); } + void add_log(RPS::RPSLog log); + + RPS::RPSStats get_p1_stats() { return p1_stats; } + void set_p1_stats(RPS::RPSStats new_stats) { p1_stats = new_stats; } + + RPS::RPSStats get_p2_stats() { return p2_stats; } + void set_p2_stats(RPS::RPSStats new_stats) { p2_stats = new_stats; } + + int get_p1_wins() { return p1_wins; } + int get_p2_wins() { return p2_wins; } + int get_duals() { return duals; } + private: + std::vector<RPS::RPSLog> logs; + + RPS::RPSStats p1_stats; + RPS::RPSStats p2_stats; + + int p1_wins; + int p2_wins; + int duals; + }; +} |