|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T g
Length: 6373 (0x18e5)
Types: TextFile
Names: »game.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Yahtzee/game.c«
#include "types.h"
extern Game player[];
static int dice[5];
static int mark[5];
static int ys[] = {1, 2, 3, 4, 5, 6, 8, 10, 11, 12, 13, 14, 15, 16};
static char *more = " is the winner. Play another game (Y/N) ? ";
static char *cd[] = {
"-------",
"| |",
"| o |",
"| |",
"-------",
"-------",
"|o |",
"| |",
"| o|",
"-------",
"-------",
"|o |",
"| o |",
"| o|",
"-------",
"-------",
"|o o|",
"| |",
"|o o|",
"-------",
"-------",
"|o o|",
"| o |",
"|o o|",
"-------",
"-------",
"|o o|",
"|o o|",
"|o o|",
"-------"
};
clrroll()
{
int i;
for(i=0; i<5; i++) {
mark[i] = 0;
mvaddstr(i*4+2, 58, " ");
}
refresh();
}
roll()
{
int i;
for(i=0; i<5; i++) {
if(mark[i] == 0) {
dice[i] = get_rand();
spot(i,dice[i]-1);
}
}
refresh();
}
spot(i,n)
int i,n;
{
int j,k,m;
j = i*4;
m = n*5;
for(k=0; k<5; k++) mvaddstr(j+k, 60, cd[m+k]);
}
choose()
{
int c,choice,old,i;
for(choice=0; choice<5; choice++) if(mark[choice] == 0) break;
mvaddstr(choice*4+2, 53, "->");
refresh();
old = choice;
while(1) {
c = key();
if(c == '\r') {
mvaddstr(choice*4+2, 53, " ");
refresh();
break;
}
switch (c) {
case 'X':
case 'x':
mark[choice] = 1;
mvaddstr(choice*4+2, 58, "X");
refresh();
if(++choice == 5) choice = 0;
break;
case ' ':
mark[choice] = 0;
mvaddstr(choice*4+2, 58, " ");
refresh();
case 'j':
case 'J':
case DN_ARROW:
if(++choice == 5) choice = 0;
break;
case 'k':
case 'K':
case UP_ARROW:
if(--choice < 0) choice = 4;
break;
default:
DisplayBeep(0);
break;
}
mvaddstr(old*4+2, 53, " ");
mvaddstr(choice*4+2, 53, "->");
refresh();
old = choice;
}
for(i=0; i<5; i++) if(mark[i] == 0) return(0);
return(1);
}
makechoice(n)
int n;
{
int c, choice, old, count, counts[6], f1, f2, f3, f4, f5, i, j;
char s[4];
for(choice=0; choice<NS; choice++)
if(player[n].score[choice] == -1) break;
mvaddstr(ys[choice], 0, "->");
refresh();
old = choice;
while(1) {
c = key();
if(c == '\r') {
mvaddstr(ys[old], 0, " ");
refresh();
break;
}
switch (c) {
case 'k':
case 'K':
case UP_ARROW:
do {
if(--choice < 0) choice = NS-1;
} while(player[n].score[choice] >= 0 || choice == 6);
break;
case 'j':
case 'J':
case DN_ARROW:
do {
if(++choice == NS) choice = 0;
} while(player[n].score[choice] >= 0 || choice == 6);
break;
default:
DisplayBeep(0);
break;
}
mvaddstr(ys[old], 0, " ");
mvaddstr(ys[choice], 0, "->");
refresh();
old = choice;
}
player[n].score[choice] = 0;
for(j=1; j<=6; j++) {
count = 0;
for(i=0; i<5; i++)
if(dice[i] == j) count++;
if(count == 5) player[n].ycount++;
}
switch (choice) {
case 0: case 1: case 2: case 3: case 4: case 5: /* points */
for(i=0; i<5; i++)
if(dice[i] == choice+1)
player[n].score[choice] += dice[i];
f1=1;
count = 0;
for(i=0; i<6; i++)
if(player[n].score[i] >=0)
count += player[n].score[i];
else f1=0;
sprintf(s,"%d",count);
mvaddstr(ys[5]+1, FC+n*COLW, " ");
mvaddstr(ys[5]+1, FC+n*COLW, s);
refresh();
if(f1) {
if(count >= 63) {
player[n].score[6] = 35;
mvaddstr(ys[6], FC+n*COLW, "35");
refresh();
} else player[n].score[6] = 0;
}
break;
case 13: /* chance */
for(i=0; i<5; i++) player[n].score[13] += dice[i];
break;
case 7: /* 3 of a kind */
case 8: /* 4 of a kind */
case 12: /* yahtzee */
for(j=1; j<=6; j++) {
count = 0;
for(i=0; i<5; i++)
if(dice[i] == j) count++;
if(choice == 7) {
if(count >= 3)
for(i=0; i<5; i++) player[n].score[7] += dice[i];
} else if(choice == 8) {
if(count >= 4)
for(i=0; i<5; i++) player[n].score[8] += dice[i];
} else {
if(count == 5) player[n].score[12] = 50;
}
}
break;
case 9: /* full house */
for(j=0; j<6; j++) {
counts[j] = 0;
for(i=0; i<5; i++)
if(dice[i] == j+1) counts[j] += 1;
}
f1 = f2 = 0;
for(i=0; i<6; i++) if(counts[i] == 3) f1 = 1;
for(i=0; i<6; i++) if(counts[i] == 2) f2 = 1;
if(f1 && f2) player[n].score[9] = 25;
break;
case 10: /* small straight */
f1 = f2 = f3 = f4 = 0;
for(i=0; i<5; i++) {
if(dice[i] == 1) f1 = 1;
if(dice[i] == 2) f2 = 1;
if(dice[i] == 3) f3 = 1;
if(dice[i] == 4) f4 = 1;
}
if(f1 && f2 && f3 && f4) {
player[n].score[10] = 30;
break;
}
f1 = f2 = f3 = f4 = 0;
for(i=0; i<5; i++) {
if(dice[i] == 2) f1 = 1;
if(dice[i] == 3) f2 = 1;
if(dice[i] == 4) f3 = 1;
if(dice[i] == 5) f4 = 1;
}
if(f1 && f2 && f3 && f4) {
player[n].score[10] = 30;
break;
}
f1 = f2 = f3 = f4 = 0;
for(i=0; i<5; i++) {
if(dice[i] == 3) f1 = 1;
if(dice[i] == 4) f2 = 1;
if(dice[i] == 5) f3 = 1;
if(dice[i] == 6) f4 = 1;
}
if(f1 && f2 && f3 && f4) {
player[n].score[10] = 30;
break;
}
break;
case 11:
f1 = f2 = f3 = f4 = f5 = 0;
for(i=0; i<5; i++) {
if(dice[i] == 2) f1 = 1;
if(dice[i] == 3) f2 = 1;
if(dice[i] == 4) f3 = 1;
if(dice[i] == 5) f4 = 1;
if(dice[i] == 6) f5 = 1;
}
if(f1 && f2 && f3 && f4 && f5) {
player[n].score[11] = 40;
break;
}
f1 = f2 = f3 = f4 = f5 = 0;
for(i=0; i<5; i++) {
if(dice[i] == 1) f1 = 1;
if(dice[i] == 2) f2 = 1;
if(dice[i] == 3) f3 = 1;
if(dice[i] == 4) f4 = 1;
if(dice[i] == 5) f5 = 1;
}
if(f1 && f2 && f3 && f4 && f5) {
player[n].score[11] = 40;
break;
}
break;
}
sprintf(s,"%d",player[n].score[choice]);
mvaddstr(ys[choice], FC+n*COLW, s);
refresh();
}
winner(n)
int n;
{
int i,j,k1,k2,k3,tots[4],max;
char s[4];
for(i=0; i<n; i++) {
k3 = (player[i].ycount - 1) * 100;
if(k3) {
sprintf(s,"%d",k3);
mvaddstr(17, FC+i*COLW, s);
}
k1 = 0;
for(j=0; j<7; j++) k1 += player[i].score[j];
sprintf(s, "%d", k1);
mvaddstr(19, FC+i*COLW, s);
k2 = 0;
for(j=7; j<NS; j++) k2 += player[i].score[j];
sprintf(s,"%d",k2);
mvaddstr(20, FC+i*COLW, s);
tots[i] = k1 + k2 + k3;
sprintf(s,"%d",tots[i]);
mvaddstr(22, FC+i*COLW, s);
}
refresh();
max = tots[0];
j = 0;
for(i=1; i<n; i++)
if(tots[i] > max) {
j = i;
max = tots[i];
}
sprintf(s, "%d", max);
mvaddstr(22, FC+j*COLW, s);
move(23,0);
clrtoeol();
addstr(player[j].name);
addstr(more);
refresh();
k1 = strlen(player[j].name) + strlen(more);
return(yes(23,k1));
}