aboutsummaryrefslogtreecommitdiffstats
path: root/rps_game
diff options
context:
space:
mode:
authornathansmith117 <nathansmith117@sdf.org>2024-05-22 04:51:55 +0000
committernathansmith117 <nathansmith117@sdf.org>2024-05-22 04:51:55 +0000
commitbdd8d563ff3f0eec41cc45d07f6c00622a531a72 (patch)
treeceb9cac325b893b20b5d0303e988252136680e03 /rps_game
downloadforgorttonProjects-bdd8d563ff3f0eec41cc45d07f6c00622a531a72.tar.gz
forgorttonProjects-bdd8d563ff3f0eec41cc45d07f6c00622a531a72.tar.bz2
forgorttonProjects-bdd8d563ff3f0eec41cc45d07f6c00622a531a72.zip
first commitHEADmain
Diffstat (limited to 'rps_game')
-rw-r--r--rps_game/Makefile8
-rw-r--r--rps_game/README.md2
-rw-r--r--rps_game/src/Makefile24
-rw-r--r--rps_game/src/main.cpp59
-rw-r--r--rps_game/src/rps.cpp99
-rw-r--r--rps_game/src/rps.h47
-rw-r--r--rps_game/src/rps_logger.cpp37
-rw-r--r--rps_game/src/rps_logger.h39
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;
+ };
+}