typedef
struct
{
int cards[52];
int num_cards;
}
POKER ;
。兩種情況下的分數分別用low和high描述。最後的有效分數用score描述。
typedef
struct
{
int score;
int low ;
int high ;
}
GAMER ;
void game_21( void )
{
POKER poker;
GAMER player = { 0 , 0 , 0 } ,
dealer = { 0 , 0 , 0 } ;
//游戲過程
}
init_poker( &poker );
void init_poker( POKER * );
void init_poker( POKER *p_pkr )
{
int i ;
p_pkr->num_cards = sizeof p_pkr->cards
/ sizeof p_pkr->cards[0] ;//52
for ( i = 0 ; i < p_pkr->num_cards ; i ++ ){
p_pkr->cards[i] = i % 13 + 1;
}
}
#define N 1
typedef
struct
{
int cards[52*N];
int num_cards;
}
POKER ;
#include <time.h> srand( ( unsigned )time(NULL) );
puts("莊家拿牌:");
getcard( &dealer , dealcard( &poker ) );
int dealcard( POKER * );
void disp( int );
void getcard( GAMER * , int );
int dealcard( POKER *p_pkr )
{
int num = rand() % p_pkr->num_cards ;
int card = p_pkr->cards[ num ] ;
p_pkr->cards[ num ] = p_pkr->cards[ --p_pkr->num_cards ] ;
return card;
}
void getcard( GAMER *p_plr , int card )
{
disp( card );
switch ( card ){
case 1 :
p_plr->low += 1 ;
p_plr->high += 11 ;
break ;
default :
p_plr->low += card ;
p_plr->high += card ;
break ;
case 11:
case 12:
case 13:
p_plr->low += 10 ;
p_plr->high += 10 ;
break ;
}
p_plr->score = p_plr->high > 21 ? p_plr->low : p_plr->high;
printf("總分:%d\n",p_plr->score);
}
void disp( int card )
{
switch(card){
case 1 :puts("Ace");
return;
default :printf("%d\n",card);
return;
case 11: puts("Jack");
return;
case 12: puts("Queen");
return;
case 13: puts("King");
return;
}
}
puts("你拿牌:");
getcard( &player , dealcard( &poker ) );
do{
getcard( &player , dealcard( &poker ) );
}while ( again("繼續要牌(Y/N)?") == YES );
YESNO again( char * );
YESNO again( char *p_message )
{
int c;
puts( p_message );
c = getchar() ;
while ( getchar() != '\n'){ //讀完一行
}
if ( c=='y' || c == 'Y' ){
return YES;
}
return NO;
}
puts("莊家繼續拿牌:");
do{
getcard( &dealer , dealcard( &pkr ) );
}while ( dealer.score < 17 );
declare_winner( dealer , player );
void declare_winner( GAMER , GAMER );
void declare_winner( GAMER dealer , GAMER player )
{
if ( dealer.score == 21 ){
puts("你輸了。");
return ;
}
if ( dealer.score > 21 ){
if( player.score > 21 ){
puts("平局。");
return ;
}
}
if ( dealer.score < 21 ){
if( player.score > 21 ){
puts("你輸了。");
return ;
}
if( dealer.score >= player.score ){
puts("你輸了。");
return ;
}
}
puts("你贏了!\a");
return;
}
/* 21點游戲:對《寫給大家看的C語言書》附錄B之21點程序的重構 */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef
enum
{
NO ,
YES,
}
YESNO ;
typedef
struct
{
int cards[52];
int num_cards;
}
POKER ;
typedef
struct
{
int score;
int low ;
int high ;
}
GAMER ;
YESNO again( char * );
void game_21( void );
void init_poker( POKER * );
int dealcard( POKER * );
void disp( int );
void getcard( GAMER * , int );
void declare_winner( GAMER , GAMER );
int main( void )
{
do{
system("CLS");
game_21(); //一輪游戲
}while ( again( "繼續游戲(Y/N)?" ) == YES );
system("PAUSE");
return 0;
}
int dealcard( POKER *p_pkr )
{
int num = rand() % p_pkr->num_cards ;
int card = p_pkr->cards[ num ] ;
p_pkr->cards[ num ] = p_pkr->cards[ -- p_pkr->num_cards ] ;
return card;
}
/* 宣布勝利 */
void declare_winner( GAMER dealer , GAMER player )
{
if ( dealer.score == 21 ){
puts("你輸了。");
return ;
}
if ( dealer.score > 21 ){
if( player.score > 21 ){
puts("平局。");
return ;
}
}
if ( dealer.score < 21 ){
if( player.score > 21 ){
puts("你輸了。");
return ;
}
if( dealer.score >= player.score ){
puts("你輸了。");
return ;
}
}
puts("你贏了!\a");
return;
}
/* 計算*p_plr獲得card後的分數 */
void getcard( GAMER *p_plr , int card )
{
disp( card );
switch ( card ){
case 1 :
p_plr->low += 1 ;
p_plr->high += 11 ;
break ;
default :
p_plr->low += card ;
p_plr->high += card ;
break ;
case 11:
case 12:
case 13:
p_plr->low += 10 ;
p_plr->high += 10 ;
break ;
}
p_plr->score = p_plr->high > 21 ? p_plr->low : p_plr->high;
printf("總分:%d\n",p_plr->score);
}
/* 顯示card牌面 */
void disp( int card )
{
switch(card){
case 1 :puts("Ace");
return;
default :printf("%d\n",card);
return;
case 11: puts("Jack");
return;
case 12: puts("Queen");
return;
case 13: puts("King");
return;
}
}
/* 初始化*p_pkr */
void init_poker( POKER *p_pkr )
{
int i ;
p_pkr->num_cards = sizeof p_pkr->cards
/ sizeof p_pkr->cards[0] ;//52
for ( i = 0 ; i < p_pkr->num_cards ; i ++ ){
p_pkr->cards[i] = i % 13 + 1;
}
}
void game_21( void )
{
POKER poker;
GAMER player = { 0 , 0 , 0 } ,
dealer = { 0 , 0 , 0 } ;
init_poker( &poker );
srand( ( unsigned )time(NULL) );
puts("莊家拿牌:"); //莊家取第一張
getcard( &dealer , dealcard( &poker ) );
puts("\n你拿牌:"); //player抽牌
getcard( &player , dealcard( &poker ) );
do{
getcard( &player , dealcard( &poker ) );
}while ( again("繼續要牌(Y/N)?") == YES );
puts("\n莊家繼續拿牌:"); //莊家繼續抽牌
do{
getcard( &dealer , dealcard( &poker ) );
}while ( dealer.score < 17 );
declare_winner( dealer , player );
}
YESNO again( char * p_message )
{
int c;
puts( p_message );
c = getchar() ;
while ( getchar() != '\n'){ //讀完一行
}
if ( c=='y' || c == 'Y' ){
return YES;
}
return NO;
}
(全文完)