關於撲克牌的演算法

2021-06-19 15:40:09 字數 2949 閱讀 5502

紅色標記的地方是我標註的乙個重點

實現乙個演算法: 將一副54張撲克牌經過洗牌後順序發給三個人,然後將每個人的牌按降序排序。我們已經設計出了撲克牌類card、演算法類game,並且有了測試**main.cpp,但演算法類game中的洗牌函式shuffle()和發牌函式deal()沒有實現,請寫出具體的實現**,以使測試**main.cpp中輸出期望的內容。

撲克牌類:

card.h

#ifndef card_h

#define card_h

#include

using namespace std;

//撲克牌類

class card

/** 花色 */

public:

int suit;

/** 點數,0代表3,1代表4.... */

int rank;

enum

card(int s, intr):suit(s),rank(r){}

string tostring();

#endif

card.cpp

#include

#include "card.h"

const string card::suit_names = ;

const string card::rank_names =;

string card::tostring(){

return suit_names[suit] + rank_names[rank];

演算法類:

game.h

#ifndef game_h

#define game_h

#include "card.h"

using namespace std;

class game{

public:

//洗牌函式,把一副牌的次序隨機打亂

void shuffle(card* cards,int len);

//發牌函式,第乙個陣列是洗牌後的結果,第二個陣列是二維

//陣列的首位址,num是人數。發牌的時候每個人的牌要做排序

void deal(card* cards,int len,card* ret,int num);

#endif

main.cpp

#include

#include

#include

#include

#include "game.h"

using namespace std;

int main()

//生成牌

card* cards = new card[54];

int i = 0,j = 0;

int rank,suit;

for (rank = card::three; rank <= card::deuce; rank++)

for(suit = card::diamond;suit <= card::spade;suit++){

(cards+i)->suit = suit;

(cards+i)->rank = rank;

i++;

(cards+i)->suit = card::joker;

(cards+i)->rank = card::black;

i++;

(cards+i)->suit = card::joker;

(cards+i)->rank = card::red;

//洗牌

game* g = new game;

g->shuffle(cards,54);

cout<<"一副撲克牌"card res[3][18];

g->deal(cards,54,(card*)res,3); //注意:這裡的(

card*

)是必須的,因為二維陣列名是指

//向指標的指標,這裡也可以寫成

res[0]

cout<<"發牌之後"cout << "[";

for(j=0;j<18;j++){

cout << res[i][j].tostring();

if(j!=17) cout<<",";

cout <<"]"<< endl;

game.cpp

#include "game.h"

//洗牌函式

void game::shuffle(card* cards,int len){

srand(time(0));

printf("%p\n",cards);

int i;

for (i = len-1; i >= 1; i--)

int j = rand()%i;

card t = cards[i];

cards[i] = cards[j];

cards[j] = t;

//排序函式(冒泡)

void sort(card* ary,int len){

int i, j;  

for (i = 0; i < len-1; i++)

for (j = 0; j < len-1-i; j++)

if((ary+j)->rank < (ary+j+1)->rank){

card k = ary[j];

ary[j] = ary[j+1];

ary[j+1] = k;

//發牌函式

void game::deal(card* cards,int len,card*ret,int num){

int sum = len/num;

int i,j;

for(i=0,j=0;iret[i]= cards[j++];

ret[sum+i]= cards[j++];

ret[2*sum+i]= cards[j++];

for(i=0;isort(ret+i*sum,sum);

撲克牌排序 趣味撲克牌

一提到撲克牌,我們就想到神秘的魔術表演,撲克牌上有很多形狀和數字,裡面蘊藏了很多數學知識哦!瞧 subway的小朋友們正在進行趣味撲克牌的遊戲呢!好多撲克牌啊!撲克牌中間怎麼是空的呢?哇,還有這麼小的撲克牌呢!一看到teacher手中的撲克牌,小傢伙們乙個個的都興奮起來,迫不及待想要分享自己的見解呢...

撲克牌邏輯演算法

using system using system.collections.generic namespace gamelogic 撲克牌牌值採用16進製制 byte pokerarray 獲取花色 public static byte getpokerhua byte ipoker 獲取牌值 滿足...

變異的撲克牌演算法

一副撲克牌,除去大小王,首先我手裡有任意兩張牌 然後我要再在剩下的50張裡 抽出來5張 用我手裡的2張跟抽出來的5張組 成7張牌 其中只要有任意五張牌組成順子就行,求概率。要轉換一下思維,如果按照題目給定的思維進行思考的話,這個過程將會特別複雜 我們可以將這個看做一次性抽取七張牌的問題 那麼這個過程...