洗牌編程
1. 編程模擬生成一副撲克牌,發牌給幾個玩家的程序,把洗好的一副牌分給幾個玩家,依次顯示每個玩家的牌。
額,同求
2. c++編程,撲克牌洗牌,將一副撲克牌隨機洗好,順序輸出54張撲克牌,求完整代碼註:用C++寫
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <time.h>
using namespace std;
// 輸出輔助
const string strtype[6] = {"方塊", "梅花", "紅心", "黑桃", "小王", "大王"};
const string strnum[14] = {"", "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
struct Card
{
// type是花色,0~3分別表示不同的花色,4是小王,5是大王
// num是牌上的數字
int type, num;
}dat[54];
int main()
{
// 時間隨機函數
srand((unsigned)time(NULL));
int cnt = 0;
for (int i = 0; i < 4; i ++)
for (int j = 1; j <= 13; j ++)
{
dat[cnt].type = i;
dat[cnt ++].num = j;
}
dat[cnt ++].type = 4;
dat[cnt ++].type = 5;
for (int i = 1; i < 54; i ++)
// 交換函數,可以證明這樣交換出來的數列是隨機的
// 這里就不展開了
swap(dat[i], dat[rand() % i]);
// 輸出
for (int i = 0; i < 54; i ++)
{
cout << strtype[dat[i].type];
if (dat[i].type < 4) cout << strnum[dat[i].num];
cout << ' ';
}
cout << endl;
system("pause");
}
我測試過啦,運行的一次結果如下(當然是隨機的):
方塊10 黑桃6 梅花9 紅心6 方塊J 黑桃A 方塊4 梅花3 黑桃K 梅花4 方塊K 方塊5 方塊2
黑桃Q 方塊A 紅心K 梅花K 黑桃10 紅心10 紅心3 黑桃2 紅心2 黑桃8 小王 方塊Q 紅心J
梅花6 梅花Q 紅心9 方塊7 梅花7 方塊9 梅花J 紅心A 紅心4 大王 紅心Q 紅心8 方塊6 黑
桃J 方塊8 梅花A 方塊3 紅心7 黑桃7 梅花10 梅花2 黑桃5 紅心5 黑桃3 黑桃9 黑桃4 梅
花5 梅花8
請按任意鍵繼續. . .
希望能夠幫到你!
3. c語言編程——發牌洗牌模擬,求幫助
實現了2副牌的發牌,和每個人的牌和底牌
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
struct CARD //牌
{
char suit[10]; /*花色*/
char face[10]; /*牌面*/
};
enum { posA, posB, posC, posD};//定義好每個人的位置
struct Postion
{
struct CARD getcard[25];//每人獲得的牌
};
struct Postion postion[4];//分配四個位置
struct CARD leftCard[8]; //底牌
struct CARD card[54]; //54張牌
char *suit[]={"Spades","Hearts","Clubs","Diamonds"};
char *face[] = {"A","2","3","4","5","6","7","8","9",
"10","jack","Queen","King"};
/* 函數功能:將52張牌的順序打亂,
函數參數:結構體數組wCard,表示52張牌
函數返回值:無
*/
void Shuffle(struct CARD *wCard)
{
int i,j;
struct CARD temp;
for (i=0; i<54; i++)
{
j=rand()%54;
temp=wCard[i];
wCard[i]=wCard[j];
wCard[j]=temp;
}
}
/*函數功能:發牌結果
函數參數:結構體數組wCard,表示有54張牌
函數返回值:無
*/
void Deal(struct CARD *wCard)
{
int i,aidx=0,bidx=0,cidx=0,didx=0;
Shuffle(card);//將牌打亂
/*************發第一副牌,只發50張,分別分給A,B,C,D四個位置 4張留底**************/
// 第一次發完50張後,A,B多一張,所以下面第二次讓C,D排在前面,兩次發完剛好各40張 */
for (i=0; i<50; i++)//發牌數
{
// printf("%10s %5s\n", wCard[i].suit, wCard[i].face);
if(i%4==0)
postion[posA].getcard[aidx++]=wCard[i];
else if(i%4==1)
postion[posB].getcard[bidx++]=wCard[i];
else if(i%4==2)
postion[posC].getcard[cidx++]=wCard[i];
else if(i%4==3)
postion[posD].getcard[didx++]=wCard[i];
}
/**********剩下的四張作為底牌*********/
leftCard[0]=wCard[i++];
leftCard[1]=wCard[i++];
leftCard[2]=wCard[i++];
leftCard[3]=wCard[i++];
Shuffle(card);//再次將牌打亂
/*************發第二副牌,也只發50張,分別分給A,B,C,D四個位置,4張留底,一共8張底**************/
for (i=0; i<50; i++)//發牌數
{
// printf("%10s %5s\n", wCard[i].suit, wCard[i].face);
if(i%4==0)
postion[posC].getcard[cidx++]=wCard[i];
else if(i%4==1)
postion[posD].getcard[didx++]=wCard[i];
else if(i%4==2)
postion[posA].getcard[aidx++]=wCard[i];
else if(i%4==3)
postion[posB].getcard[bidx++]=wCard[i];
}
/**********剩下的四張作為底牌,這樣就一共為8張底牌*********/
leftCard[4]=wCard[i++];
leftCard[5]=wCard[i++];
leftCard[6]=wCard[i++];
leftCard[7]=wCard[i++];
}
/* 函數功能:將52張牌按黑桃、紅桃、草花、方塊花色順序,面值按A~K順序排列
函數參數:結構體數組wCard,表示不同花色和面值的52張牌
指針數組wFace,指向面值字元串
指針數組wSuit,指向花色字元串
函數返回值:無
*/
void FillCard(struct CARD wCard[],char *wSuit[], char *wFace[])
{
int i;
for (i=0; i<52; i++)
{
strcpy(wCard[i].suit, wSuit[i/13]);
strcpy(wCard[i].face, wFace[i%13]);
}
// wCard[53].face="Big"; //大小王
strcpy(wCard[52].suit, "Small");
strcpy(wCard[52].face, "ghost");
strcpy(wCard[53].suit, "Big");
strcpy(wCard[53].face, "ghost");
}
void print(char ch)//輸出牌
{
int i;
switch(ch)
{
case 'A': for(i=0; i<25; i++)
{
printf("%10s %5s\n", postion[posA].getcard[i].suit, postion[posA].getcard[i].face);
}
break;
case 'B': for(i=0; i<25; i++)
{
printf("%10s %5s\n", postion[posB].getcard[i].suit, postion[posB].getcard[i].face);
}
break;
case 'C': for(i=0; i<25; i++)
{
printf("%10s %5s\n", postion[posC].getcard[i].suit, postion[posC].getcard[i].face);
}
break;
case 'D': for(i=0; i<25; i++)
{
printf("%10s %5s\n", postion[posD].getcard[i].suit, postion[posD].getcard[i].face);
}
break;
}
}
void outputLeftCard()//輸出底牌
{
int i;
for(i=0; i<8; i++)
printf("%10s %5s\n", leftCard[i].suit, leftCard[i].face);
}
int main()
{
char pos;
srand(time(NULL));
FillCard(card,suit,face);
//Shuffle(card);
Deal(card);
printf("Please choose your position(A、B、C、D):");
scanf("%c", &pos);
print(pos);//輸出你所在位置的牌
/**********下面輸出的是,除了你之外其他人的牌**********/
if(pos !='A')
{
printf("A:\n");
print('A');
}
if(pos !='B')
{
printf("B:\n");
print('B');
}
if(pos !='C')
{
printf("C:\n");
print('C');
}
if(pos !='D')
{
printf("D:\n");
print('D');
}
printf("底牌為:\n");
outputLeftCard();//輸出底牌
return 0;
}
4. 洗牌問題這樣寫怎麼不對C語言
從進入while循環一開始就不對了,c=1
d=0的時候執行b[c]=b[d],那麼你的編號為2的那張牌就消失了,後面的程序不看
解決辦法1
再定義一個數組,兩個數組倒著洗牌
解決辦法2
定義一個數組,存半副牌
解決辦法3
定義一個數,存一張牌,不過剩下的牌需要用
數學方法
推導
補充:如果需要改程序或者寫程序,請把原題目發出來
5. 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;//其實就是交換兩張牌
}
//循環下來肯定每張牌都被交換過,有它自己的新位置,也有可能湊巧還在原來的位置
//最後按下標順序分四堆
6. 誰會c語言編程發牌洗牌程序
這個文件包含了生成牌,發牌,洗牌等操作,不過是java寫的,但是程序語言和C還是有很多相通的,你知道了原理自然能自己做
/**
* 文件名:Card.java 2014-1-24 上午8:46:59
* @author Administrator
*/
package cc.icoc.javaxu.card.bean;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**撲克牌卡片類
* 創建時間: 2014-1-24 上午8:46:59
*
* @author 許仕永
* 項目名稱: PucCard
* 文件名: Card.java
* 編碼: GBK
* @Description:
* @JKD JDK 1.6.0_21
* @version v1.0
* @TODO
*/
public class Card implements Comparable
{
int cardType; //花色
int cardNum; //點數
//存儲全部的卡牌
public static List cardsList = new ArrayList();
public Card(int cardNum,int cardType)
{
this.cardNum = cardNum;
this.cardType = cardType;
}
/**初始化卡牌**/
public static void initCards()
{
// String[] types = new String[]{"黑桃","紅桃","梅花","方片","小王","大王"};
int[] types = new int[]{4,3,2,1,5,6};
/**
* * 54張,
* 紅桃,黑桃,梅花,方塊各1--13 13張
* 大小王2張
* 2+13x4=54
*/
for ( int j = 0; j < 4; j++ )
{
for ( int i = 1; i <= 13 ; i++ )
{
cardsList.add(new Card(i, types[j]));
}
}
//大小王的初始化
cardsList.add(new Card(14, types[4]));
cardsList.add(new Card(15, types[5]));
}
/**洗牌 以避免抽牌時抽到的卡牌次序時初始化卡牌的次序**/
public static void cleanCards()
{
Random random = new Random();
//洗牌次數控制在卡牌張數的一半+20以內的隨機浮動次數
for ( int i = 0; i < (cardsList.size() / 2 + random.nextInt(20)); i++ )
{
int from = random.nextInt(cardsList.size());
int to = random.nextInt(cardsList.size());
Object temp;
if(to != from)
{
temp = cardsList.get(to);
cardsList.set(to, cardsList.get(from));
cardsList.set(from, temp);
}
}
}
@Override
public String toString()
{
// int[] types = new int[]{4,3,2,1,5,6};
String[] types = new String[]{"♠","♥","♣","♢","大王","小王"};
String typeString = null;
switch (cardType)
{
case 4 :typeString = types[0];break;
case 3 :typeString = types[1];break;
case 2 :typeString = types[2];break;
case 1 :typeString = types[3];break;
case 5 :typeString = types[5];break;
case 6 :typeString = types[4];break;
default :
break;
}
return "Card [" + typeString + " " + cardNum + "]";
}
@Override
public int compareTo(Object o)
{
//黑桃、紅桃、梅花、方片、小王、大王 對象 4,3,2,1,5,6
//大小次序 大王、小王、2、A、K、Q、J、10...3。
Card card = (Card)o;
if((card.cardNum == 2) && (this.cardNum != 2))
{
if((this.cardNum < 14))
{
return 1;
}
else if(this.cardNum >= 14)
{
return -1;
}
}
else if((this.cardNum == 2) && (this.cardNum == 2))
{
return card.cardType - this.cardType;
}
if((card.cardNum == 1) && (this.cardNum != 1))
{
if((this.cardNum < 13))
{
return 1;
}
else if(this.cardNum >= 13)
{
return -1;
}
}
else if((this.cardNum == 1) && (this.cardNum == 1))
{
return card.cardType - this.cardType;
}
if((this.cardNum == card.cardNum))
{
return this.cardType - card.cardType;
}
return card.cardNum - this.cardNum;
}
}
7. 編寫一個C語言程序,模擬洗牌和發牌的過程
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
structPOKER
{
intnum;//A:1,J:11,Q:12,K:13
intcolor;//黑1,紅2,梅3,方4
}s[52];
intmain()
{
inti,num,color;
memset(s,0,sizeof(structPOKER)*52);
srand((unsigned)time(0));
intcount=0;
while(count<52)
{
num=rand()%13+1;
color=rand()%4+1;
intflag_skip=0,flag_end=0;
for(i=0;i<52;i++)
{
if(s[i].num==num&&s[i].color==color)
{
flag_skip=1;
break;
}
}
if(flag_skip==1)
{
continue;
}
while(1)
{
i=rand()%52;
if(s[i].num==0)
{
s[i].num=num;
s[i].color=color;
count++;
break;
}
else
{
continue;
}
}
}
for(i=0;i<52;i++)
{
if(i%13==0)
{
printf(" 玩家%d:",i/13+1);
}
switch(s[i].num)
{
case1:putchar('A');break;
case11:putchar('J');break;
case12:putchar('Q');break;
case13:putchar('K');break;
default:printf("%d",s[i].num);
}
switch(s[i].color)
{
case1: putchar(6);break;
case2:putchar(3);break;
case3:putchar(5);break;
case4:putchar(4);break;
default:printf("");
}
printf("");
}
return0;
}
8. C語言編程題-洗牌
我解決了這個問題,程序如下:
注意:n不能大於500,否則你就得改數組A和B的大小;
#include <stdio.h>
int A[1000],B[500];
void main()
{
int m,n,i;
int flag(int);
void exchange(int);
printf("input n:");
scanf("%d",&n);
for(i=0,m=n*2;i<m;i++) A[i]=i;
i=0;
do {exchange(n); i++;}
while(flag(m));
printf("Times: %d",i);
}
void exchange(int n)
{
int i;
for(i=0;i<n;i++)
B[i]=A[i+n];
for(i=n-1;i>=0;i--)
A[i*2+1]=A[i];
for(i=0;i<n;i++)
A[i*2]=B[i];
}
9. C++編程 洗牌問題
#include<iostream>
#include<stdlib.h>
usingnamespacestd;
#defineN1024
intcmp(char*a,intn)
{
for(inti=0;i<2*n;i++)
{
if(a[i]!=i)return0;
}
return1;
}
voidmain()
{
chartmp1[N],tmp2[N];
intn,count=1;
cin>>n;
//洗第一次
for(inti=0;i<n;i++)
{
tmp1[i*2+1]=i;
tmp1[i*2]=n+i;
}
//後面每洗一次,計數+1,如恢復則中斷循環,用兩塊內存來回搗騰
for(;;)
{
for(inti=0;i<n;i++)
{
tmp2[i*2+1]=tmp1[i];
tmp2[i*2]=tmp1[n+i];
}
count++;
if(cmp(tmp2,n))break;
for(inti=0;i<n;i++)
{
tmp1[i*2+1]=tmp2[i];
tmp1[i*2]=tmp2[n+i];
}
count++;
if(cmp(tmp2,n))break;
}
cout<<count<<endl;
system("pause");
}
10. 題目:編寫程序,模擬撲克游戲中的洗牌過程.(只選紅桃模擬)。用java怎麼弄
洗牌過程?一句話就完成洗牌過程了!!
代碼如下:
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CardGame {
public static void main(String[] args) throws IOException {
String[] types={"黑桃","草花","紅心","方塊"};
String[] value={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
String[] king={"JOKER","joker"};
List<String> cards=new ArrayList<String>();//將一副牌54張放入待洗牌的集合中
for(int i=0;i<types.length;i++){
for(int j=0;j<value.length;j++){
cards.add(types[i]+value[j]);//每個花色的2-A
}
}
cards.add(king[0]);//大鬼
cards.add(king[1]);//小鬼
int m=0;
System.out.println("洗牌之前----------------------------------------------------\n");
for(String str:cards)
{
System.out.print(str+"\t");
m++;
if(m%13==0)
System.out.println();
}
Collections.shuffle(cards);//洗牌動作
m=0;
System.out.println("\n\n洗牌之後-----------------------------------------------------\n");
for(String str:cards)//輸出洗牌後的結果
{
System.out.print(str+"\t");
m++;
if(m%13==0)
System.out.println();
}
}
}
我在這里把所有的花色都加入一起洗牌了,樓主可根據需要進行特殊花色的洗牌!!你多執行幾次就會發現每次洗牌後的牌的位置都不是一樣的!!關鍵在一個洗牌動作的方法!!