使用者工具

網站工具


c:projects:21

國立屏東大學 資訊工程學系 程式設計

21. 21點樸克牌遊戲

  • global variables
  • function calls
  • random number
  • arrays

21.1 Project Description

  • 未考慮5張牌未超過21點的情況

21.2 Source Code

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int card[52], user[5], pc[5], cc=4;
 
  
void initialGame()
{
  int i,temp, p;
  
  srand(time(NULL));
  
  //洗牌
  for(i=0;i<52;i++)
  {
    card[i]=i;
  }
  
  for(i=0;i<52;i++)
  {
    p=rand()%52;
    temp=card[i];
    card[i]=card[p];
    card[p]=temp;
  }
  
  
     
  //各分兩張牌給user與pc
  user[0]=card[0];
  user[1]=card[1];
  user[2]=user[3]=user[4]=(-1);
  pc[0]=card[2];
  pc[1]=card[3];
  pc[2]=pc[3]=pc[4]=(-1);
  cc=4;
}


void newline()
{
  printf("\n");
}

int getPoint(int c[])
{
  int i,p,sum=0, a=0;
  for(i=0;i<5;i++)
  {
    if(c[i]!=(-1))
    {
      p=c[i]%13+1;
      p= (p>10)? 10: p;
      if(p==1)
        a++;
      sum+=p;
    }
  }  
  if(a&&((sum+10)<=21))
    sum+=10;
  return sum;
}
 
int pcPoint()
{
  return getPoint(pc);
}
int userPoint()
{
  return getPoint(user);
} 

void showAcard(int ca)
{
  int p;
  
  char suit[4]={'s','h','d','c'};
  printf("%c",suit[ca/13]);
  p=ca%13;
  
  switch(p+1)
  {
    case 1:
            printf("A");
            break;
    case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9:
            printf("%1d", p+1);
            break;
    case 10:
            printf("T");
            break;
    case 11:
            printf("J");
            break;
    case 12:
            printf("Q");
            break;
    case 13:
            printf("K");
  }
  
}

void showCard( int c[])
{
  int i;
  for(i=0;i<5;i++)
  {
    if(c[i]!=(-1))
    {
      showAcard(c[i]);
      printf(" ");
    }
  }
  newline();
}

void showUserCard()
{
  printf("User: ");
  showCard(user);
}

void showPcCard(int i)
{
  printf(" PC : ");
  if(i!=1)
    showCard(pc);
  else
  {
    showAcard(pc[0]);
    newline();
  }
}

int user_turn()
{
  int ucc=2, quit=0;
  char c;

 
  showUserCard();
  showPcCard(1);                         
  while((ucc<5)&&(!quit))
  {
    printf("Add a card?(y/n)");
    scanf(" %c", &c);
    if(c=='y')
    {
      user[ucc++]=card[cc++];
      showUserCard();
      if(userPoint()>21)
      {
        showPcCard(5);
        printf("I Win!\n");
        return 0;
      }
    }
    else
      quit=1;
  }
  return 1;
}
  
void pc_turn()
{
  int pcc=2, quit=0;
  char c;
  
  showPcCard(5);
  while((pcc<=5)&&(pcPoint()<16))
  {
    printf("I want to add a card...\n");
    pc[pcc++]=card[cc++];
    showPcCard(5);
  }
  if(pcPoint()>21)
    printf("You Win!\n");
  else if(userPoint()>pcPoint())
  {
    printf("You Win!\n");
  }
  else if(userPoint()==pcPoint())
  {
    printf("Even!\n");
  }
  else
  {
    printf("I Win!\n");
  }
}

int isContinue()
{
  char c;
  
  printf("Do you want to play again?(y/n)");
  scanf(" %c", &c);
  if(c=='y')
    return 0; // 0 for continue
  else
    return 1; // 1 for exit
}

int main()
{
  int quit=0;
  while(!quit)
  {
    initialGame();
    if(user_turn())   // return 0 if user loss
      pc_turn();
    quit = isContinue();
  }
}

c/projects/21.txt · 上一次變更: 2019/07/02 15:01 由 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki