裡面的「檢查重複」寫的很爛,我寫的完全是隨機給第 i 張牌某個值,也因此當有很多張牌時跑起來就會炸掉!然後我剛剛改成這裡寫的換牌方法,這果然快非常多。
/***********************************
本程式只是發牌給 n 人, 每人 m 張牌並且按照花色跟大小排序
***********************************/
#include <cstdlib>
#include <iostream>
#include <math .h>
#include <stdio .h>
#include <time .h>
using namespace std;
int main()
{
int number, person;
int poker[52], check=1 ;
do{
cout< <"請輸入玩牌人數"<<endl;
cin>>person;
cout< <"請輸入每人拿牌張數"<<endl;
cin>>number;
if(person*number>52) {cout< <"總共要發"<<person*number<<"張牌, 你出老千!"<<endl;}
}while(person*number>52);
srand(time(0));
/*
//檢查重複
for(int i=0; i < 5; i++){
do{ poker[i] = rand()%52;
if(i>0){
for(int j=0; j<i ; j++){if(poker[j]==poker[i]) {check=0;}
}}}while(check==0);}
*/
for(int i=0; i < 52; i++){poker[i]=i;}
//洗牌
for(int i=1; i < 52; i++){
int j = rand()%52;
int tmp = poker[i];
poker[i] = poker[j];
poker[j] = tmp;
} //將取出的亂數當成索引, 做換值的動作
//大小排序
int temp, k=0;
do{
cout<<"第"<<k/number+1<<"位玩家拿到的牌"<<endl;
for(int i=k; i<k+number; i++){
for(int j=i+1; j<k+number; j++){
if (poker[i]%13<poker[j]%13 || (poker[i]%13==poker[j]%13 && poker[i]/13>poker[j]/13))
{ // 前面是把點數排序 : p[0] ≧ p[1] ≧ ... ≧ p[4]; 後面是把花色排序 : S > H > D > C
temp = poker[i];
poker[i] = poker[j];
poker[j] = temp;
}}
switch(poker[i]/13){
case 0 : cout< <"黑桃"; break;
case 1 : cout<<"紅心"; break;
case 2 : cout<<"方塊"; break;
case 3 : cout<<"梅花"; break;}
switch(poker[i]%13){
case 0 : cout<<"2"; break;
case 1 : cout<<"3"; break;
case 2 : cout<<"4"; break;
case 3 : cout<<"5"; break;
case 4 : cout<<"6"; break;
case 5 : cout<<"7"; break;
case 6 : cout<<"8"; break;
case 7 : cout<<"9"; break;
case 8 : cout<<"T"; break;
case 9 : cout<<"J"; break;
case 10 : cout<<"Q"; break;
case 11 : cout<<"K"; break;
case 12 : cout<<"A"; break;}// A 最大 , 2 最小的 case
cout<<",";
if(i==k+number-1){cout<<endl;}
}k = k+number;
}while(k<number*person);
cout<<endl;
system("PAUSE");
return 0;
}