DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T r

⟦b34f4492e⟧ TextFile

    Length: 3541 (0xdd5)
    Types: TextFile
    Names: »remark.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/Sun/Othello/remark.c« 

TextFile


/*  remark.c
 *
 *  Remark making code.
 *
 *  Copyright: Chris Miller, 1979, 1981, 1984
 *
 *  Included with this othello game by
 *  Rich Burridge, Sun Microsystems, Australia - December 1986.
 */

#include "othello.h"

char rem_file[] = LIBPATH(LIB,othello.remarks) ;

extern int aspire ;
extern int cretin_flag ;
extern int last_remark ;
extern Panel_item remark_mes ;

FILE *rem_fp ;
long good_remarks[MAX_REMARKS],bad_remarks[MAX_REMARKS] ;
int max_good = 0 ;
int max_bad = 0 ;
 

make_remark(machine_piece,value)
int machine_piece,value ;

{
  char message[100] ;

  value *= machine_piece ;
  if (value < -INFINITY+64)
    {
      last_remark = FIRST_REMARK ;	   /* Always remark next time */
      if (aspire == MAXASPIRE)
	(void) sprintf(message,"You should win  (by at most %d)",-value-INFINITY+64) ;
      else (void) strcpy(message,"You should win.") ;
    }
  else if (value < -1000)
    {
      if (last_remark != -INFINITY)
	{
	  cretin_flag = TRUE ;
	  last_remark = -INFINITY ;
	  (void) strcpy(message,"Only a cretin could lose now.") ;
	}
    }
  else if (value <= 1000) printr(value,message) ;
  else if (value < INFINITY-63)
    {
      if (last_remark!=INFINITY)
	{
	  (void) strcpy(message,"Resign, you dolt! Resistance is futile.") ;
	  last_remark = INFINITY ;
	}
    }
  else
    {
      last_remark = FIRST_REMARK ;
      if (aspire == MAXASPIRE)
	(void) sprintf(message,"I shall win  (by at least %d).", value-INFINITY+64) ;
      else (void) strcpy(message,"I shall win") ;
    }
  remark_msg(message) ;
}


get_remarks ()

/*  Set up file pointers to remarks; the format of the remarks file is:
 *
 *  Remarks to the effect that machine is winning, in increasing order of
 *  strength, one per line.
 *
 *  A line beginning with the character "@".
 *
 *  Remarks to the effect that human is winning, in increasing order of
 *  strength, one per line.
 */

{
  long fp = 0l ;
  int ch ;

  rem_fp = fopen(rem_file,"r") ;
  if (rem_fp == NULL)
    {
      remark_msg("Remarks not available") ;
      return ;
    }

  while ((ch = getc(rem_fp)) != EOF)
    {
      if (ch == '@') break ;
      good_remarks[max_good++] = fp++ ;
      if (max_good == MAX_REMARKS)
	{
	  remark_msg("Too many remarks") ;
	  return ;
	}
      while (ch != '\n')
	{
	  ch = getc(rem_fp) ;
	  fp++ ;
	}
    }
  max_good-- ;

  fp++ ;
  while (ch != '\n')
    {
      ch = getc(rem_fp) ;
      fp++ ;
    }
 
  while ((ch = getc(rem_fp)) != EOF)
    {
      bad_remarks[max_bad++] = fp++ ;
      if (max_bad == MAX_REMARKS)
	{
	  remark_msg("Too many remarks") ;
	  return ;
	}
      while (ch != '\n')
	{
	  ch = fgetc(rem_fp) ;
	  fp++ ;
	}
    }
  max_bad-- ;
}
 

printr(n,string)
int n ;
char string[100] ;

/*  Locate file-pointer and print appropriate line. The strange
 *  computation is to cluster remarks towards low evaluations,
 *  since the evaluation function changes more rapidly with small
 *  changes in position as the evaluation gets larger
 */

{
  int ch ;
  int index ;
  float findex ;
  int sign_n = (n < 0 ? -1 : 1) ;
  char *stringp = string ;

  if (rem_fp == NULL) return ;

  findex = (float) abs(n) / 1000.0 ;
  index = findex * (2-findex) * (n < 0 ? max_bad : max_good) + 0.5 ;

/* Don't make the same remark twice in a row */

  if (index * sign_n == last_remark) return ;

  last_remark = index * sign_n ;
  fseek(rem_fp,n < 0 ? bad_remarks[index] : good_remarks[index],0) ;
  while ((ch = getc(rem_fp)) != EOF)
    {
      if (ch == '\n') break ;
      *stringp++ = ch ;
    }
  *stringp = '\0' ;
}