📚 知識家圖書館 奇摩知識+ 紀念館

拜託c++高手給一個撲克牌程式,條件如下:

發問者 阿丰 (Lv.1) ・2011 年 5 月 5 日 ・程式設計

1.請問要如何寫從52張撲克牌裡面隨機抽出五張,這五張不能重複,且要列印出牌面上的花色與數字。 2.除了以上的條件,再外加一個可以判斷出順子和同花。 3.可以的話麻煩加一點點的註解給小弟理解一下,小弟剛入程式語言懂得非常少,拜託各位大大幫幫忙,謝謝。 ps.因為小弟是入門階級,請不用寫的太繁雜太難,簡單寫簡單註解就好,衷心感謝大大的幫忙:) 可以的話希望在今天晚上12點之前幫小弟的忙,感激不盡^^"

3 則回答

最佳解答
礙於字數限制,註解說明都在這個網址:http://edisonx.pixnet.net/blog/post/54675090 網址內自認寫得已盡量詳盡, step by step 方式說明 flush / straight 之判別方式再去觀查一下該網址之 數字 - 牌面 之編碼對應方式,應可觀查出來。 #include <iostream> #include <cstdlib> #include <ctime> using namespace std;#define N 52 /* poker 總張數 */ #define M 5 /* 派給使用者之手牌張數 */ #define SWAP(a, b) {int t; t=a; a=b; b=t;} #define BUF_SIZE 3 const char flower[4] = {'\5','\4','\3','\6'}; // 4個花色 const char number[13][BUF_SIZE] = { " A", " 2", " 3", " 4", " 5", " 6", " 7", " 8", " 9", "10", " J", " Q", " K"};// ==================================== // shuffle void shuffle(int *array, int Size) { int i, pos; srand((unsigned)time(NULL)); rand(); // 先抽掉一個亂數 for(i=0; i!=Size; ++i){ // 取出第 pos 張牌 // pos = rand()%52; // worst pos = (int) (N*(double)rand()/RAND_MAX); // better // 將第 i 張牌與第 pos 張牌交換 SWAP(array[i], array[pos]); } } // ==================================== // display void display_poker(int *poker, int Size) { int i; for(i=0; i!=Size; ++i) { // 顯示花色, flower_index = poker[i] % 4 cout << flower[poker[i]%4] << ' '; // 顯示點數, number_index = poker[i] / 4 cout << number [poker[i]/4] << '\n'; // printf(" %s\n", number[ poker[i] >> 2 ]); // faster } } // ==================================== // 判斷是否為順子 bool IsStraight(int *poker) { int i,j,num[N]; /* num: 實際數值 */ bool ret=true; /* 假設傳回為順子 */ for(i=0; i!=M; ++i){ /* 從 0~51 轉成牌面數字 1~13 */ num[i] = 1+poker[i]/4; } /* 先將數字由小到大排序, 以 insert sort 排 */ for(i=0; i!=M-1; ++i){ for(j=i; j!=M; ++j){ if(num[i]>num[j]) SWAP(num[i], num[j]); } } /* 判斷數字是否連續 */ for(i=0; i!=M-1; ++i){ /* 若這一張點數 不等於 下一張點數,即為不連續,就不是順子 */ if(num[i]+1!=num[i+1]) { ret = false; break; } } /* 再判斷 A 10 J Q K 之例外情形 */ if(num[0]==1 && !ret) { // ret = true; /* 判斷第 2~5 張是否為 10 J Q K */ for(i=1; i!=M; ++i){ if(num[i]!=9+i) { ret = false; break; } } } return ret; } 塞不下,繼續參意見。 2011-05-05 15:58:05 補充: // ==================================== // 判斷是否為同花 bool IsFlush(int *poker) { int flower = poker[0]%4; /* 第一張牌花色 */ for(int i=1; i != M; ++i){ /* 2~5 張花色與第一張不同就不是同花 */ if(poker[i]%4 != flower) return false; } return true; /* 花色都一樣,是同花 */ } 2011-05-05 15:58:34 補充: // 主程式 int main() { int i, poker[N]; // poker: 原始 52 張poker int hand[M]; // 派給 user 5 張手邊 for(i=0; i!=N; ++i) poker[i] = i; shuffle(poker, N); // 拿出前五張給 user for(i=0; i!=M;++i) hand[i] = poker[i]; // 顯示手上五張手牌 display_poker(hand, M); 2011-05-05 15:59:20 補充: bool is_flush = IsFlush(hand); /* 是否為同花 */ bool is_straigh = IsStraight(hand); /* 是否為順子 */ 2011-05-05 15:59:26 補充: if(is_flush && is_straigh) cout << "同花順\\n"; else if(is_flush) cout << "同花\\n"; else if(is_straigh) cout << "順子\\n"; else cout << "非 同花順、同花、順子\\n"; 2011-05-05 15:59:33 補充: cout << "Press enter to exit..\\n"; cin.get(); return 0; } 2011-05-05 19:03:41 補充: 修正 pos = (int) (N*(double)rand()/ (RAND_MAX+1));
EdisonX(Lv.6) 2011 年 5 月 5 日
用隨機的程式 srand(time(0)) rand()吧
?(Lv.7) 2011 年 5 月 5 日
* ***** http://***** * [電子遊戲] 拉霸、水果盤、7PK、5PK [運彩遊戲] 棒球、籃球、足球、網球、冰球、各種體育經典賽事 [真人遊戲] 百家樂、21點、骰寶、輪盤、牌九、三公、輪盤、翻攤、牛牛、二八杠 [對戰遊戲] 台灣麻將、德州撲克、骰盅吹牛、四支刀、鬥地主、十三支、二八槓、暗棋、接龍 [彩球遊戲] 香港六合、台灣樂透、今彩539、樂合彩、大陸時時彩、基諾彩、北京賽車、賽狗、賽馬、指數 [優惠活動] 1. 新舊會員儲值就送500點 2. 真人百家樂彩金等你拿 ***** http://***** 歡迎免費體驗試玩!! 線上影片直播、正妹圖、討論區免費註冊 ~
匿名 2014 年 9 月 4 日

電腦與網際網路的其他問題