|
|
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 b
Length: 7505 (0x1d51)
Types: TextFile
Names: »best_score.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Galaxy/src/best_score.c«
/*
* %W% (mrdch&amnnon) %G%
*/
/*
* this program displays best scores ( optional all ) from the score
* file.
* options:
* -t 10 best winners and related stat.
* -a all scores sorted by time.
* -m only my games.
* user only `user''s games.
*/
# include <sys/types.h>
# include <sys/stat.h>
# include "score.h"
# include "constants.h"
struct reslts
{
char namepl[20] ;
int nwon ;
int nlost ;
int nyears ;
};
int n_entries ;
struct score *entries ;
struct reslts *uprslts ;
glxscore(ac, av)
int ac ;
char **av ;
{
struct stat stbuf ;
char *malloc() ;
int fd ;
register int i ;
struct reslts *scrpn ;
char *getlogin();
if(stat(GALSCOR, &stbuf) == -1) {
print("No score file.\n\r") ;
return;
}
n_entries = stbuf.st_size / sizeof(struct score) ;
if((n_entries * sizeof(struct score)) != stbuf.st_size) {
print("Ill formatted score file.\n\r") ;
return;
}
entries = (struct score *) malloc(stbuf.st_size) ;
uprslts = (struct reslts *)
malloc(n_entries * sizeof(struct reslts)) ;
if(entries == 0 || uprslts == 0) {
print("cannot allocate entry space.\n\r") ;
return;
}
scrpn = uprslts ;
for (i = 0 ; i < n_entries ; i++ ,scrpn++ ) {
scrpn->nwon = 0 ;
scrpn->nlost = 0 ;
scrpn->nyears = 0 ;
}
fd = open(GALSCOR, 0) ;
if(fd == -1) {
perror(GALSCOR) ;
return;
}
if(read(fd, (char *) entries, stbuf.st_size) != stbuf.st_size) {
perror("read error") ;
return;
}
ac-- , av++ ;
for(i = 0 ; i < ac ; i++) {
if(av[i][0] == '-')
switch(av[i][1]) {
case 't' :
dispbest(10) ;
break;
case 'a' :
dispall() ;
break ;
case 'm' :
dispuser(getlogin()) ;
break ;
default :
print("unknown option.\n\r") ;
return;
}
else
dispuser(av[i]) ;
}
}
dispuser(plname)
char *plname ;
{
struct reslts *scrpn ;
int i, nply ;
nply = findbest() ;
scrpn = uprslts ;
for (i = 0 ; i < nply ; i++ ,scrpn++)
if (strcmp(scrpn->namepl , plname) == 0)
break ;
if ( i == nply ) {
print("\n\rIt seems that %s never played galaxy. Poor man...\n\r",plname) ;
return;
}
print("\n\rThe GALAXY results for %s are:\n\r",plname) ;
print("==================================\n\r") ;
print("Games won: %d\tGames lost: %d\tTotal years played: %d\n\r\n\r",
scrpn->nwon, scrpn->nlost, scrpn->nyears) ;
print("This is the complete list:\n\r") ;
print("\n\rWinner\tLooser\tYears\tWinning date and time\n\r") ;
print("------------------------------------------------\n\r") ;
for ( i = 0 ; i < n_entries ; i++ ) {
if (strcmp(plname , entries[i].win) == 0 )
dispentr(i) ;
if(strcmp (plname , entries[i].los) == 0 )
dispentr(i) ;
}
}
dispbest(nbest)
{
struct reslts *scrpn ;
int i, nply;
nply = findbest() ;
scrpn = uprslts ;
print("\n\r******************************************************") ;
print("\n\r\t\tBest players in GALAXY game\n\r") ;
print("******************************************************\n\r\n\r") ;
print("Rank\tPlayer\tWon\tLost\tYears\tScore\n\r") ;
print("----------------------------------------------\n\r") ;
for (i = 0 ; i < nbest && i < nply ; i++, scrpn++)
print("%d\t%s\t%3d\t%3d\t%3d\t%3d\n\r",i+1, scrpn->namepl,
scrpn->nwon, scrpn->nlost, scrpn->nyears, 2*scrpn->nwon - scrpn->nlost) ;
print("\n\r") ;
}
findbest()
{
int i, j, k , p_players ;
int which ;
int qcmp() ;
i = 0 ;
p_players = 0 ;
for(i = 0 ; i < n_entries ; i++) {
if ( strcmp(entries[i].win , "-null") == 0 )
continue ;
if ( strcmp(entries[i].los , "-null") == 0 )
continue ;
if ( strcmp(entries[i].los , entries[i].win) == 0 )
continue ;
which = -1 ;
for (j = 0 ; j < p_players ; j++ ) {
if (strcmp(uprslts[j].namepl,entries[i].win) == 0 ) {
which = j ;
}
}
if (which != -1)
updt_res(i,1,which) ;
else
add_player(i,1,p_players++) ;
which = -1 ;
for (j = 0 ; j < p_players ; j++ ) {
if(strcmp (uprslts[j].namepl,entries[i].los) == 0 ) {
which = j ;
}
}
if (which != -1)
updt_res(i,0,which ) ;
else
add_player(i,0,p_players++) ;
}
qsort(uprslts, p_players, sizeof uprslts[0], qcmp);
return(p_players) ;
}
add_player(at_entry,ifwon,new_player)
int at_entry; /* where is the player located at entry table */
int ifwon; /* did he win this time */
int new_player; /* pointer to the new players entry */
{
if (ifwon)
strcpy(uprslts[new_player].namepl,entries[at_entry].win);
else
strcpy(uprslts[new_player].namepl,entries[at_entry].los);
updt_res(at_entry,ifwon,new_player) ;
}
updt_res(i,winner,player)
{
uprslts[player].nwon += winner ;
uprslts[player].nlost += !winner ;
uprslts[player].nyears += entries[i].years ;
}
qcmp(p1,p2)
struct reslts *p1 ,*p2 ;
{
return((2*p2->nwon - p2->nlost) - (2*p1->nwon - p1->nlost ) ) ;
}
dispall()
{
register int i ;
print("\n\r******************************************************") ;
print("\n\r\tThe complete list of the GALAXY games\n\r") ;
print("******************************************************\n\r") ;
print("\n\rWinner\tLooser\tYears\tWinning date and time\n\r") ;
print("------------------------------------------------\n\r") ;
for(i = 0 ; i < n_entries ; i++)
dispentr(i) ;
}
dispentr(i)
{
char *ctime();
print("%s\t%s\t%d\t%s",
entries[i].win, entries[i].los,
entries[i].years,
ctime(&entries[i].played_at)) ;
}