拜託c++高手給一個撲克牌程式,條件如下:
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));
用隨機的程式
srand(time(0))
rand()吧
* ***** http://***** *
[電子遊戲]
拉霸、水果盤、7PK、5PK
[運彩遊戲]
棒球、籃球、足球、網球、冰球、各種體育經典賽事
[真人遊戲]
百家樂、21點、骰寶、輪盤、牌九、三公、輪盤、翻攤、牛牛、二八杠
[對戰遊戲]
台灣麻將、德州撲克、骰盅吹牛、四支刀、鬥地主、十三支、二八槓、暗棋、接龍
[彩球遊戲]
香港六合、台灣樂透、今彩539、樂合彩、大陸時時彩、基諾彩、北京賽車、賽狗、賽馬、指數
[優惠活動]
1. 新舊會員儲值就送500點
2. 真人百家樂彩金等你拿
***** http://*****
歡迎免費體驗試玩!!
線上影片直播、正妹圖、討論區免費註冊 ~