aboutsummaryrefslogtreecommitdiffstats
path: root/rps_game/src/rps.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'rps_game/src/rps.cpp')
-rw-r--r--rps_game/src/rps.cpp99
1 files changed, 99 insertions, 0 deletions
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;
+ }
+}