Last active
June 17, 2016 06:24
-
-
Save jda0/8530371 to your computer and use it in GitHub Desktop.
Super Awful C to keep scores in a game of Farkle.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
// Copyright James Daly 2014 | |
// Compile with: gcc farkle.c -std=c99 -o farkle | |
typedef struct Leader | |
{ | |
char name[16]; | |
long score; | |
} Leader; | |
long ascore[8]; | |
long riskscore[8]; | |
long totscore[8]; | |
Leader leaders[8]; | |
long seclimit; | |
long winlimit; | |
int player; | |
int players; | |
int dice; | |
char names[8][16]; | |
char command[5]; | |
// for sorting | |
int compare( const void* a, const void* b) | |
{ | |
const Leader *la = a; | |
const Leader *lb = b; | |
if ( la->score == lb->score ) return 0; | |
else if ( la->score > lb->score ) return -1; | |
else return 1; | |
} | |
// can't be bothered splitting this up, even though | |
// it's an atrocity. Especially the switch. | |
int main(void) | |
{ | |
while (strncmp(command, "quit", 4) != 0) | |
{ | |
command[0] = '!'; | |
players = 0; | |
seclimit = 300; | |
winlimit = 10000; | |
for (size_t i = 0; i < 8; i++) | |
snprintf(names[i], 15, "Player %d", i + 1); | |
printf("Welcome to Farkle Manager!\n\n" | |
"COMMAND REFERENCE:\n" | |
" r [n], \n" | |
" d [n] Keep dice. Insert values in order and without spaces, IE 123456.\n" | |
" f 0 Farkle.\n" | |
" s 0 Secure your score.\n" | |
" \n" | |
" arsc [n] Adjust risky score by [n].\n" | |
" atsc [n] Adjust safe score by [n].\n" | |
" srsc [n] Set risky score to [n].\n" | |
" stsc [n] Set safe score to [n].\n" | |
" \n" | |
" ssec [n] Set the minimum score needed to secure to [n].\n" | |
" spla [n] Set the next player to [n]. Play will then continue from that player.\n" | |
" swin [n] Set the win condition to [n].\n" | |
" name [n] Assign a name to player [n], up to 15 characters.\n" | |
" lead [n] Get a leaderboard of the top [n] players.\n" | |
" home 0 Return to this screen.\n" | |
" quit 0 Quit Farkle Manager.\n\n" | |
"SETTINGS:\n" | |
" Win Limit %d \t(Change using swin [n])\n" | |
" Sec Limit %d \t(Change using ssec [n])\n", winlimit, seclimit); | |
while (players < 1 || players > 8) | |
{ | |
printf("No. of Players (1-8): "); | |
scanf("%d", &players); | |
printf("\n"); | |
} | |
player = 0; | |
for (int i = 0; i < players; i++) | |
{ | |
totscore[player] = 0; | |
riskscore[player] = 0; | |
} | |
while (strncmp(command, "home", 4) != 0) | |
{ | |
printf("Current Player: %s (%d)\n", names[player], player + 1); | |
printf("Current score: %d\n", totscore[player]); | |
for (size_t i = 0; i < 8; i++) | |
{ | |
strncpy(leaders[i].name, names[i], 16); | |
leaders[i].score = totscore[i]; | |
} | |
qsort(leaders, players, sizeof(*leaders), compare); | |
if (totscore[player] == leaders[0].score) | |
printf("Leading by: %d\n", totscore[player] - leaders[1].score); | |
else | |
printf("Chasing by: %d\n", leaders[0].score - totscore[player]); | |
printf("Risk: %d\n", riskscore[player]); | |
printf("$ "); | |
scanf("%s%d", &command, &dice); | |
if (strncmp(command, "name", 4) == 0) | |
{ | |
dice--; | |
dice %= players; | |
printf("Name to assign to player %d: ", dice + 1); | |
scanf("%s", names[dice]); | |
printf("Assigned %s to player %d \n\n", names[dice], dice + 1); | |
} | |
else if (strncmp(command, "lead", 4) == 0) | |
{ | |
if (dice > 8) | |
dice = 8; | |
else if (dice == 0) | |
dice = players; | |
printf("\n # | NAME | SCORE\n\n"); | |
for (size_t i = 0; i < dice; i++) | |
{ | |
printf(" %d | %-15s | %d\n", i + 1, leaders[i].name, leaders[i].score); | |
} | |
printf("------------------------------\n\n"); | |
} | |
else if (strncmp(command, "ssec", 4) == 0) | |
{ | |
seclimit = dice; | |
} | |
else if (strncmp(command, "swin", 4) == 0) | |
{ | |
winlimit = dice; | |
} | |
else if (strncmp(command, "spla", 4) == 0) | |
{ | |
player = dice - 1; | |
player %= players; | |
printf("Set player to %s (%d / %d)\n\n", names[player], player + 1, players); | |
} | |
else if (strncmp(command, "srsc", 4) == 0) | |
{ | |
riskscore[player] = dice; | |
totscore[player] = dice; | |
printf("Set risky score to %d\n\n", riskscore[player]); | |
} | |
else if (strncmp(command, "stsc", 4) == 0) | |
{ | |
totscore[player] = dice; | |
printf("Set safe score to %d\n\n", totscore[player]); | |
} | |
else if (strncmp(command, "arsc", 4) == 0) | |
{ | |
riskscore[player] += dice; | |
totscore[player] += dice; | |
printf("Adjusted risky score by %d\n\n", dice); | |
} | |
else if (strncmp(command, "atsc", 4) == 0) | |
{ | |
totscore[player] += dice; | |
printf("Adjusted safe score by %d\n\n", dice); | |
} | |
else if (strncmp(command, "f", 1) == 0) | |
{ | |
if (leaders[0].score > winlimit) | |
{ | |
strncpy(command, "home\0", 5); | |
printf("Win Limit has been reached. %s wins!", leaders[0].name); | |
} | |
ascore[player] = 0; | |
totscore[player] -= riskscore[player]; | |
riskscore[player] = 0; | |
player++; | |
player %= players; | |
printf("Farkle! %s play next!\n\n", names[player]); | |
} | |
else if (strncmp(command, "s", 1) == 0) | |
{ | |
if (leaders[0].score > winlimit) | |
{ | |
strncpy(command, "home\0", 5); | |
printf("Win Limit has been reached. %s wins!\n\n", leaders[0].name); | |
} | |
if (riskscore[player] < seclimit) | |
{ | |
printf("Score is not high enough to secure; you need %d more.\n\n", seclimit - riskscore[player]); | |
} | |
else | |
{ | |
ascore[player] = 0; | |
riskscore[player] = 0; | |
player++; | |
player %= players; | |
printf("Secure! Player %d play next!\n\n", player + 1); | |
} | |
} | |
else if (strncmp(command, "d", 1) == 0 || strncmp(command, "r", 1) == 0) | |
{ | |
switch (dice) | |
{ | |
case 5: | |
ascore[player] = 50; | |
break; | |
case 1: | |
case 55: | |
ascore[player] = 100; | |
break; | |
case 15: | |
ascore[player] = 150; | |
break; | |
case 222: | |
case 11: | |
case 155: | |
ascore[player] = 200; | |
break; | |
case 115: | |
case 2225: | |
ascore[player] = 250; | |
break; | |
case 333: | |
case 1155: | |
case 1222: | |
case 22255: | |
ascore[player] = 300; | |
break; | |
case 3335: | |
case 12225: | |
ascore[player] = 350; | |
break; | |
case 444: | |
case 11222: | |
case 122255: | |
case 1333: | |
case 33355: | |
ascore[player] = 400; | |
break; | |
case 112225: | |
case 13335: | |
case 4445: | |
ascore[player] = 450; | |
break; | |
case 111: | |
case 555: | |
case 11333: | |
case 133355: | |
case 1444: | |
case 44455: | |
ascore[player] = 500; | |
break; | |
case 113335: | |
case 14445: | |
case 1115: | |
ascore[player] = 550; | |
break; | |
case 666: | |
case 11444: | |
case 144455: | |
case 1555: | |
case 11155: | |
ascore[player] = 600; | |
break; | |
case 114445: | |
case 5666: | |
ascore[player] = 650; | |
break; | |
case 1666: | |
case 55666: | |
ascore[player] = 700; | |
break; | |
case 15666: | |
ascore[player] = 750; | |
break; | |
case 11666: | |
ascore[player] = 800; | |
break; | |
case 115666: | |
ascore[player] = 850; | |
break; | |
case 1111: | |
case 2222: | |
case 3333: | |
case 4444: | |
case 5555: | |
case 6666: | |
ascore[player] = 1000; | |
break; | |
case 11115: | |
case 22225: | |
case 33335: | |
case 44445: | |
case 56666: | |
ascore[player] = 1050; | |
break; | |
case 12222: | |
case 13333: | |
case 14444: | |
case 15555: | |
case 16666: | |
case 111155: | |
case 222255: | |
case 333355: | |
case 444455: | |
case 556666: | |
ascore[player] = 1100; | |
break; | |
case 122225: | |
case 133335: | |
case 144445: | |
case 156666: | |
ascore[player] = 1150; | |
break; | |
case 112222: | |
case 113333: | |
case 114444: | |
case 115555: | |
case 116666: | |
ascore[player] = 1200; | |
break; | |
case 123456: | |
case 111222: | |
case 111333: | |
case 111444: | |
case 111555: | |
case 111666: | |
case 222333: | |
case 222444: | |
case 222555: | |
case 222666: | |
case 333444: | |
case 333555: | |
case 333666: | |
case 444555: | |
case 444666: | |
case 555666: | |
case 112233: | |
case 112244: | |
case 112255: | |
case 112266: | |
case 113344: | |
case 113355: | |
case 113366: | |
case 114455: | |
case 114466: | |
case 115566: | |
case 223344: | |
case 223355: | |
case 223366: | |
case 224455: | |
case 224466: | |
case 225566: | |
case 334455: | |
case 334466: | |
case 335566: | |
case 445566: | |
ascore[player] = 1500; | |
break; | |
case 11111: | |
case 22222: | |
case 33333: | |
case 44444: | |
case 55555: | |
case 66666: | |
ascore[player] = 2000; | |
break; | |
case 111115: | |
case 222225: | |
case 333335: | |
case 444445: | |
case 566666: | |
ascore[player] = 2050; | |
break; | |
case 122222: | |
case 133333: | |
case 144444: | |
case 155555: | |
case 166666: | |
ascore[player] = 2100; | |
break; | |
case 111111: | |
case 222222: | |
case 333333: | |
case 444444: | |
case 555555: | |
case 666666: | |
ascore[player] = 3000; | |
break; | |
default: | |
printf("Invalid value: %d.", dice); | |
ascore[player] = 0; | |
break; | |
} | |
printf("Added %d to score.\n\n", ascore[player]); | |
riskscore[player] += ascore[player]; | |
totscore[player] += ascore[player]; | |
} | |
else if (strncmp(command, "home", 4) == 0 || strncmp(command, "quit", 4) == 0) | |
{} | |
else | |
{ | |
printf("Command unknown: %s\n\n", command); | |
} | |
} | |
} | |
/** | |
* For the brave souls who get this far: You are the chosen ones, | |
* the valiant knights of programming who toil away, without rest, | |
* fixing our most awful code. To you, true saviors, kings of men, | |
* I say this: never gonna give you up, never gonna let you down, | |
* never gonna run around and desert you. Never gonna make you cry, | |
* never gonna say goodbye. Never gonna tell a lie and hurt you. | |
*/ | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment