ex: 歡迎來到我的小賭場
-1.進入賭場
-2.離開程式
請輸入選項1或2
2. 讀取使用者輸入的選項
3. 若使用者輸入1,進入判斷,否則執行步驟4
3.1 請撰寫者宣稱一個結構(名字自取),結構內容含有13張手牌(ex:int a[13], b[13];=>a為數字 b為花色)
3.2 請"透過函式"利用亂數方式產生13張牌給範例的a[0~12],b[0~12](52張撲克牌挑13張)且排序後列印出來
3.3 請利用"函式"檢查手牌
-檢查幾組"一對"、"三條"、"葫蘆(一個三條配一個一對)"、"順子(五連續數字A~5...10~A共十種)"四種情況即可,並列印出來
-一對獲得10元 三條獲得15 葫蘆獲得30 順子獲得30
-函式回傳獲得的總金額
3.4 在主程式內列印出獲得的總金額
3.5 等待使用者輸入任意鍵
3.6 清空畫面並回到步驟1
4. 離開程式
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include <windows.h>
typedef struct Card{ //結構
int suit[13];
int face[13];
}card;
void deal(card *poker); //發牌函式
void check(card *all); //檢查函式
int main()
{
HANDLE hOut;
int m=1;
card deck;
for(;;) //無限迴圈
{
hOut = GetStdHandle(STD_OUTPUT_HANDLE); //字顏色
SetConsoleTextAttribute(hOut,
FOREGROUND_RED | //紅+藍
FOREGROUND_BLUE |
FOREGROUND_INTENSITY |
COMMON_LVB_UNDERSCORE);
printf("請輸入→ 1.進入賭場 → 2.離開程式:");
scanf("%d", &m); //寫入m
while (m==1){ //如果 m=1 就執行以下
srand(time(NULL));
deal(&deck); //呼叫函式
check(&deck);
system("pause");
system("cls");
break;
}
while (m==2){ //如果 m=2 就結束
return 0;
}
}
}
void deal(card *poker)
{
HANDLE hOut;
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
int card[13][4];
//儲存牌是否被發過了,
//第一維是點數,第二維是花色,
//1代表發過了,0代表還沒發過
int i, j; //用來跑回圈
int n; //牌的點數
int c; //牌的花色
int color; //花色的圖案
int temp; //做排序時的暫存變數
for(c=0;c<4;c++) //先把所有牌設定成還沒被發過
for(n=0;n<13;n++)
card[n][c]=0;
for(i=0;i<13;i++) //開始發牌
{
do{
n=rand()%13+1;
c=rand()%4;
}while(card[n-1][c] == 1);
poker->face[i]=n;
poker->suit[i]=c;
card[n-1][c]=1;
}
//對牌的點數做由小到大的排序
for(i=0; i<12; i++)
{
for(j=i+1; j<13; j++)
{
if(poker->face[i]>poker->face[j])
{
temp = poker->face[i];
poker->face[i]=poker->face[j];
poker->face[j]=temp;
temp = poker->suit[i];
poker->suit[i]=poker->suit[j];
poker->suit[j]=temp;
}
}
}
//在數字相同時, 對花色做一次由小到大的排序
for (i=0; i<12; i++)
{
if (poker->face[i]==poker->face[i+1]) //數字相同
{
if(poker->suit[i]>poker->suit[i+1]) // 第i個的花色比第i+1個大
{
temp = poker->face[i];
poker->face[i]= poker->face[i+1];
poker->face[i+1]=temp;
temp = poker->suit[i];
poker->suit[i]=poker->suit[i+1];
poker->suit[i+1]=temp;
}
}
}
SetConsoleTextAttribute(hOut,
FOREGROUND_GREEN |
FOREGROUND_INTENSITY );
//顯示一次目前的發牌結果
printf("對數字和花色排序後玩家的牌為\n");
for(i=0;i<13;i++)
{
n=poker->face[i];
c=poker->suit[i];
switch(c)
{
case 0: //梅花
color=5;
break;
case 1: //方塊
color=4;
break;
case 2: //紅心
color=3;
break;
case 3: //黑桃
color=6;
break;
default:
color='x';
break;
};
printf("第%d張 %c 【%d】\n",i,color,n);
}
}
void check(card *all)
{
HANDLE hOut;
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
int i,j;
int pair=0; //初始一對的數量
int three=0; //初始三對的數量
int fullhouse=0;//初始葫蘆的數量
int Stra=0; //計算多少順子
int Straight=0; //順子總和
int straightz=0; //例外的順子
int money=0; //總金額
int num[14]={0};
for(i=0;i<13;i++){
++num[all->face[i]];
}
for(j=1;j<14;j++){ //計算對子
switch(num[j]){
case 2:
pair++;
break;
case 3:
pair+=3;
three++;
break;
case 4:
pair+=6;
three+=4;
break;
default:
break;
}
}
for(i=1;i<14;i++){ //計算葫蘆的數量
for(j=1;j<14;j++){
if(num[i]==3 && num[j]==2){
fullhouse++;}
if(num[i]==3 && num[j]==3){
if(i==j){
continue;}
fullhouse+=3;}
if(num[i]==3 && num[j]==4){
fullhouse+=18;}
if(num[i]==2 && num[j]==4){
fullhouse+=4;}
if(num[i]==4 && num[j]==4){
if(i=j){
continue;}
fullhouse+=24;}
}
}
for(i=1;i<10;i++){ //計算順子
Stra=num[i]*num[i+1]*num[i+2]*num[i+3]*num[i+4];
Straight+=Stra;
}
straightz=num[1]*num[10]*num[11]*num[12]*num[13];
printf("\n對子有 %d 組",pair);
printf(" + 三條有 %d 組 ",three);
printf(" + 葫蘆有 %d 組 ",fullhouse);
printf(" + 順子有 %d 組 \n",Straight+straightz);
//總金額
money=pair*10+three*15+fullhouse*30+Straight*30+straightz*30;
SetConsoleTextAttribute(hOut,
FOREGROUND_RED |
FOREGROUND_GREEN |
FOREGROUND_INTENSITY);
printf("\n你贏得了 %d 元 \n\n",money);
}
沒有留言:
張貼留言