當前位置:首頁 » 編程語言 » c語言牌堆

c語言牌堆

發布時間: 2023-01-21 09:46:07

『壹』 c語言編程用撲克牌洗牌和發牌

程序就不寫了,寫下大致流程

//定義一個數組,或者列表,鏈表什麼的隨你
//共52個元素 記作card[52]
//card代表撲克牌的類,有花色(color 枚舉,0,1,2,3),點數(枚舉 A~K)等屬性

card tmp;
for(int i=0;i<52;i++)
{
//計算一個0到52之間的隨機數x
tmp=card[i];
card[i]=card[x];
card[x]=tmp;//其實就是交換兩張牌
}
//循環下來肯定每張牌都被交換過,有它自己的新位置,也有可能湊巧還在原來的位置

//最後按下標順序分四堆

『貳』 C語言模擬摜蛋中一方最多炸彈數的數學期望

摜蛋是一種在江蘇、安徽地區廣為流傳的牌類游戲。由地方的撲克牌局「跑得快」、「八十分」發展而來。牌局採用四人結對競賽,輸贏升級的方式進行。由於使用兩副牌,並且有「逢人配」、「同花順」規則,故炸彈的個數對於牌局來說非常重要。通過C語言模擬的方式,可以預估出一位玩家手中拿到的炸彈數的數學期望。對於評估自己的牌型有著一定的意義。

炸彈 :大於等於4張相同點數的牌,或4張王(稱為天王炸彈),或同花順
逢人配 :兩張♥的主牌稱為逢人配,在與其他牌配合時可以當除了王之外的任意花色任意點數的牌,主牌的點數可從2取到A
同花順 :相同花色連續的五張牌,最大的為同花10JQKA,最小的為同花A2345,可當炸彈使用

程序完全模擬摜蛋的操作流程,總體上共有以下5個模塊
1.印製牌:按照順序給108張牌賦上花色和點數
2.洗牌:多次隨機交換牌的位置,打亂牌的順序
3.發牌:將洗完的牌輪流發給4位玩家
4.理牌:(按順序排列玩家1手中的牌【可不做】)找出玩家1手中炸彈個數的最大值
5.循環重復以上步驟若干次,統計玩家1拿到炸彈個數的平均值並輸出結果
其中,1、5在主程序中實現,2、3、4通過函數實現。

首先需要建立一個存儲一張牌的花色與點數的結構體poker。

創建包含108個poker結構體的結構體數組deck(一套牌),隨後第i張牌的點數即為i模13取余。第1-13、53-65張牌為第一種花色;第14-26、66-78張牌為第二種花色……以此類推,第105、106張牌為小王,算作第5種花色;第107、108張牌為大王,算作第6種花色。

將印製好的牌堆deck傳入函數randsort。以 偽隨機數種子 ——系統時間產生兩個偽隨機數i和j,將牌堆中的第i張牌和第j張牌 位置交換 ,重復上述操作1000次。

創建四個poker結構體的結構體數組p1、p2、p3、p4,用於存儲4個玩家手中的牌。將結構體數組deck和p1,p2,p3,p4傳入函數dealpoker,將deck中的第i張牌發給第j個人,其中j為i模4取余。

共分以下兩種情況考慮炸彈的個數:
非同花順:統計玩家1手中所有點數牌的張數和王的個數,找出所有張數大於等於4的點數,統計其個數,結果即為點數炸彈的炸彈數。 特別地,當某一個點數的牌張數為8張時,需要拆成兩個炸彈使用,即炸彈數+1 ;當王的個數為4時,炸彈數+1.
同花順:需要按順序檢索從A開頭到10開頭的同花順。當檢索A開頭的同花順時,首先指定一種花色,搜索同花順的第1張牌,若找到,將這張牌與【非整理好的同花順】的牌的最後一張交換位置,繼續尋找第二張,若找到,將這張牌與【非整理好的同花順】的牌的倒數第二張交換位置,繼續尋找……依此類推。如果五張都能找到,檢查這五個點數中牌的張數恰好為4的有幾個。 若多於1個(如:22223455556),則不算作同花順。若只有1個,則算作同花順,同花順個數+1,但是炸彈數-1 ,那五張牌稱之為【整理好的同花順】;若沒有,則算作同花順,同花順個數+1。 考慮到可能出現兩個完全一樣的同花順,上述5張牌檢索的流程需要進行兩遍。
最後,將炸彈數加上同花順個數,得到最終結果

首先指定逢人配的點數,隨後檢索玩家一手中的逢人配的位置與個數。 將逢人配依次視作各張牌面的牌 ,再統計其炸彈數,選擇最大值作為最終結果。
有兩張逢人配時,同理。

重復上述操作相當大次數,計算出平均值,作為玩家一手中拿到最多炸彈個數的數學期望的估計值,並列印結果。

另外,也可單獨統計同花順的期望

當不算逢人配時,統計純數字炸彈的期望,約為1.365

與貼吧大神的純概率計算較為接近

炸彈不多是常事,且用且珍惜啊XD

『叄』 c語言關於創建撲克牌的各種函數!!

LZ的compare函數第一個if (c1->value != c2->value)應該是if (c1->value == c2->value)吧,其他沒問題。

其他函數:

makestandarddeck函數負責創建一副完整52張牌,我理解應該是創建一副洗好的順序不規則的牌吧。我想到的思路大概有兩種,最快的思路是每產生一張新牌,分配不重復的一種花色;另一種更容易的思路是先老實按點數和花色的順序依次產生52張排好順序的牌,之後洗牌。分別給出代碼。

#include<stdlib.h>
card*makestandarddeck()//solution1
{
intgen[52]={0};
card*cards=malloc(52*sizeof(card));
inti,k,d;
srand(time(NULL));
for(i=0;i<52;i++)
{
k=rand()%52;
d=k%2?1:-1;
while(gen[k]==0)
{
k+=d;
}
gen[k]=1;
cards[i].suit=k%4;
cards[i].value=k/4+1;
}
returncards;
}
card*makestandarddeck()//solution2
{
inti;
card*cards=malloc(52*sizeof(card));
for(i=0;i<52;i++)
{
cards[i].suit=i%4;
cards[i].value=i/4+1;
}
shufflecards(cards);//洗牌
returncards;
}

find_index函數負責找牌,因為牌可能是亂序的,只能老實的遍歷查找。

intfind_index(deck*d,intsuit,intvalue)
{
inti,n=d->num_cards;
card*cards=d->cards;
for(i=0;i<n;i++)
{
if(cards[i].value==value&&cards[i].suit==suit)
returni;
}
return-1;
}

『肆』 C語言,寫程序實現一堆撲克牌的排序。

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

void sort(int *p)

{int i,j,t,t1;

for(i=0;i<12;i++)

{

for(j=0;j<12-i;j++)

if(*(p+j)>*(p+j+1))

{t=*(p+j);

*(p+j)=*(p+j+1);

*(p+j+1)=t;

}

}

for(i=0;i<12;i++)

if(*(p+i)%13==0)

{

t=*(p+i);

t1=*(p+i)/13;

for(j=i;j<=12&&*(p+j)/13==t1;j++)

*(p+j-1)=*(p+j);

*(p+j-1)=t;

i=j-1;

}

}

int main()

{int a[52],i,j,t;

srand(time(0));

for(i=0;i<52;i++)a[i]=i;

for(i=51;i>1;i--) //洗牌、發牌(0~12為第一人,13~25為第二人。。。)

{j=rand()%(i+1);

t=a[i];a[i]=a[j];a[j]=t;

}

for(i=0;i<4;i++)//排序

sort(&a[i*13]);

for(i=0;i<52;i++)

{

switch(a[i]%13)//不同點數按不同輸出

{

case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:

case 9: printf("%c%-2d ",3+a[i]/13,a[i]%13+1); break;

case 10: printf("%c%J ",3+a[i]/13); break;

case 11: printf("%c%Q ",3+a[i]/13); break;

case 12: printf("%c%K ",3+a[i]/13); break;

case 0: printf("%c%A ",3+a[i]/13);

}

if(i%13==12)printf(" ");

}

return 0;

}

『伍』 C語言棧區、堆區的使用,typedef和sizeof的使用

1、棧區的使用

棧區寫入內存的的順序是先進後出。

存放的是函數的參數、返回值、局部變數

編譯器管理數據開辟和釋放

變數的生命周期在該函數結束後自動釋放

不要返回局部變數的值,因為局部變數在函數執行之後就釋放掉了,無法讀取原來的內存

2、堆區的使用

堆區的空間遠遠大於棧區

它沒有先進後出的數據結構

由程序員手動開辟和釋放,malloc、calloc開辟free釋放

注意:

如果主調函數中沒有給指針分配內存,那麼被調函數中需要利用高級指針給主調函數中的指針分配內存

3.數據區放的是靜態變數、全局變數以及常量

static靜態變數: 編譯階段分配內存,只能在當前文件內使用,只初始化一次

ertern全局變數:C語言下默認的全局變數前都默認隱藏了該關鍵字

4.const修飾的變數

直接修改const修飾的全局變數:失敗

簡介修改const修飾的全局變數:失敗,原因是放在常量區,受到保護

直接修改const修飾的局部變數:失敗

直接修改const修飾的局部變數:成功,該局部變數其實放到了棧區,是偽常量

5.字元串常量

不同編譯器的處理方式有所區別

ANSI並未指定它的修改方式

有些編譯器可以修改字元串常量,但有些不可以,某些編譯器將相同的字元串常量看做同一個字元串常量

6.void的使用方式

無類型,不可以創建變數,無法分配內存

限定函數返回值

限定函數參數列表

void*是萬能指針,不需要強制轉化就可以給其他指針賦值

7.sizeof的使用

sizeof的本質其實是一個運算符,類似於+-*/

當統計某類型占的空間時需要加()

當統計mou變數占的空間時無需加()

返回值的類型是無符號整形,即unsigned int

數組名稱如果作為函數參數,會退化為指針,指向數組首元素

8.typedef的使用

它可以給類型起別名

簡化struct關鍵字

區分數據類型

提高代碼的可移植性

『陸』 如何用c語言編寫紙牌發牌程序

發牌原程序見我的空間(http://hi..com/crazycola/blog/item/52402bd4b3f68705a08bb746.html),可選是否包含大小王,可選發牌列數。

以下為改過的版本,不包含大小王(即總數52張),只能發4堆。

另外附加了用戶菜單,原程序中不含菜單部分。

代碼如下:

---------------------------------------
#include <stdlib.h>
#include <time.h>
#include <stdio.h>

int menu()
{
int choice;
printf("1 發牌/0 退出:");
scanf("%d",&choice);
return choice;
}

void main( void )
{
int i1, j, total;
int *iArr;
int tag = 0;
char* pok_C[] = { "黑桃", "紅桃", "梅花", "方塊" };
char* pok_N[] = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };

if(!menu()) exit(0);

total = 52;
srand( (unsigned)time( NULL ) );
iArr = (int*)malloc(total*sizeof(int));

for( i1=0; i1<total; i1++ )
{
iArr[i1]=rand()%total;
if( i1==0 ) continue;
do {
tag = 0;
for( j=0; j<i1; j++ )
if( iArr[j] == iArr[i1] )
{
iArr[i1]=rand()%total;
tag = 1;
}
} while( tag==1 );
}

for( i1=0; i1<total; i1++ )
{
printf("%s%s\t",pok_C[iArr[i1]%4],pok_N[iArr[i1]%13]);
if(i1%4==3) printf("\n");
}

free(iArr);

}

『柒』 c語言堆和棧的區別

內存分配中的堆和棧

在 C 語言中,內存分配方式不外乎有如下三種形式:

  • 從靜態存儲區域分配:它是由編譯器自動分配和釋放的,即內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在,直到整個程序運行結束時才被釋放,如全局變數與 static 變數。

  • 在棧上分配:它同樣也是由編譯器自動分配和釋放的,即在執行函數時,函數內局部變數的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元將被自動釋放。需要注意的是,棧內存分配運算內置於處理器的指令集中,它的運行效率一般很高,但是分配的內存容量有限。

  • 從堆上分配:也被稱為動態內存分配,它是由程序員手動完成申請和釋放的。即程序在運行的時候由程序員使用內存分配函數(如 malloc 函數)來申請任意多少的內存,使用完之後再由程序員自己負責使用內存釋放函數(如 free 函數)來釋放內存。也就是說,動態內存的整個生存期是由程序員自己決定的,使用非常靈活。需要注意的是,如果在堆上分配了內存空間,就必須及時釋放它,否則將會導致運行的程序出現內存泄漏等錯誤。

數據結構的堆和棧

在數據結構中,棧是一種可以實現「先進後出」(或者稱為「後進先出」)的存儲結構。假設給定棧 S=(a0,a1,…,an-1),則稱 a0為棧底,an-1為棧頂。進棧則按照 a0,a1,…,an-1的順序進行進棧;而出棧的順序則需要反過來,按照「後存放的先取,先存放的後取」的原則進行,則 an-1先退出棧,然後 an-2才能夠退出,最後再退出 a0。

在實際編程中,可以通過兩種方式來實現:使用數組的形式來實現棧,這種棧也稱為靜態棧;使用鏈表的形式來實現棧,這種棧也稱為動態棧。

相對於棧的「先進後出」特性,堆則是一種經過排序的樹形數據結構,常用來實現優先隊列等。假設有一個集合 K={k0,k1,…,kn-1},把它的所有元素按完全二叉樹的順序存放在一個數組中,並且滿足:



則稱這個集合 K 為最小堆(或者最大堆)。

由此可見,堆是一種特殊的完全二叉樹。其中,節點是從左到右填滿的,並且最後一層的樹葉都在最左邊(即如果一個節點沒有左兒子,那麼它一定沒有右兒子);每個節點的值都小於(或者都大於)其子節點的值。

熱點內容
如何提高手機緩存速度 發布:2025-07-18 20:24:48 瀏覽:235
vba讀取資料庫數據 發布:2025-07-18 20:24:48 瀏覽:606
shell解壓zip 發布:2025-07-18 20:20:36 瀏覽:858
安卓泰拉瑞亞去哪裡買 發布:2025-07-18 20:01:05 瀏覽:694
flash編譯器 發布:2025-07-18 19:49:38 瀏覽:487
memcached源碼分析 發布:2025-07-18 19:22:42 瀏覽:866
android展示圖片 發布:2025-07-18 19:21:24 瀏覽:594
一台伺服器5個IP怎麼分配 發布:2025-07-18 19:12:34 瀏覽:862
貴陽分布式存儲行情 發布:2025-07-18 19:12:31 瀏覽:361
車場伺服器和工控機是如何連接的 發布:2025-07-18 19:10:19 瀏覽:938