Skip to content

Instantly share code, notes, and snippets.

@jda0
Last active June 17, 2016 06:24
Show Gist options
  • Save jda0/8530371 to your computer and use it in GitHub Desktop.
Save jda0/8530371 to your computer and use it in GitHub Desktop.
Super Awful C to keep scores in a game of Farkle.
#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