diff options
Diffstat (limited to 'rps_game/src/rps.cpp')
-rw-r--r-- | rps_game/src/rps.cpp | 99 |
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; + } +} |