This is Scorer.m in view mode; [Download] [Up]
// Kismet
// Copyright (C) 1994, Joseph W. Reiss, All Rights Reserved
// jreiss@magnus.acs.ohio-state.edu
/////////////////////////////////////////////////////////////////////////////
// You are free to modify this code as you wish for your own personal use.
// You may only REDISTRIBUTE the code unaltered, with this copyright notice
// and all documentation intact.
//
// If you make any significant changes to this program, please drop me a
// line and let me know!
#import "DieView.h"
typedef int (*SCOREPROC)();
int scoreAces(id dice[5])
{
int tally=0,i;
for (i=0; i<5; i++)
if ([dice[i] value] == 1) tally++;
return tally;
}
int scoreDeuces(id dice[5])
{
int tally=0,i;
for (i=0; i<5; i++)
if ([dice[i] value] == 2) tally+=2;
return tally;
}
int scoreTreys(id dice[5])
{
int tally=0,i;
for (i=0; i<5; i++)
if ([dice[i] value] == 3) tally+=3;
return tally;
}
int scoreFours(id dice[5])
{
int tally=0,i;
for (i=0; i<5; i++)
if ([dice[i] value] == 4) tally+=4;
return tally;
}
int scoreFives(id dice[5])
{
int tally=0,i;
for (i=0; i<5; i++)
if ([dice[i] value] == 5) tally+=5;
return tally;
}
int scoreSixes(id dice[5])
{
int tally=0,i;
for (i=0; i<5; i++)
if ([dice[i] value] == 6) tally+=6;
return tally;
}
int scoreTwoPairSameColor(id dice[5])
{
int counts[6]={0,0,0,0,0,0},tally=0,match=-1,i;
for (i=0; i<5; i++)
{
if (++counts[[dice[i] value]-1] == 2)
match = [dice[i] value]-1;
tally+=[dice[i] value];
}
if (match >= 0 && (counts[match] >= 4 || counts[5-match] >= 2))
return tally;
else
return 0;
}
int scoreThreeOfAKind(id dice[5])
{
int counts[6]={0,0,0,0,0,0},tally=0,i;
for (i=0; i<5; i++)
{
counts[[dice[i] value]-1]++;
tally+=[dice[i] value];
}
if (counts[0]>=3 || counts[1]>=3 ||
counts[2]>=3 || counts[3]>=3 ||
counts[4]>=3 || counts[5]>=3)
return tally;
else
return 0;
}
int scoreStraight(id dice[5])
{
int counts[6]={0,0,0,0,0,0},i;
for (i=0; i<5; i++)
counts[[dice[i] value]-1]++;
if ((counts[0]==1 || counts[5]==1) &&
counts[1]==1 && counts[2]==1 &&
counts[3]==1 && counts[4]==1)
return 30;
else
return 0;
}
int scoreFlush(id dice[5])
{
int val1,val2,i;
val1 = [dice[0] value];
val2 = 7-val1; // Other value with same color is this
for (i=1; i<5; i++)
if ([dice[i] value] != val1 &&
[dice[i] value] != val2)
return 0;
return 35;
}
int scoreFullHouse(id dice[5])
{
int val1,val2,cnt1,cnt2,digit,tally=0,i;
val1 = [dice[0] value];
cnt1 = 1;
val2 = -1;
cnt2 = 0;
for (i=1; i<5; i++)
{
digit = [dice[i] value];
if (digit == val1) // Matches first value
cnt1++;
else if (digit == val2) // Matches second value
cnt2++;
else if (val2 < 0) // Don't have second value yet
{
val2 = digit;
cnt2 = 1;
}
else
return 0; // We have three different values!
tally+=[dice[i] value];
}
if (cnt1==5 || // All the same id value
(cnt1==3 && cnt2 == 2) ||
(cnt1==2 && cnt2 == 3))
return tally+15;
else
return 0;
}
int scoreFullHouseSameColor(id dice[5])
{
int val1,val2,cnt1,cnt2,digit,tally=0,i;
val1 = [dice[0] value];
cnt1 = 1;
val2 = 7-val1; // Other value with same color is this
cnt2 = 0;
for (i=1; i<5; i++)
{
digit = [dice[i] value];
if (digit == val1) // Matches first value
cnt1++;
else if (digit == val2) // Matches second value
cnt2++;
else
return 0; // We have three different values!
tally+=[dice[i] value];
}
if (cnt1==5 || // All the same id value
(cnt1==3 && cnt2 == 2) ||
(cnt1==2 && cnt2 == 3))
return tally+20;
else
return 0;
}
int scoreFourOfAKind(id dice[5])
{
int counts[6]={0,0,0,0,0,0},tally=0,i;
for (i=0; i<5; i++)
{
counts[[dice[i] value]-1]++;
tally+=[dice[i] value];
}
if (counts[0]>=4 || counts[1]>=4 ||
counts[2]>=4 || counts[3]>=4 ||
counts[4]>=4 || counts[5]>=4)
return tally+25;
else
return 0;
}
int scoreYarborough(id dice[5])
{
int tally=0,i;
for (i=0; i<5; i++)
tally+=[dice[i] value];
return tally;
}
int scoreKismet(id dice[5])
{
int digit,i;
digit = [dice[0] value];
for (i=1; i<5; i++)
{
if ([dice[i] value] != digit)
return 0;
}
return digit*5+50;
}
///////////////////////////////////////////////////////////////////////
static SCOREPROC scoring[] = {
scoreAces,
scoreDeuces,
scoreTreys,
scoreFours,
scoreFives,
scoreSixes,
scoreTwoPairSameColor,
scoreThreeOfAKind,
scoreStraight,
scoreFlush,
scoreFullHouse,
scoreFullHouseSameColor,
scoreFourOfAKind,
scoreYarborough,
scoreKismet
};
int scoreThis(id dice[5], int tag)
{
return (*scoring[tag])(dice);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.