home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / volume13 / xmake5 / part01 < prev    next >
Encoding:
Internet Message Format  |  1992-01-12  |  54.5 KB

  1. Path: uunet!zephyr.ens.tek.com!master!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v13i010:  xmake5 - connect five-in-a-row game, Part01/03
  5. Message-ID: <2160@masterCNA.TEK.COM>
  6. Date: 13 Dec 91 22:20:37 GMT
  7. Sender: news@masterCNA.TEK.COM
  8. Lines: 1552
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: hsiehch@SPUNKY.CS.NYU.EDU (Chih-Hung Hsieh)
  12. Posting-number: Volume 13, Issue 10
  13. Archive-name: xmake5/Part01
  14. Environment: C++, X11, curses
  15.  
  16. [This requires a C++ compiler to build and includes both an X and curses
  17.  interface.  -br]
  18.  
  19. #! /bin/sh
  20. # This is a shell archive.  Remove anything before this line, then unpack
  21. # it by saving it into a file and typing "sh file".  To overwrite existing
  22. # files, type "sh file -c".  You can also feed this as standard input via
  23. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  24. # will see the following message at the end:
  25. #        "End of archive 1 (of 3)."
  26. # Contents:  README MANIFEST cmake5.C initbd.C xmake5.c
  27. # Wrapped by billr@saab on Fri Dec 13 14:14:56 1991
  28. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  29. if test -f 'README' -a "${1}" != "-c" ; then 
  30.   echo shar: Will not clobber existing file \"'README'\"
  31. else
  32. echo shar: Extracting \"'README'\" \(2786 characters\)
  33. sed "s/^X//" >'README' <<'END_OF_FILE'
  34. XX11 Based Make5 / Version 1.1
  35. X
  36. XMake5 is an interesting and challenging game.  It is also
  37. Xcalled 5-in-a-row or Go-Moku in other programs.  Rules of 
  38. Xthis game and other details are available in the on-line 
  39. XHELP, the file xmake5.doc, and the man page xmake5.6.
  40. X
  41. XHow to Install:
  42. X---------------
  43. X
  44. XThis program has been tested on SUN4 and SUN3 with X11/R4.
  45. XA simple Makefile is provided to create the executable 
  46. Xfiles xmake5 and cmake5.  
  47. X
  48. X"xmake5" uses the Athena widgets and "cmake5" uses the
  49. XUNIX curses library.  They both require a C++ compiler.
  50. XYou may use GNU C and C++ compilers if it is feasible.
  51. X
  52. XTo make the executable files:
  53. X
  54. X(1) Change the directory and file names in the Makefile:
  55. X        BINDIR:         where to put the executable files
  56. X        SCOREDIR:       where to put the high score files
  57. X        MANDIR:         where to put the man pages
  58. X        SCORE_F:        the high score file
  59. X        LOCK_F:         the locker for the high score file
  60. X        MAILER:         used by cmake5 only
  61. X
  62. X(2) Type "make" to make "xmake5", "cmake5", and the initial
  63. X    high score file.
  64. X
  65. X(3) Type "make install" to install "xmake5" and "cmake5"
  66. X    in the BINDIR, and to copy "xmake5.6" and "cmake5.6"
  67. X    to the MANDIR.
  68. X
  69. XIn XMake5.ad you can find the X resources used by xmake5.
  70. XThe defaults listed in XMake5.ad could be modified for your
  71. Xcustomized X environment.  Like all X application default files,
  72. Xyou may put your own XMake5 in your X application default 
  73. Xdirectory or merge it into your X resource database using the
  74. Xfollowing command:  "xrdb -merge XMake5".
  75. X
  76. X                                               November 28, 1991
  77. X
  78. XAuthor:  Chih-Hung Hsieh  (pronounce as Chi Hong Shay)
  79. X
  80. XE-mail:  hsiehch@cs.nyu.edu
  81. X
  82. X
  83. X        Hsieh                   Chih                    Hung    
  84. X------------------------ ------------------------ ------------------------
  85. X ,,,       ||'      ||'             ||'           ,,,,,,,,,|,     ||,
  86. X  '||    ,,|,,,|    ||              ||        ,,          ||'     ||
  87. X,,,,|,|, ||   ||    ||   '''''''''''||'''''''''''         ||      ||
  88. X         ||'''|| ,,,||,|            ||             |,,,,,,||     ,|'
  89. X ,,,,|,  ||,,,||    ||              ||      ,,     ||     ''     ||
  90. X         ||   ||,,  ||     ''''''''''''''''''''    ||            ||
  91. X ''''''  || ,,||'   ||             ,,              ||,,,,,,|,   ||
  92. X ,     '||'' ,|| |  ||      ,  ||'  '|,    ,,      ''     ||'   |'   ',
  93. X ||''||    ,|'||  | ||      |  ||    ''     '|,           ||   |'     '|
  94. X ||  || ,,''  ||    ||    ,|'  ||         |  '||         ,|'  ,'      ,||
  95. X ||  ||       ||    ||   ,||   ||         |,  ||'       ,|' ,,|,,,|''' '||
  96. X ||''''    ''||' ''||'   ''    '|||||||||||'       '''|||'   ''''       ||
  97. X------------------------ ------------------------ ------------------------
  98. END_OF_FILE
  99. if test 2786 -ne `wc -c <'README'`; then
  100.     echo shar: \"'README'\" unpacked with wrong size!
  101. fi
  102. # end of 'README'
  103. fi
  104. if test -f 'MANIFEST' -a "${1}" != "-c" ; then 
  105.   echo shar: Will not clobber existing file \"'MANIFEST'\"
  106. else
  107. echo shar: Extracting \"'MANIFEST'\" \(796 characters\)
  108. sed "s/^X//" >'MANIFEST' <<'END_OF_FILE'
  109. X   File Name        Archive #    Description
  110. X-----------------------------------------------------------
  111. X COPYRIGHT                  3    
  112. X MANIFEST                   1    This shipping list
  113. X Makefile                   2    
  114. X README                     1    
  115. X bdconst.h                  2    
  116. X board.xbm                  3    
  117. X cmake5.6                   3    
  118. X cmake5.C                   1    
  119. X debug.inc                  2    
  120. X drawing.c                  2    
  121. X helptext.C                 2    
  122. X initbd.C                   1    
  123. X line_val.inc               3    
  124. X make5.C                    2    
  125. X make5.xbm                  2    
  126. X printhelp.c                3    
  127. X record.c                   2    
  128. X select.C                   2    
  129. X xmake5.6                   2    
  130. X xmake5.c                   1    
  131. X xmake5.doc                 2    
  132. X xmake5.h                   3    
  133. END_OF_FILE
  134. if test 796 -ne `wc -c <'MANIFEST'`; then
  135.     echo shar: \"'MANIFEST'\" unpacked with wrong size!
  136. fi
  137. # end of 'MANIFEST'
  138. fi
  139. if test -f 'cmake5.C' -a "${1}" != "-c" ; then 
  140.   echo shar: Will not clobber existing file \"'cmake5.C'\"
  141. else
  142. echo shar: Extracting \"'cmake5.C'\" \(16849 characters\)
  143. sed "s/^X//" >'cmake5.C' <<'END_OF_FILE'
  144. X// File: cmake5.C       (the Make5 game program, curses version)
  145. X
  146. Xextern "C" {
  147. X#include <stdio.h>
  148. X#include <curses.h>
  149. Xextern char *strdup(char *);
  150. Xextern void srand(int), exit(int);
  151. Xextern int  time(int);
  152. Xextern char toupper(char);
  153. Xextern char *getlogin(void);
  154. Xextern void mail_record(int,int,int[]);
  155. Xextern void add_score_record(int,int,int);
  156. X}
  157. X// ---------------------------------------------------------------------
  158. X
  159. Xextern char *ScoreF;
  160. X
  161. X#define max(a,b) (a>b?a:b)
  162. X#define min(a,b) (a<b?a:b)
  163. X
  164. Xvoid c_time(int &t)     { t = time(0); }
  165. Xint  c_lines(void)      { return LINES; }
  166. Xint  c_cols(void)       { return COLS; }
  167. Xvoid c_key_raw(void)    { noecho(); cbreak(); }
  168. Xvoid c_repaint(void)    { clearok(curscr,TRUE); wrefresh(curscr); }
  169. Xvoid c_addint(int n)    { printw("%d",n); refresh(); }
  170. Xvoid c_initscr(void)    { initscr(); idlok(stdscr,TRUE); 
  171. X                          scrollok(stdscr,TRUE), nl(); }
  172. Xvoid c_clear(void)      { clear(); }
  173. Xvoid c_endwin(void)     { endwin(); }
  174. Xvoid c_addch(char c)    { addch(c); refresh(); }
  175. Xvoid c_move(int r, int c)   { move(r,c); refresh(); }
  176. Xvoid c_addch_at(char x,int r, int c) { move(r,c); addch(x); refresh(); }
  177. Xvoid c_clrscr(void)     { clear(); move(0,0); refresh(); }
  178. Xvoid c_clreol(void)     { clrtoeol(); refresh(); }
  179. Xvoid c_getkey(char &x)  { while ((x=getch()) == 12) c_repaint(); }
  180. Xvoid c_getret(void)     { char c; do {c_getkey(c);} while (c!='\n');}
  181. X// ---------------------------------------------------------------------
  182. X
  183. Xconst char
  184. X  wall  = '#' ,  blank = '.' ,
  185. X  black = 'X' ,  white = 'O' ,  xmark = '*' ;
  186. X
  187. Xconst int
  188. X  bdx = 19 ,      bdy = 1 ,
  189. X  msg_row = 1 ,   name_row = 2 ,  mark_row = 3 , msg_width = 16,
  190. X  bdwidth = 21 ,  bdlength = 440,
  191. X  start_pos = 22, end_pos = 418,  center_point = 220;
  192. X
  193. Xconst int msg_col[2] = {0,63};
  194. X
  195. Xextern char board[bdlength+1];          // in initbd.C
  196. X
  197. Xchar *bar_str = "----------------" ;
  198. X
  199. Xchar mark_str[2][msg_width+1];
  200. X
  201. Xchar  *(command_keys[2]) = {
  202. X"[R]:redraw [IJKL1..9]:move [RETURN]:set [S]:sound [H]:hint [U]:undo [Q]:quit",
  203. X"   [R]:redraw    [IJKL1..9]:move    [RETURN]:set    [S]:sound    [Q]:quit"} ;
  204. X
  205. Xint   time1,time2;
  206. Xint   player_time[2];
  207. Xchar  player_color[2];
  208. Xint   esc,back;         // boolean
  209. Xchar  bdmark[441];      // boolean
  210. Xchar  bell;
  211. X
  212. X// ---------------------------------------------------------------------
  213. Xstatic char     computer_name[20];
  214. Xstatic char     *warning_msg;
  215. Xstatic int      game_over, warning_msg_on, challenging;
  216. Xstatic int      last_move_rec, move_rec[360];
  217. X
  218. X#define the_last_move move_rec[last_move_rec]
  219. X
  220. Xstatic char     *(player_name[2]);
  221. X
  222. Xint          step, player;              /* used in make5.C  */
  223. Xint          min_depth, max_depth;      /* used in select.C */
  224. X
  225. X// ---------------------------------------------------------------------
  226. Xextern "C" void init_data(void);       /* in make5.C */
  227. Xextern "C" char *get_warning(int,int);
  228. Xextern "C" int  is_game_over(int,int);
  229. Xextern "C" void set_on(int,int), take_out(int);
  230. Xextern "C" int  computer_move(int), computer_suggest(int);
  231. X
  232. Xstatic void show_command_keys(void);
  233. Xstatic void show_high_score(int);
  234. X// --------------------------------------------------------------------
  235. X// --------------------------------------------------------------------
  236. X//      Board coordinates computation
  237. X
  238. X// --------------------------------------------------------------------
  239. Xinline int x_col(int x) {
  240. X  return (bdx + ((x % bdwidth) * 2)) ;
  241. X}
  242. X// --------------------------------------------------------------------
  243. Xinline int x_row(int x) {
  244. X  return (bdy + (x / bdwidth)) ;
  245. X}
  246. X
  247. X// --------------------------------------------------------------------
  248. X// --------------------------------------------------------------------
  249. X//      Simple character and string I/O
  250. X
  251. Xinline void moveto(int x) {
  252. X  c_move(x_row(x),x_col(x)) ;
  253. X}
  254. X// --------------------------------------------------------------------
  255. Xvoid write_blanks(int n) {
  256. X  for (int i=0; i<n; i++) c_addch(' ');
  257. X}
  258. X// ---------------------------------------------------------------------
  259. Xvoid randomize(void) {
  260. Xint t;
  261. X  c_time(t); srand(t);
  262. X}
  263. X// --------------------------------------------------------------------
  264. Xvoid clean_screen(int r, int c, int w) {
  265. X  c_move(r,c); write_blanks(w);
  266. X}
  267. X// --------------------------------------------------------------------
  268. Xvoid clear_line(int r) {
  269. X  c_move(r,0); c_clreol();
  270. X}
  271. X// --------------------------------------------------------------------
  272. Xstatic void write_str(char *x) {
  273. X  while (*x) {c_addch(*x); x++; }
  274. X}
  275. X// --------------------------------------------------------------------
  276. Xvoid write_str_at(int r, int c, char *x) {
  277. X  c_move(r,c); write_str(x);
  278. X}
  279. X// --------------------------------------------------------------------
  280. Xvoid two_digit(int n) {
  281. X  if (n < 10) c_addch('0');
  282. X  c_addint(n);
  283. X}
  284. X// --------------------------------------------------------------------
  285. Xvoid display_time(int p, int t) {
  286. X  c_move(0,msg_col[p]+8);
  287. X  player_time[p] += t;
  288. X  c_addch('(');  two_digit(player_time[p] / 60);
  289. X  c_addch(':');  two_digit(player_time[p] % 60);
  290. X  c_addch(')');
  291. X}
  292. X
  293. X// --------------------------------------------------------------------
  294. X// --------------------------------------------------------------------
  295. X//      Higher-level I/O
  296. X
  297. Xint yes_no(int r, char *msg) {
  298. X  char x;
  299. X  do {
  300. X    clear_line(r);
  301. X    write_str(msg); write_str(" (y/n)"); c_addch(' '); c_getkey(x) ;
  302. X    x = toupper(x) ;
  303. X  } while (x != 'Y' && x != 'N');
  304. X  c_addch(x);
  305. X  return (x == 'Y');
  306. X}
  307. X// --------------------------------------------------------------------
  308. Xchar *get_name() { return (getlogin()); }
  309. X
  310. X// --------------------------------------------------------------------
  311. X// --------------------------------------------------------------------
  312. X//      Marks on the Board
  313. X
  314. Xinline char x_rowmark(int x) {
  315. X  return ('A' + (x/bdwidth) - 1) ;
  316. X}
  317. X// --------------------------------------------------------------------
  318. Xinline char x_colmark(int x) {
  319. X  return ('a' + (x%bdwidth) - 1) ;
  320. X}
  321. X// --------------------------------------------------------------------
  322. Xvoid markon(int x, char c) {
  323. X  moveto(x) ;  c_addch(c);  moveto(x);
  324. X}
  325. X// --------------------------------------------------------------------
  326. Xvoid resetmark(int x) {         //  reset marks on the screen
  327. X  if (bdmark[x])  markon(x,xmark);
  328. X  else markon(x,blank);
  329. X}
  330. X// --------------------------------------------------------------------
  331. Xvoid clr_mark() {               /*  clear marks on the screen */
  332. X  for (int i=start_pos; i<=end_pos; i++)
  333. X    if (bdmark[i]) {
  334. X      bdmark[i] = 0;
  335. X      markon(i,board[i]) ;
  336. X    }
  337. X}
  338. X// ---------------------------------------------------------------------
  339. Xvoid markx(int p, int x, int i, int &sw) {
  340. X  sw = i ;
  341. X  if (board[x] == blank)
  342. X       if (sw == 1) markon(x,player_color[p]);
  343. X       else         resetmark(x);
  344. X  else markon(x,board[x]) ;
  345. X}
  346. X// ---------------------------------------------------------------------
  347. Xstatic void redraw_board()
  348. X{   int i,j,n;
  349. X
  350. X  c_clrscr();
  351. X  c_move(bdy,bdx);
  352. X  for(i=2,n=bdwidth*2; i<=n; i++) c_addch(wall);
  353. X  for(i=bdwidth,n=bdlength-bdwidth; i<=n; i++) {
  354. X        j=i%bdwidth;
  355. X        if (j==0 || j==bdwidth-1) markon(i,wall);
  356. X        else markon(i,board[i]);
  357. X  }
  358. X  c_move(bdy+bdwidth-1,bdx);
  359. X  for(i=2,n=bdwidth*2; i<=n; i++) c_addch(wall);
  360. X
  361. X/*
  362. X  for(i=1,n=bdwidth-2; i<=n; i++) {
  363. X    j = i * bdwidth;
  364. X    c_addch_at(x_rowmark(j), x_row(j),    bdx-1);
  365. X    c_addch_at(x_rowmark(j), x_row(j),    bdx+2*bdwidth-1);
  366. X    c_addch_at(x_colmark(i), bdy-1,       x_col(i));
  367. X    c_addch_at(x_colmark(i), bdy+bdwidth, x_col(i));
  368. X  }
  369. X*/
  370. X
  371. X  for (i=0; i<2; i++) {
  372. X    write_str_at(msg_row, msg_col[i],   bar_str) ;
  373. X    write_str_at(name_row,msg_col[i],   player_name[i]) ;
  374. X    write_str_at(mark_row,msg_col[i],   mark_str[i]) ;
  375. X    write_str_at(0,       msg_col[i]+8, "(00:00)");
  376. X  }
  377. X}
  378. X
  379. X// ---------------------------------------------------------------------
  380. X// ---------------------------------------------------------------------
  381. X//              Initialize board status
  382. X
  383. Xstatic int current_level;
  384. Xstatic int min_depths[] = {0,1,2,3,3,3};
  385. Xstatic int max_depths[] = {0,2,4,5,8,9};
  386. X
  387. Xvoid init_play_order(void) {
  388. X    int i,p;
  389. X    char x;
  390. X    write_str_at(3,10,"[1] Challenge mode,    (Computer first)");
  391. X    write_str_at(5,10,"[2] Computer vs Human  (Computer first)");
  392. X    write_str_at(7,10,"[3] Human vs Computer  (Human first)");
  393. X  do {
  394. X    clear_line(0);  write_str("Please choose the play order: (1..3) ") ;
  395. X    c_getkey(x);  i = x - '0';
  396. X  } while (i<1 || i >3);
  397. X  c_addch(x);
  398. X  switch (i) {
  399. X      case 1:
  400. X         player_name[0] = computer_name;
  401. X         player_name[1] = get_name();
  402. X         challenging = 1;
  403. X         break;
  404. X      case 2: case 3:
  405. X         player_name[i-2] = computer_name;
  406. X         player_name[3-i] = get_name();
  407. X         challenging = 0;
  408. X         break;
  409. X  }
  410. X
  411. X  do {
  412. X    clear_line(10);
  413. X    if (challenging)
  414. X      write_str_at(10,0,"Please choose computer\'s search level: (2..5)");
  415. X    else 
  416. X      write_str_at(10,0,"Please choose computer\'s search level: (1..5)");
  417. X    c_addch(' '); c_getkey(x);  current_level = x-'0' ;
  418. X  } while (current_level < 1 ||  current_level > 5 || 
  419. X           (current_level == 1 && challenging));
  420. X  c_addch(x);
  421. X  sprintf(computer_name,"Computer (L%d)",current_level);
  422. X  min_depth = min_depths[current_level];
  423. X  max_depth = max_depths[current_level];
  424. X
  425. X  player_color[0] = black ;
  426. X  player_color[1] = white ;
  427. X  for (p=0; p<2; p++) {
  428. X    for (i=0; i<msg_width; i++)
  429. X      mark_str[p][i] = player_color[p] ;
  430. X    mark_str[p][i]=0;
  431. X  }
  432. X  bell = 7;
  433. X}
  434. X// --------------------------------------------------------------------
  435. Xstatic int new_high_score=0;
  436. Xvoid init_the_board()
  437. X{
  438. X  int i;
  439. X    if (new_high_score) {
  440. X        show_high_score(1);
  441. X        new_high_score = 0;
  442. X    }
  443. X    step = 1; player = 0;
  444. X    last_move_rec = 0;
  445. X    the_last_move = center_point;
  446. X    warning_msg = "";
  447. X    esc = back = game_over = warning_msg_on = 0;
  448. X    for (i=0; i<=bdlength; i++) bdmark[i] = 0;
  449. X    player_time[0] = player_time[1] = 0;
  450. X    c_clrscr();
  451. X    init_play_order();
  452. X    randomize();
  453. X    init_data();        // in make5.C
  454. X    redraw_board();
  455. X}
  456. X// ---------------------------------------------------------------------
  457. X// ---------------------------------------------------------------------
  458. X//      making moves
  459. X
  460. Xstatic void check_game_over(void)
  461. X{
  462. X  warning_msg = get_warning(player,the_last_move);
  463. X  game_over = is_game_over(player,the_last_move);
  464. X  clear_line(23);
  465. X  if (warning_msg[0] != 0) {
  466. X         write_str_at(23,20,warning_msg);
  467. X         c_addch(bell);  warning_msg_on = 1;
  468. X  } else show_command_keys();
  469. X  if (game_over && challenging) {
  470. X        mail_record(current_level,last_move_rec,&(move_rec[1]));
  471. X        if (player==1) {
  472. X                new_high_score=1;
  473. X                add_score_record(current_level,step,player_time[1]);
  474. X        }
  475. X  }
  476. X}
  477. X// ---------------------------------------------------------------------
  478. Xextern void take_out(int);
  479. Xinline void back_one_move() {
  480. X  int x = move_rec[last_move_rec--];
  481. X    take_out(x);
  482. X    markon(x,blank);
  483. X}
  484. X// ---------------------------------------------------------------------
  485. Xstatic void undo()
  486. X{
  487. X    if (step > 2 || (step == 2 && player == 1)) {
  488. X      back_one_move();
  489. X      back_one_move();
  490. X      step--;
  491. X      if (player==0) step--;
  492. X      player=1-player;
  493. X      check_game_over();
  494. X    }
  495. X}
  496. X// ---------------------------------------------------------------------
  497. X// ---------------------------------------------------------------------
  498. X//      get user's move
  499. X
  500. Xvoid adjust(int &x) {           //  adjust X if X is out of range 
  501. X  int r,c;
  502. X  if ((c=(x%bdwidth)) == 0) x++;
  503. X  else if (c == bdwidth-1) x--;
  504. X  if ((r=(x/bdwidth)) == 0) x += bdwidth;
  505. X  else if (r == bdwidth-1) x -= bdwidth;
  506. X}
  507. X// --------------------------------------------------------------------
  508. Xstatic void show_command_keys(void) {
  509. X    write_str_at(23,0,command_keys[challenging]); warning_msg_on=0;
  510. X}
  511. X// --------------------------------------------------------------------
  512. Xvoid wait_first_key(char &k) {
  513. X  if (step == 1)  show_command_keys();
  514. X  moveto(the_last_move);
  515. X  c_getkey(k) ; k = toupper(k) ;
  516. X  if (warning_msg_on) show_command_keys();
  517. X  moveto(the_last_move);
  518. X}
  519. X// --------------------------------------------------------------------
  520. Xextern int  num_of_suggestion, suggest_position[];
  521. Xvoid draw_suggestions()
  522. X{ int i,n,x;
  523. X
  524. X    for (i=0,n=num_of_suggestion; i<n; i++) {
  525. X      x=suggest_position[i];
  526. X      bdmark[x]=1;  markon(x,xmark);
  527. X    }
  528. X}
  529. X// --------------------------------------------------------------------
  530. Xconst int move_dir[10] = {0,20,21,22,-1,0,1,-22,-21,-20};
  531. X
  532. Xint player_move(int p) {
  533. X  int  x,t;
  534. X  char k;
  535. X
  536. X//  c_addch(bell);
  537. X  x = the_last_move;  
  538. X  wait_first_key(k) ;
  539. X  while (1) {
  540. X        switch (k) {
  541. X          case 'I': k='8'; break;
  542. X          case 'J': k='4'; break;
  543. X          case 'K': k='2'; break;
  544. X          case 'L': k='6'; break;
  545. X        }
  546. X        switch (k) {
  547. X          case 'R':
  548. X                 c_repaint();  break;
  549. X          case 'S':
  550. X                 if (bell==7)  bell=0;  else bell=7;
  551. X                 break;
  552. X          case '1': case '2': case '3':
  553. X          case '4': case '5': case '6':
  554. X          case '7': case '8': case '9':
  555. X                 t = x + move_dir[k-'0'] ;
  556. X                 adjust(t) ;
  557. X                 if ( t != x) {
  558. X                   markx(p,x,0,0) ;
  559. X                   x = t ;  markx(p,x,1,0) ;
  560. X                 }
  561. X                 break;
  562. X          case 'U':             // Undo
  563. X                 if (challenging) break;
  564. X                 back = back || (step > 1) ;
  565. X          case 'Q':             //  Quit
  566. X                 esc = esc || k == 'Q';
  567. X                 if (esc || back) {
  568. X                   markx(p,x,0,0) ;  return x;
  569. X                 }
  570. X                 break;
  571. X          case 'H':
  572. X                 if (challenging) break;
  573. X                 c_addch(board[x]) ;
  574. X                 x = computer_suggest(p) ;
  575. X                 draw_suggestions();
  576. X                 markx(p,x,1,0) ;
  577. X                 break;
  578. X          default:
  579. X                if (k == 10 && board[x] == blank)  return x;
  580. X        }
  581. X        c_getkey(k); k=toupper(k);
  582. X  } 
  583. X}
  584. X// --------------------------------------------------------------------
  585. Xint move_of(int p) {            /*  get move of player p */
  586. X  int p2,m;
  587. X
  588. X  clr_mark();
  589. X
  590. X  p2 = 1 - p ;
  591. X  write_str_at(0,msg_col[p],"step:");
  592. X  c_addint(step) ;  c_addch(' ');       //  display current step
  593. X  clean_screen(0,msg_col[p2],8) ;
  594. X  write_str_at(msg_row,msg_col[p],bar_str) ;
  595. X  clean_screen(mark_row,msg_col[p2],msg_width) ;
  596. X
  597. X  c_time(time1);
  598. X  if (player_name[player] == computer_name)  {
  599. X         moveto(the_last_move);
  600. X         m = computer_move(p);
  601. X  } else m = player_move(p) ;
  602. X  c_time(time2);
  603. X  display_time(player,time2-time1);
  604. X
  605. X  write_str_at(mark_row,msg_col[p2],mark_str[p2]) ;
  606. X  write_str_at(msg_row,msg_col[p],bar_str) ;
  607. X  return m;
  608. X}
  609. X
  610. X// ---------------------------------------------------------------------
  611. X// ---------------------------------------------------------------------
  612. X//      Starting and Ending the game
  613. X
  614. Xvoid end_of_game() {
  615. X  char s[80];
  616. X  clear_line(23);
  617. X  sprintf(s,"***  GAME OVER  ***    The winner is: %s [%c]",
  618. X        player_name[player],player_color[player]);
  619. X  write_str(s);
  620. X  write_str_at(23,70,"[RETURN]") ;
  621. X  c_getret(); 
  622. X}
  623. X// --------------------------------------------------------------------
  624. Xstatic void show_high_score(int pause)
  625. X{ FILE *f;
  626. X  int i=0;
  627. X  char c;
  628. X    f = fopen(ScoreF,"r");
  629. X    c_move(0,0);
  630. X    while ((c=fgetc(f)) != EOF) {
  631. X        c_addch(c); 
  632. X        if (c=='\n') i++;
  633. X        if (i>20) break;
  634. X    }
  635. X    fclose(f);
  636. X    if (pause) {
  637. X      write_str_at(23,0,"type [RETURN] to continue...") ; c_getret();
  638. X    } else c_move(23,0);
  639. X}
  640. X// --------------------------------------------------------------------
  641. Xvoid init_window() {
  642. X  c_initscr();
  643. X  c_key_raw();
  644. X  if ((c_lines() < 24) || (c_cols() < 80))  {
  645. X    c_clear();
  646. X    write_str_at(0,0,"This program needs a screen size at least 24 by 80!");
  647. X    c_move(1,0);  c_endwin();
  648. X    exit(0);
  649. X  }
  650. X  c_clrscr() ; 
  651. X  show_high_score(1);
  652. X}
  653. X// --------------------------------------------------------------------
  654. Xvoid main() {
  655. X  int x;
  656. X  init_window();
  657. X  do {
  658. X    init_the_board();
  659. X    do {
  660. X      x = move_of(player) ;
  661. X      if (!esc) {
  662. X        if (back) {
  663. X            undo();  back=0;
  664. X        } else {
  665. X            move_rec[++last_move_rec] = x;
  666. X            markon(x,player_color[player]);
  667. X            set_on(the_last_move,player) ;
  668. X        }
  669. X        check_game_over();
  670. X        if (!game_over) {
  671. X          player = 1 - player ;  //  turn to the next player
  672. X          if (player == 0)  step++;
  673. X        }
  674. X      } else {
  675. X        game_over = 1;
  676. X        player = 1 - player;
  677. X        if (player == 1)  step--;
  678. X      } 
  679. X    } while (!game_over);
  680. X    end_of_game() ;
  681. X  } while (yes_no(22,"Would you want to play again ?"));
  682. X  c_clrscr(); show_high_score(0);
  683. X  c_endwin();
  684. X}
  685. X// -----------------------------------------------------------------------
  686. END_OF_FILE
  687. if test 16849 -ne `wc -c <'cmake5.C'`; then
  688.     echo shar: \"'cmake5.C'\" unpacked with wrong size!
  689. fi
  690. # end of 'cmake5.C'
  691. fi
  692. if test -f 'initbd.C' -a "${1}" != "-c" ; then 
  693.   echo shar: Will not clobber existing file \"'initbd.C'\"
  694. else
  695. echo shar: Extracting \"'initbd.C'\" \(6574 characters\)
  696. sed "s/^X//" >'initbd.C' <<'END_OF_FILE'
  697. X// FILE:        initbd.C
  698. X
  699. X#define true  1
  700. X#define false 0
  701. X
  702. X#include "bdconst.h"
  703. X
  704. Xconst int
  705. X  weight5[5] = {0,1,3,7,15} ,                 // {  -3  -2  -1  }
  706. X  dirx[8] = {20,21,22,-1,1,-22,-21,-20};      // {   4   X  -4  }
  707. X      // {1,-22,-21,-20,0,20,21,22,-1}        // {   1   2   3  }
  708. X      // -4..4 ==> 0..7                       // {   5   6   7  }
  709. X      // 1 2 3 4 ==> 0 1 2 3                  // {   3   X   4  }
  710. X      // -1 -2 -3 -4 ==> 7 6 5 4              // {   0   1   2  }
  711. X
  712. X#include "line_val.inc"
  713. X// defines "const line_val_type line_val"
  714. X
  715. Xint weight31[31];
  716. X//---------------------------------------------------------------------------
  717. Xconst pt_lev_range
  718. X  point_lev_tab[max_line_lev+1][max_line_lev+1]
  719. X    = {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  720. X       { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  721. X       { 0, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3},
  722. X       { 0, 1, 2, 2, 2, 2, 4, 4, 4, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
  723. X       { 0, 1, 2, 2, 2, 2, 4, 4, 4, 6, 6, 6, 8, 8, 8,10,10,10,10,10,10},
  724. X       { 0, 1, 2, 2, 2, 2, 4, 4, 4, 6, 6, 6, 8, 8, 8,10,10,10,12,12,12},
  725. X       { 0, 1, 2, 4, 4, 4, 5, 5, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7},
  726. X       { 0, 1, 2, 4, 4, 4, 5, 5, 5, 7, 7, 7, 9, 9, 9,11,11,11,11,11,11},
  727. X       { 0, 1, 2, 4, 4, 4, 5, 5, 5, 7, 7, 7, 9, 9, 9,11,11,11,13,13,13},
  728. X       { 0, 1, 3, 6, 6, 6, 7, 7, 7,14,14,14,14,14,14,17,17,19,19,19,19},
  729. X       { 0, 1, 3, 6, 6, 6, 7, 7, 7,14,14,14,15,15,15,17,17,19,19,19,19},
  730. X       { 0, 1, 3, 6, 6, 6, 7, 7, 7,14,14,14,15,15,15,17,17,19,19,19,19},
  731. X       { 0, 1, 3, 6, 8, 8, 7, 9, 9,14,15,15,16,16,16,18,18,18,18,18,18},
  732. X       { 0, 1, 3, 6, 8, 8, 7, 9, 9,14,15,15,16,18,18,18,18,20,20,20,20},
  733. X       { 0, 1, 3, 6, 8, 8, 7, 9, 9,14,15,15,16,18,18,18,18,20,20,20,20},
  734. X       { 0, 1, 3, 6,10,10, 7,11,11,17,17,17,18,18,18,21,21,22,24,24,24},
  735. X       { 0, 1, 3, 6,10,10, 7,11,11,17,17,17,18,18,18,21,21,22,24,24,24},
  736. X       { 0, 1, 3, 6,10,10, 7,11,11,19,19,19,18,20,20,22,22,23,25,26,27},
  737. X       { 0, 1, 3, 6,10,12, 7,11,13,19,19,19,18,20,20,24,24,25,25,26,27},
  738. X       { 0, 1, 3, 6,10,12, 7,11,13,19,19,19,18,20,20,24,24,26,26,26,27},
  739. X       { 0, 1, 3, 6,10,12, 7,11,13,19,19,19,18,20,20,24,24,27,27,27,27}};
  740. X
  741. X   // point_lev_tab[0][*] and point_lev_tab[*][0] are not used.
  742. X
  743. X//---------------------------------------------------------------------------
  744. Xchar board[x_index_range];
  745. X
  746. Xbdstatus_type bdstatus;
  747. X//---------------------------------------------------------------------------
  748. Xvoid init_board(void) {  // { initialize chess board }
  749. Xint i;
  750. X  for (i=0; i<=bdlength; i++)  // { clear the chess board to blank }
  751. X    board[i] = blank;
  752. X  for (i=0; i<bdwidth; i++)
  753. X  {
  754. X    board[i] = wall;                // { set top margin }
  755. X    board[bdlength-i] = wall;       // { set bottom margin }
  756. X    board[i*bdwidth] = wall;        // { set left margin }
  757. X    board[(i+1)*bdwidth-1] = wall;  // { set right margin }
  758. X  }
  759. X}
  760. X//---------------------------------------------------------------------------
  761. Xvoid init_weight31() {
  762. Xint i;
  763. X  weight31[0] = 0;
  764. X  for (i=1; i<31; i++)
  765. X    weight31[i] = weight31[i-1] + i;
  766. X}
  767. X//---------------------------------------------------------------------------
  768. Xint get_side_lev(int x,int d,char c) {
  769. Xint i,v;
  770. X  v = 0;  d = dirx[d];
  771. X  for (i=0; i<4; i++)
  772. X  {
  773. X    x += d;
  774. X    if (board[x] == c )   v = (v << 1) + 1;
  775. X    else if (board[x] == blank ) v <<= 1;
  776. X    else return(v + weight5[i]);
  777. X  }
  778. X  x += d;
  779. X  if (board[x] != c)  return(v + weight5[4]);
  780. X  for (i=3; i>=0; i--) {
  781. X          x -= d;
  782. X          if (board[x] == c)  v >>= 1;
  783. X          else return ((v >> 1) + weight5[i]);
  784. X  }
  785. X  return (max_side_lev);    // { very special condition }
  786. X}
  787. X//---------------------------------------------------------------------------
  788. Xvoid set_side_lev(int x) {
  789. X  for (int d=0; d<8; d++)
  790. X    bdstatus.side_lev[x][0][d] = get_side_lev(x,d,white);
  791. X}
  792. X//---------------------------------------------------------------------------
  793. Xvoid set_line_lev(int x,int c,int d) {
  794. Xint c1,c2;
  795. X      c1 = bdstatus.side_lev[x][c][d];
  796. X      c2 = bdstatus.side_lev[x][c][7-d];
  797. X      if ((c1 == max_side_lev) || (c2 == max_side_lev))
  798. X             bdstatus.line_lev[x][c][d] = max_line_lev;
  799. X      else if (c1 < c2)
  800. X                 bdstatus.line_lev[x][c][d] = line_val[weight31[c2]+c1];
  801. X            else bdstatus.line_lev[x][c][d] = line_val[weight31[c1]+c2];
  802. X}
  803. X//---------------------------------------------------------------------------
  804. Xstatic void set_all_line_lev(int x) {
  805. X    for (int d=0; d<4; d++) set_line_lev(x,0,d);
  806. X}
  807. X//---------------------------------------------------------------------------
  808. Xvoid set_point_lev(int x, int c) {
  809. Xint k,m,n,d;
  810. X    m = n = max_pt_lev;
  811. X    for (d=0; d<4; d++) {
  812. X      k = bdstatus.line_lev[x][c][d];
  813. X      if (m < n)
  814. X           { if (k < n) n = k; }
  815. X      else { if (k < m) m = k; }
  816. X    }
  817. X    bdstatus.point_lev[x][c] = point_lev_tab[m][n];
  818. X}
  819. X//---------------------------------------------------------------------------
  820. Xvoid compute_bdstatus(void) {
  821. Xint x,d;
  822. X  for (x=0; x<=bdlength; x++)
  823. X    if  (board[x] == wall) {
  824. X           for (d=0; d<8; d++) bdstatus.side_lev[x][0][d] = max_side_lev;
  825. X           for (d=0; d<4; d++) bdstatus.line_lev[x][0][d] = max_line_lev;
  826. X           bdstatus.point_lev[x][0] = max_pt_lev;
  827. X    }
  828. X    else {
  829. X           set_side_lev(x);
  830. X           set_all_line_lev(x);
  831. X           set_point_lev(x,0);
  832. X    }
  833. X}
  834. X//---------------------------------------------------------------------------
  835. Xvoid copy12(void) {
  836. Xint x,d;
  837. X    for (x=0; x<=bdlength; x++) {
  838. X      for (d=0; d<8; d++)
  839. X                bdstatus.side_lev[x][1][d] = bdstatus.side_lev[x][0][d];
  840. X      for (d=0; d<4; d++)
  841. X                bdstatus.line_lev[x][1][d] = bdstatus.line_lev[x][0][d];
  842. X      bdstatus.point_lev[x][1] = bdstatus.point_lev[x][0];
  843. X    }
  844. X}
  845. X//---------------------------------------------------------------------------
  846. Xvoid count_pt_lev_rec(void) {
  847. Xint i,j;
  848. Xpt_lev_record &bp = bdstatus.pt_lev_rec;
  849. X
  850. X    for (i=0; i<2; i++)
  851. X      for (j=1; j<=max_pt_lev; j++)
  852. X        bp.pc[i][j] = 0;
  853. X    for (i=1; i<=bdlength; i++)
  854. X      if (board[i] == blank)
  855. X        for (j=0; j<2; j++)
  856. X          (bp.pc[j][bdstatus.point_lev[i][j]])++;
  857. X    for (i=0; i<2; i++) {
  858. X      bp.mp[i] = 1;
  859. X      while (bp.pc[i][bp.mp[i]] == 0)   (bp.mp[i])++;
  860. X    }
  861. X}
  862. X//---------------------------------------------------------------------------
  863. Xvoid init_bdstatus (void) {
  864. X  init_board();
  865. X  init_weight31();
  866. X  compute_bdstatus();
  867. X  copy12();
  868. X  count_pt_lev_rec();
  869. X}
  870. X//---------------------------------------------------------------------------
  871. END_OF_FILE
  872. if test 6574 -ne `wc -c <'initbd.C'`; then
  873.     echo shar: \"'initbd.C'\" unpacked with wrong size!
  874. fi
  875. # end of 'initbd.C'
  876. fi
  877. if test -f 'xmake5.c' -a "${1}" != "-c" ; then 
  878.   echo shar: Will not clobber existing file \"'xmake5.c'\"
  879. else
  880. echo shar: Extracting \"'xmake5.c'\" \(24060 characters\)
  881. sed "s/^X//" >'xmake5.c' <<'END_OF_FILE'
  882. X/* FILE: xmake5.c   (Ver. 1.1) */
  883. X
  884. X#include <X11/Intrinsic.h>
  885. X#include <X11/StringDefs.h>
  886. X#include <X11/Shell.h>
  887. X#include <X11/Xaw/Cardinals.h>
  888. X#include <X11/Xaw/AsciiText.h>
  889. X#include <X11/Xaw/Paned.h>
  890. X#include <X11/Xaw/Box.h>
  891. X#include <X11/Xaw/Command.h>
  892. X#include <X11/Xaw/Label.h>
  893. X#include <X11/Xaw/MenuButton.h>
  894. X#include <X11/Xaw/SimpleMenu.h>
  895. X#include <X11/Xaw/SmeBSB.h>
  896. X#include <X11/Xaw/SmeLine.h>
  897. X
  898. X#include <stdio.h>
  899. X#include <string.h>
  900. X
  901. X/**********************************************************************/
  902. X
  903. X#include "xmake5.h"
  904. X#include "make5.xbm"
  905. X
  906. Xextern Window   main_win;
  907. X
  908. Xstatic Pixmap   icon_map;
  909. Xstatic char     *warning_msg;
  910. X
  911. X/**********************************************************************/
  912. X/*      Moving records                  */
  913. X
  914. Xstatic int      current_level;
  915. Xstatic char     move_rec_text[6000];   /* to hold 200 * 30 characters */
  916. Xint    game_over, sound_level=1, help_win_switch=0, challenging;
  917. Xint    last_move_rec, move_rec[360];
  918. X
  919. Xchar     player_name[2];
  920. Xint      step, player;              /* used in make5.C  */
  921. Xint      min_depth, max_depth;      /* used in select.C */
  922. X
  923. Xstatic int min_depths[] = {0,1,2,3,3,3};
  924. Xstatic int max_depths[] = {0,2,4,5,8,9};
  925. X
  926. X/**********************************************************************/
  927. XString fallback_resources[] = { 
  928. X    "*XMake5.title:              Make5:  the Game Program  (Ver. 1.1)",
  929. X    "*font:                      -adobe-courier-bold-r-*-*-12-*-*-*-*-*-*-*",
  930. X    "*XMake5*commands.resizeToPreferred:      True",
  931. X    "*XMake5*status.resizeToPreferred:        True",
  932. X    "*XMake5*warning.resizeToPreferred:       True",
  933. X    "*XMake5*board_canvas.resizeToPreferred:  True",
  934. X    "*commands.width:            380",
  935. X    "*status.width:              380",
  936. X    "*warning.width:             380",
  937. X    "*quit_B*label:              QUIT",
  938. X    "*restart_B*label:           Restart",
  939. X    "*setup_B*label:             Setup...",
  940. X    "*question_B*label:          Where...",
  941. X    "*windows_B*label:           Open Sub Window",
  942. X    "*status*showGrip:           Off",
  943. X    "*status*skipAdjust:         True",
  944. X    "*warning*showGrip:          Off",
  945. X    "*warning*skipAdjust:        True",
  946. X    "*warning*font:              -adobe-courier-bold-r-*-*-14-*-*-*-*-*-*-*",
  947. X    "*board_canvas*showGrip:     Off",
  948. X    "*board_canvas.width:        506",
  949. X    "*board_canvas.height:       506",
  950. X    "*setup_B*menuName:                      setupMenu",
  951. X    "XMake5*setupMenu.label:                 Set up options:",
  952. X    "XMake5*setupMenu*sound_switch*label:    Sound OFF       (Key:S)",
  953. X    "XMake5*setupMenu*level1*label:          Search Level 1  (Key:1)",
  954. X    "XMake5*setupMenu*level2*label:          Search Level 2  (Key:2)",
  955. X    "XMake5*setupMenu*level3*label:          Search Level 3  (Key:3)",
  956. X    "XMake5*setupMenu*level4*label:          Search Level 4  (Key:4)",
  957. X    "XMake5*setupMenu*level5*label:          Search Level 5  (Key:5)",
  958. X    "XMake5*setupMenu*order_cc*label:        Computer  vs.  Computer",
  959. X    "XMake5*setupMenu*order_cm*label:        Computer  vs.  Human",
  960. X    "XMake5*setupMenu*order_mc*label:        Human     vs.  Computer",
  961. X    "XMake5*setupMenu*order_mm*label:        Human     vs.  Human",
  962. X    "XMake5*setupMenu*adjust*label:          Reshape board   (Key:R)",
  963. X    "XMake5*setupMenu*undo*label:            Undo one step   (Key:U)",
  964. X    "XMake5*setupMenu*challenge2*label:      Challenge Level 2",
  965. X    "XMake5*setupMenu*challenge3*label:      Challenge Level 3",
  966. X    "XMake5*setupMenu*challenge4*label:      Challenge Level 4",
  967. X    "XMake5*setupMenu*challenge5*label:      Challenge Level 5",
  968. X    "XMake5*setupMenu*RowHeight:             16",
  969. X    "XMake5*setupMenu*HorizontalMargins:     10",
  970. X    "*question_B*menuName:                   q_Menu",
  971. X    "XMake5*q_Menu*where*label:              Last move? (Key:L)",
  972. X    "XMake5*q_Menu*suggest*label:            Hint?      (Key:H)",
  973. X    "*XMake5_Help.title:         Help/Info",
  974. X    "*XMake5_Help*font:          -adobe-courier-bold-r-*-*-14-*-*-*-*-*-*-*",
  975. X    "*Text*scrollVertical:       whenNeeded",
  976. X    "*Text*scrollHorizontal:     whenNeeded",
  977. X    "*help_win_label.label:      Make5 Help Window",
  978. X    "*help_win_label*showGrip:   Off",
  979. X    "*help_win_label*skipAdjust: True",
  980. X    "*help_win.editType:         read",
  981. X    "*help_win.height:           300",
  982. X    "*help_win.width:            500",
  983. X    "*rec_win_label.label:       Move Records",
  984. X    "*rec_win_label*showGrip:    Off",
  985. X    "*rec_win_label*skipAdjust:  True",
  986. X    "*rec_win.editType:          read",
  987. X    "*rec_win.height:            100",
  988. X    "*score_win_label.label:       List of Winners",
  989. X    "*score_win_label*showGrip:    Off",
  990. X    "*score_win_label*skipAdjust:  True",
  991. X    "*score_win.editType:          read",
  992. X    "*score_win.height:            100",
  993. X    NULL
  994. X};
  995. X
  996. X/**********************************************************************/
  997. Xstatic Widget play_order[4], play_level[5], challenge_level[4], 
  998. X              undo, suggest;
  999. Xstatic char player_order_names[][2] = {
  1000. X  {'C', 'C'},  {'C', 'M'},  {'M', 'C'},  {'M', 'M'}
  1001. X};
  1002. X
  1003. X/**********************************************************************/
  1004. Xextern void reset_timer(), start_timer(), pause_timer();
  1005. Xextern int  get_timer();
  1006. Xextern void warp_to_position(), to_last_position(), switch_color(),
  1007. X            draw_suggestions(), adjust_board(), setup_gc();
  1008. Xextern void Board_redraw(), Board_seton(), Board_config();
  1009. Xstatic void Quit_B(),Restart_B(),Where_B(),Undo_B(),Windows_B();
  1010. Xstatic void create_help_shell(), add_menu_items1(), add_menu_items2();
  1011. Xstatic void set_sound_level(), suggestion();
  1012. Xstatic void set_level_1(), set_level_2(), set_level_3(), set_level_4(),
  1013. X            set_level_5(), update_move_record(), set_challenge_level(),
  1014. X            set_challenging(), set_play_order();
  1015. X
  1016. Xvoid check_computer_move(), make_computer_move(), make_a_move();
  1017. X/**********************************************************************/
  1018. Xstatic String trans =
  1019. X        "<Expose>:     Board_redraw()    \n\
  1020. X         <BtnUp>:      Board_seton()     \n\
  1021. X         <Configure>:  Board_config()    \n\
  1022. X         <Key>S:       set_sound_level() \n\
  1023. X         <Key>1:       set_level_1()     \n\
  1024. X         <Key>2:       set_level_2()     \n\
  1025. X         <Key>3:       set_level_3()     \n\
  1026. X         <Key>4:       set_level_4()     \n\
  1027. X         <Key>5:       set_level_5()     \n\
  1028. X         <Key>R:       adjust_board()    \n\
  1029. X         <Key>U:       Undo_B()          \n\
  1030. X         <Key>L:       Where_B()         \n\
  1031. X         <Key>H:       suggestion() ";
  1032. X
  1033. Xstatic XtActionsRec window_actions[] = {
  1034. X        {"Board_redraw",        Board_redraw},
  1035. X        {"Board_seton",         Board_seton},
  1036. X        {"Board_config",        Board_config},
  1037. X        {"set_sound_level",     set_sound_level},
  1038. X        {"set_level_1",         set_level_1},
  1039. X        {"set_level_2",         set_level_2},
  1040. X        {"set_level_3",         set_level_3},
  1041. X        {"set_level_4",         set_level_4},
  1042. X        {"set_level_5",         set_level_5},
  1043. X        {"adjust_board",        adjust_board},
  1044. X        {"Undo_B",              Undo_B},
  1045. X        {"Where_B",             Where_B},
  1046. X        {"suggestion",          suggestion}
  1047. X};
  1048. X
  1049. X/**********************************************************************/
  1050. XWidget toplevel;
  1051. Xstatic Widget vpane, board_canvas, status_label, 
  1052. X              warning_label, sound_switch, help_shell, windows_B, 
  1053. X              rec_win, score_win;
  1054. Xstatic XtAppContext app_con;
  1055. X/**********************************************************************/
  1056. X/*                     Configuration                                  */
  1057. X/**********************************************************************/
  1058. Xmain(argc, argv)
  1059. X    int argc;  char *argv[];
  1060. X{
  1061. X    create_top_level(argc,argv);
  1062. X    create_buttons();
  1063. X    create_help_shell();
  1064. X
  1065. X    status_label = XtCreateManagedWidget("status",
  1066. X                        labelWidgetClass,vpane,NULL,ZERO);
  1067. X
  1068. X    warning_label = XtCreateManagedWidget("warning",
  1069. X                        labelWidgetClass,vpane,NULL,ZERO);
  1070. X
  1071. X    board_canvas = XtVaCreateManagedWidget("board_canvas", 
  1072. X                        widgetClass, vpane, 
  1073. X                        XtNtranslations, XtParseTranslationTable(trans),
  1074. X                        NULL);
  1075. X    XtAppAddActions(app_con, window_actions, XtNumber(window_actions));
  1076. X
  1077. X    XtRealizeWidget(toplevel);
  1078. X    main_win = XtWindow(board_canvas);
  1079. X    setup_gc();
  1080. X    set_play_order(2);
  1081. X    set_play_level(2);
  1082. X    init_board();
  1083. X    srand(time(NULL));       /* initialize random number generator */
  1084. X    reset_timer(0);  reset_timer(1); start_timer(0);
  1085. X    set_challenging(0);
  1086. X
  1087. X    XtAppMainLoop(app_con);
  1088. X}
  1089. X/**********************************************************************/
  1090. Xcreate_top_level(argc, argv)
  1091. X    int argc;  char **argv;
  1092. X{  
  1093. X    Arg args[2];
  1094. X
  1095. X    toplevel = XtAppInitialize(&app_con, "XMake5", NULL, ZERO,
  1096. X                               &argc, argv,
  1097. X                               fallback_resources, NULL, ZERO);
  1098. X    display = XtDisplay(toplevel);
  1099. X    screen_num = DefaultScreen(display);
  1100. X
  1101. X    icon_map = XCreateBitmapFromData(display, 
  1102. X                             RootWindow(display, screen_num),
  1103. X                             make5_bits, make5_width, make5_height);
  1104. X    XtSetArg(args[0], XtNiconPixmap, icon_map);
  1105. X    XtSetArg(args[1], XtNiconName, "X Make5");
  1106. X    XtSetValues(toplevel, args, 2);
  1107. X
  1108. X    vpane = XtCreateManagedWidget("vpane", panedWidgetClass, toplevel, 
  1109. X                                    NULL, ZERO);
  1110. X}
  1111. X/**********************************************************************/
  1112. Xcreate_buttons()
  1113. X{
  1114. X  Widget commands, quit_B, restart_B, setup_B, question_B;
  1115. X
  1116. X    commands = XtCreateManagedWidget("commands", boxWidgetClass, vpane, 
  1117. X                                  NULL, ZERO);
  1118. X
  1119. X#define create_a_button(but,name,callback) { \
  1120. X    but=XtCreateManagedWidget(name,commandWidgetClass,commands,NULL,ZERO); \
  1121. X    XtAddCallback(but,XtNcallback,callback,NULL); }
  1122. X
  1123. X    create_a_button(quit_B,    "quit_B",    Quit_B);
  1124. X    create_a_button(restart_B, "restart_B", Restart_B);
  1125. X
  1126. X    setup_B = XtCreateManagedWidget("setup_B", 
  1127. X                          menuButtonWidgetClass, commands, NULL, ZERO);
  1128. X    add_menu_items1(setup_B);
  1129. X
  1130. X    question_B = XtCreateManagedWidget("question_B", 
  1131. X                          menuButtonWidgetClass, commands, NULL, ZERO);
  1132. X    add_menu_items2(question_B);
  1133. X
  1134. X    create_a_button(windows_B, "windows_B", Windows_B);
  1135. X#undef create_a_button(but,name)
  1136. X}
  1137. X/**********************************************************************/
  1138. Xvoid refresh_high_score()
  1139. X{
  1140. X  Arg args[2];  
  1141. X  extern char *ScoreF;
  1142. X    XtSetArg(args[0], XtNstring, "");
  1143. X    XtSetArg(args[1], XtNtype, XawAsciiString);
  1144. X    XtSetValues(score_win, args, 2);
  1145. X    XtSetArg(args[0], XtNstring, ScoreF);
  1146. X    XtSetArg(args[1], XtNtype, XawAsciiFile);
  1147. X    XtSetValues(score_win, args, 2);
  1148. X}
  1149. X/**********************************************************************/
  1150. Xstatic void create_help_shell()
  1151. X{
  1152. X  Arg args[1];  
  1153. X  Widget pane, help_win;
  1154. X    
  1155. X    help_shell = XtCreatePopupShell("XMake5_Help", 
  1156. X                                    transientShellWidgetClass,
  1157. X                                    toplevel, NULL, ZERO);
  1158. X    XtSetArg(args[0], XtNiconPixmap, icon_map);
  1159. X    XtSetValues(help_shell, args, 1);
  1160. X
  1161. X    pane = XtCreateManagedWidget("vpane", panedWidgetClass, help_shell,
  1162. X                                    NULL, ZERO);
  1163. X
  1164. X    XtCreateManagedWidget("help_win_label",
  1165. X                        labelWidgetClass,pane,NULL,ZERO);
  1166. X    help_win = XtCreateManagedWidget("help_win",
  1167. X                          asciiTextWidgetClass, pane, NULL, ZERO);
  1168. X    XtSetArg(args[0], XtNstring, helptext);
  1169. X    XtSetValues(help_win, args, ONE);
  1170. X
  1171. X    XtCreateManagedWidget("rec_win_label",
  1172. X                        labelWidgetClass,pane,NULL,ZERO);
  1173. X    rec_win = XtCreateManagedWidget("rec_win",
  1174. X                          asciiTextWidgetClass, pane, NULL, ZERO);
  1175. X    update_move_record();
  1176. X
  1177. X    XtCreateManagedWidget("score_win_label",
  1178. X                        labelWidgetClass,pane,NULL,ZERO);
  1179. X    score_win = XtCreateManagedWidget("score_win",
  1180. X                          asciiTextWidgetClass, pane, NULL, ZERO);
  1181. X    refresh_high_score();
  1182. X}
  1183. X/**********************************************************************/
  1184. Xstatic void add_menu_items1(button)
  1185. X    Widget button;
  1186. X{
  1187. X    static Widget menu,adjust;
  1188. X    static void set_level_item(), set_order_item();
  1189. X
  1190. X#define add_one_menu_line \
  1191. X    XtCreateManagedWidget("line",smeLineObjectClass,menu,NULL,ZERO);
  1192. X#define add_one_menu_item(w,name,callback,parameter) \
  1193. X    w = XtCreateManagedWidget(name,smeBSBObjectClass,menu,NULL,ZERO); \
  1194. X    XtAddCallback(w, XtNcallback, callback, (XtPointer) parameter);
  1195. X
  1196. X    menu = XtCreatePopupShell("setupMenu", simpleMenuWidgetClass, 
  1197. X                          button, NULL, ZERO);
  1198. X    add_one_menu_line;
  1199. X    add_one_menu_item(sound_switch,"sound_switch",set_sound_level,NULL);
  1200. X    add_one_menu_line;
  1201. X    add_one_menu_item(play_order[0],"order_cc",set_order_item,0);
  1202. X    add_one_menu_item(play_order[1],"order_cm",set_order_item,1);
  1203. X    add_one_menu_item(play_order[2],"order_mc",set_order_item,2);
  1204. X    add_one_menu_item(play_order[3],"order_mm",set_order_item,3);
  1205. X    add_one_menu_line;
  1206. X    add_one_menu_item(play_level[0],"level1",set_level_item,1);
  1207. X    add_one_menu_item(play_level[1],"level2",set_level_item,2);
  1208. X    add_one_menu_item(play_level[2],"level3",set_level_item,3);
  1209. X    add_one_menu_item(play_level[3],"level4",set_level_item,4);
  1210. X    add_one_menu_item(play_level[4],"level5",set_level_item,5);
  1211. X    add_one_menu_line;
  1212. X    add_one_menu_item(undo,"undo",Undo_B,NULL);
  1213. X    add_one_menu_line;
  1214. X    add_one_menu_item(adjust,"adjust",adjust_board,NULL);
  1215. X    add_one_menu_line;
  1216. X    add_one_menu_item(challenge_level[0],"challenge2",set_challenge_level,2);
  1217. X    add_one_menu_item(challenge_level[1],"challenge3",set_challenge_level,3);
  1218. X    add_one_menu_item(challenge_level[2],"challenge4",set_challenge_level,4);
  1219. X    add_one_menu_item(challenge_level[3],"challenge5",set_challenge_level,5);
  1220. X}  
  1221. X/**********************************************************************/
  1222. Xstatic void add_menu_items2(button)
  1223. X    Widget button;
  1224. X{
  1225. X    static Widget menu, where;
  1226. X
  1227. X    menu = XtCreatePopupShell("q_Menu", simpleMenuWidgetClass, 
  1228. X                          button, NULL, ZERO);
  1229. X    add_one_menu_item(where,"where",Where_B,NULL);
  1230. X    add_one_menu_item(suggest,"suggest",suggestion,NULL);
  1231. X}  
  1232. X/**********************************************************************/
  1233. X#define set_one_sec_alarm \
  1234. X    XtAppAddTimeOut(app_con,1000,check_computer_move,0)
  1235. X
  1236. X/**********************************************************************/
  1237. X/*                      Setup Options                                 */
  1238. X/**********************************************************************/
  1239. Xstatic void
  1240. Xset_challenging(sw) int sw;
  1241. X{ Boolean sensitive;
  1242. X  int i;
  1243. X    if (sw) { challenging = 1;  sensitive = FALSE;  } 
  1244. X    else    { challenging = 0;  sensitive = TRUE; }
  1245. X    XtSetSensitive(undo,sensitive);
  1246. X    XtSetSensitive(suggest,sensitive);
  1247. X    for (i=0; i<4; i++) {
  1248. X      XtSetSensitive(play_order[i],sensitive);
  1249. X      XtSetSensitive(play_level[i],sensitive);
  1250. X    }
  1251. X    XtSetSensitive(play_level[4],sensitive);
  1252. X}
  1253. X/**********************************************************************/
  1254. Xstatic void
  1255. Xset_play_order(n) int n;
  1256. X{
  1257. X    player_name[0] = player_order_names[n][0];
  1258. X    player_name[1] = player_order_names[n][1];
  1259. X    set_one_sec_alarm;
  1260. X}
  1261. X/**********************************************************************/
  1262. Xstatic void
  1263. Xset_sound_level()
  1264. X{
  1265. X  Arg args[1];
  1266. X    if (sound_level)  XtSetArg(args[0], XtNlabel,"Sound ON        (Key:S)");
  1267. X    else              XtSetArg(args[0], XtNlabel,"Sound OFF       (Key:S)");
  1268. X    sound_level = !sound_level;
  1269. X    XtSetValues(sound_switch, args, 1);
  1270. X    update_status_label();
  1271. X}
  1272. X/**********************************************************************/
  1273. X#define set_level_n(n)  if (challenging) return;  \
  1274. X                        set_play_level(n); update_status_label()
  1275. Xstatic void set_level_1() { set_level_n(1); }
  1276. Xstatic void set_level_2() { set_level_n(2); }
  1277. Xstatic void set_level_3() { set_level_n(3); }
  1278. Xstatic void set_level_4() { set_level_n(4); }
  1279. Xstatic void set_level_5() { set_level_n(5); }
  1280. X/**********************************************************************/
  1281. Xset_play_level(n) int n;
  1282. X{
  1283. X    current_level = n;
  1284. X    min_depth = min_depths[current_level];
  1285. X    max_depth = max_depths[current_level];
  1286. X}
  1287. X/**********************************************************************/
  1288. Xstatic void
  1289. Xset_level_item(w, client_data, garbage)
  1290. XWidget w;
  1291. XXtPointer client_data;
  1292. XXtPointer garbage;  /* call_data */
  1293. X{
  1294. X    set_play_level((int) client_data);
  1295. X    update_status_label();
  1296. X}
  1297. X/**********************************************************************/
  1298. Xstatic void
  1299. Xset_challenge_level(w, client_data, garbage)
  1300. XWidget w;
  1301. XXtPointer client_data;
  1302. XXtPointer garbage;  /* call_data */
  1303. X{
  1304. X    set_challenging(1);
  1305. X    set_play_level((int) client_data);
  1306. X    set_play_order(1);    /* computer first */
  1307. X    update_status_label();
  1308. X    Restart_B();
  1309. X}
  1310. X/**********************************************************************/
  1311. Xstatic void
  1312. Xset_order_item(w, client_data, garbage)
  1313. XWidget w;
  1314. XXtPointer client_data;
  1315. XXtPointer garbage;  /* call_data */
  1316. X{
  1317. X    set_play_order((int) client_data);
  1318. X    update_status_label();
  1319. X}
  1320. X/**********************************************************************/
  1321. X/*                      Update Status                                 */
  1322. X/**********************************************************************/
  1323. Xstatic char *(player_color[2])={"Black","White"};
  1324. Xstatic char *(sound_status[2])={"off","on"};
  1325. Xupdate_status_label() 
  1326. X{
  1327. X  char s[250], *player_prompt;
  1328. X  Arg args[1];
  1329. X  int t1,t2;
  1330. X
  1331. X    if (player_name[player] == 'C') {
  1332. X        if (player_name[1-player] == 'C')
  1333. X              player_prompt = "Click for Demo";
  1334. X        else  player_prompt = "Computer's turn";
  1335. X    } else {
  1336. X        if (challenging)
  1337. X              player_prompt = "Challenging";
  1338. X        else  player_prompt = "Human's turn";
  1339. X    }
  1340. X    sprintf(s,"Step:%d  P%d (%s)  %s  (Level:%d) (sound %s)",
  1341. X            step, player+1, player_color[player], player_prompt,
  1342. X            current_level, sound_status[sound_level]);
  1343. X    XtSetArg(args[0], XtNlabel, s);
  1344. X    XtSetValues(status_label, args, 1);
  1345. X    if (sound_level) {
  1346. X      if (warning_msg[0] != 0)  XBell(display,sound_level);
  1347. X      if (game_over)  { 
  1348. X         XBell(display,sound_level); XBell(display,sound_level);
  1349. X      } 
  1350. X    }
  1351. X    t1=get_timer(0);
  1352. X    t2=get_timer(1);
  1353. X    sprintf(s,"P1(%d:%d)  %s  P2(%d:%d)",
  1354. X            t1/60,t1%60,warning_msg,t2/60,t2%60);
  1355. X    XtSetArg(args[0], XtNlabel, s);
  1356. X    XtSetValues(warning_label, args, 1);
  1357. X}
  1358. X/**********************************************************************/
  1359. Xupdate_status() 
  1360. X{
  1361. X    update_status_label();
  1362. X    switch_color(player);
  1363. X}
  1364. X/**********************************************************************/
  1365. X/*                        CALL BACK functions                         */
  1366. X/**********************************************************************/
  1367. Xstatic void
  1368. XQuit_B(w, text_ptr, call_data)
  1369. XWidget w;  XtPointer text_ptr, call_data;
  1370. X{
  1371. X    XtDestroyApplicationContext(XtWidgetToApplicationContext(w)); 
  1372. X    exit(0);
  1373. X}
  1374. X/**********************************************************************/
  1375. Xstatic void
  1376. XRestart_B()
  1377. X{
  1378. X    init_board();
  1379. X    redraw_board();
  1380. X    set_one_sec_alarm;
  1381. X    reset_timer(0);  reset_timer(1); start_timer(0);
  1382. X    refresh_high_score();
  1383. X}
  1384. X/**********************************************************************/
  1385. Xstatic void
  1386. XWhere_B()
  1387. X{
  1388. X    to_last_position();
  1389. X}
  1390. X/**********************************************************************/
  1391. X#define back_one_move { int x = move_rec[last_move_rec--]; \
  1392. X    take_out(x); \
  1393. X    board_stones[BoardX(x)][BoardY(x)] = empty_stone; }
  1394. X/**********************************************************************/
  1395. Xstatic void
  1396. XUndo_B()
  1397. X{
  1398. X    int x;
  1399. X    if (challenging) return;
  1400. X    num_of_suggestion = 0;
  1401. X    if (step > 2 || (step == 2 && player == 1)) {
  1402. X      back_one_move;
  1403. X      back_one_move;
  1404. X      update_move_record();
  1405. X      step--;
  1406. X      x = move_rec[last_move_rec];
  1407. X      warning_msg = get_warning(1-player,x);
  1408. X      game_over = is_game_over(1-player,x);
  1409. X      redraw_board();
  1410. X    } 
  1411. X    else Restart_B();
  1412. X}
  1413. X/**********************************************************************/
  1414. Xstatic void
  1415. XWindows_B(w, text_ptr, call_data)
  1416. XWidget w;  XtPointer text_ptr, call_data;
  1417. X{   Arg args[1];
  1418. X    char *s;
  1419. X    help_win_switch = !help_win_switch;
  1420. X    if (help_win_switch)  {
  1421. X      s="Close Sub Window";
  1422. X      XtPopup(help_shell,XtGrabNone);
  1423. X    } else {
  1424. X      s="Open Sub Window";
  1425. X      XtPopdown(help_shell);
  1426. X    }
  1427. X    XtSetArg(args[0], XtNlabel, s);
  1428. X    XtSetValues(windows_B, args, 1);
  1429. X}
  1430. X/**********************************************************************/
  1431. Xstatic void suggestion()
  1432. X{
  1433. X  int best;
  1434. X
  1435. X    if (challenging) return;
  1436. X    if (game_over) return;
  1437. X    best = computer_suggest(player);
  1438. X    draw_suggestions();
  1439. X    warp_to_position(BoardX(best),BoardY(best));
  1440. X}
  1441. X/**********************************************************************/
  1442. X/*           All about making moves                                   */
  1443. X/**********************************************************************/
  1444. Xinit_board()
  1445. X{   int i,j;
  1446. X
  1447. X    for (i=0; i < BoardLines; i++)
  1448. X      for (j=0; j < BoardLines; j++)
  1449. X        board_stones[i][j] = empty_stone;
  1450. X    step = 1; player = 0;  
  1451. X    last_move_rec = 0;
  1452. X    update_move_record();
  1453. X    warning_msg = "";
  1454. X    game_over = 0;
  1455. X    num_of_suggestion = 0;
  1456. X    init_data();
  1457. X}
  1458. X/**********************************************************************/
  1459. Xvoid make_a_move(x)
  1460. X    int x;
  1461. X{   int new_high_score=0, num_step, used_time;
  1462. X
  1463. X    pause_timer(player);
  1464. X    unmark_last_move();
  1465. X    move_rec[++last_move_rec] = x;
  1466. X    clear_mark_stone();
  1467. X    put_stone(BoardX(x), BoardY(x), player);
  1468. X    set_on(x,player);
  1469. X    warning_msg = get_warning(player,x);
  1470. X    game_over = is_game_over(player,x);
  1471. X    XFlush(display);
  1472. X    if (game_over && challenging) {
  1473. X      if (player==1) {  /* human win */
  1474. X        new_high_score = 1;
  1475. X        num_step = step;
  1476. X        used_time = get_timer(1);
  1477. X        warning_msg = "Congratulation! You win.";
  1478. X      }
  1479. X      set_challenging(0);
  1480. X    }
  1481. X    player = 1 - player;
  1482. X    if (player==0) step++;
  1483. X    mark_last_move();
  1484. X    update_status();
  1485. X    update_move_record();
  1486. X    XFlush(display);
  1487. X    if (new_high_score) {
  1488. X        add_score_record(current_level,num_step,used_time);
  1489. X        refresh_high_score();
  1490. X    }
  1491. X    start_timer(player);
  1492. X}
  1493. X/**********************************************************************/
  1494. Xvoid make_computer_move()
  1495. X{
  1496. X    if (player_name[player] != 'C') return;
  1497. X    if (!game_over)  make_a_move(computer_move(player));
  1498. X}
  1499. X/**********************************************************************/
  1500. Xvoid check_computer_move()
  1501. X{
  1502. X    char s[250];
  1503. X    Arg args[1];
  1504. X
  1505. X    if (player_name[player] != 'C') return;
  1506. X    if (!game_over) {
  1507. X      sprintf(s,"Step:%d  Computer's thinking.... (Level:%d)",
  1508. X              step,current_level);
  1509. X      XtSetArg(args[0], XtNlabel, s);
  1510. X      XtSetValues(status_label, args, 1);
  1511. X      XFlush(display);
  1512. X      XtAppAddTimeOut(app_con,100,make_computer_move,0);
  1513. X    }
  1514. X}
  1515. X/**********************************************************************/
  1516. Xstatic void update_move_record()
  1517. X{ Arg args[1];
  1518. X  char line[30];
  1519. X  int i,n,x1,x2;
  1520. X    strcpy(move_rec_text,"Step   P1      P2\n--------------------\n");
  1521. X    for (i=1,n=last_move_rec/2; i<=n; i++) {
  1522. X        x1=move_rec[i*2-1];
  1523. X        x2=move_rec[i*2];
  1524. X        sprintf(line,"%3d  (%2d,%2d) (%2d,%2d)\n",
  1525. X                      i, x1/BoardSize, x1%BoardSize, 
  1526. X                         x2/BoardSize, x2%BoardSize);
  1527. X        strcat(move_rec_text,line);
  1528. X    }
  1529. X    if (n*2 != last_move_rec) {
  1530. X        x1=move_rec[last_move_rec];
  1531. X        sprintf(line,"%3d  (%2d,%2d)\n",
  1532. X                      i, x1/BoardSize, x1%BoardSize);
  1533. X        strcat(move_rec_text,line);
  1534. X    }
  1535. X    XtSetArg(args[0], XtNstring, move_rec_text);
  1536. X    XtSetValues(rec_win, args, ONE);
  1537. X    XawTextSetInsertionPoint(rec_win,99999);
  1538. X}
  1539. X/**********************************************************************/
  1540. END_OF_FILE
  1541. if test 24060 -ne `wc -c <'xmake5.c'`; then
  1542.     echo shar: \"'xmake5.c'\" unpacked with wrong size!
  1543. fi
  1544. # end of 'xmake5.c'
  1545. fi
  1546. echo shar: End of archive 1 \(of 3\).
  1547. cp /dev/null ark1isdone
  1548. MISSING=""
  1549. for I in 1 2 3 ; do
  1550.     if test ! -f ark${I}isdone ; then
  1551.     MISSING="${MISSING} ${I}"
  1552.     fi
  1553. done
  1554. if test "${MISSING}" = "" ; then
  1555.     echo You have unpacked all 3 archives.
  1556.     rm -f ark[1-9]isdone
  1557. else
  1558.     echo You still need to unpack the following archives:
  1559.     echo "        " ${MISSING}
  1560. fi
  1561. ##  End of shell archive.
  1562. exit 0
  1563.