home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
TOP
/
USR
/
SRC
/
yahtzee.t.Z
/
yahtzee.t
/
get_m.c
< prev
next >
Wrap
Text File
|
1988-07-28
|
4KB
|
201 lines
/* get_m.c
* contains routine to get the given players hold pattern
* for the current dice.
*/
#include <stdio.h>
#include <curses.h>
#include "defs.h"
#define NTOP 6
extern int machine[max_players], diey[Five_Dice], diex[Five_Dice];
extern int scoreboard[max_players][max_marks];
extern WINDOW *screen;
static int human_available[13], human_avail_count;
/* call the relevant move routine based on whether player is human or
* computer simulation */
get_move(player, dice, hold)
int player, dice[Five_Dice], hold[Five_Dice];
{
dis_dice(dice, hold);
machine[player] ? computer_move(player, dice, hold) :
human_move(player, dice, hold);
dis_dice(dice, hold);
}
/* prompt human for which dice to hold */
human_move(player, dice, hold)
int player, dice[Five_Dice], hold[Five_Dice];
{
int i, cur_dice = 0;
char ch;
do
{
/* put cursor in middle of current dice */
wmove(screen, diey[cur_dice] + 2, diex[cur_dice] + 4);
#ifndef SYS5_3
/* System 5.3 Curses performs better if it isn't forced to refresh
* directly before a getch */
wrefresh(screen);
#endif
/* get user input */
ch = wgetch(screen);
switch(ch)
{
/* toggles dice between held and free */
case ' ' : hold[cur_dice] = ! hold[cur_dice];
dis_dice(dice, hold);
++cur_dice;
cur_dice = wrap(cur_dice, 0, 4);
break;
/* move cursor left */
case 'h' : --cur_dice;
cur_dice = wrap(cur_dice, 0, 4);
break;
/* move cursor right */
case 'l' : ++cur_dice;
cur_dice = wrap(cur_dice, 0, 4);
break;
/* hold all dice and quit this procedure by setting ch to
* loop termination character */
case 'a' : for (i = 0; i < Five_Dice; ++i)
hold[i] = TRUE;
ch = '\n';
break;
/* human player request for computer simulation recommendation */
case 'r' : computer_move(player, dice, hold);
dis_dice(dice, hold);
break;
/* display score that can be obtained with the current dice */
case 't' : dice_values(screen, player, dice);
break;
case 'q' : dis_score((WINDOW *) 0);
yahtzee_exit(0);
break;
case '?' : help_out(2, screen);
break;
case 's' : dis_score(screen);
break;
case Form_Feed : redraw(screen);
break;
case 'b' : rools(screen);
break;
case '!' : shell(screen);
break;
case 'v' : version(screen);
break;
#if defined(SYS5) || defined(SYS5_3)
case '$' : shwin(screen);
break;
case '\n' : break;
default : flash();
break;
#endif
}
} while (ch != '\n');
}
extern char side[sidey][sidex];
/* select which category to place the dice */
int human_select(player, dice)
int player, dice[Five_Dice];
{
int side_no = 0, best;
char ch;
do
{
wmove(screen, human_available[side_no] + NTOP, 0);
#ifndef SYS5_3
wrefresh(screen);
#endif
ch = wgetch(screen);
switch(ch)
{
/* move up one category */
case 'k' : --side_no;
side_no = wrap(side_no, 0,
human_avail_count - 1);
break;
/* move down one category */
case 'j' : ++side_no;
side_no = wrap(side_no, 0,
human_avail_count - 1);
break;
/* get computer's recommendation of best category */
case 'r' : best = computer_select(player, dice,
human_available, human_avail_count);
side_no = 0;
while (side_no < human_avail_count &&
human_available[side_no] != best)
++side_no;
break;
/* display score that can be obtained with the current dice */
case 't' : dice_values(screen, player, dice);
break;
case 'q' : dis_score((WINDOW *) 0);
yahtzee_exit(0);
break;
case '?' : help_out(3, screen);
break;
case 's' : dis_score(screen);
break;
case Form_Feed : redraw(screen);
break;
case 'b' : rools(screen);
break;
case '!' : shell(screen);
break;
case 'v' : version(screen);
break;
#if defined(SYS5) || defined(SYS5_3)
case '$' : shwin(screen);
break;
case '\n' : break;
default : flash();
break;
#endif
}
} while (ch != '\n');
return(human_available[side_no]);
}
/* form the list of categories available to the given player */
human_availability(player)
int player;
{
int i;
human_avail_count = 0;
for (i = 1; i < 14; ++i)
if (scoreboard[player][i] == category_available)
human_available[human_avail_count++] = i;
}