用c语言写一个洗牌和发牌的程序,要求先将一副牌的数组初始化为1-52,并修改洗牌的程序,使其能逐一处理数组,数组中每个元素只处理一次,每个元素将于数组中随机挑选的一个元素进行交换
时间: 2023-02-25 20:53:10 浏览: 139
这是一份示例代码,实现了洗牌和发牌的功能:
```
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 52
void shuffle(int deck[]) {
for (int i = 0; i < N; i++) {
int j = i + rand() / (RAND_MAX / (N - i) + 1);
int t = deck[j];
deck[j] = deck[i];
deck[i] = t;
}
}
int main() {
int deck[N];
srand(time(0));
// 初始化牌组
for (int i = 0; i < N; i++) {
deck[i] = i + 1;
}
// 洗牌
shuffle(deck);
// 发牌
for (int i = 0; i < N; i++) {
printf("%d ", deck[i]);
}
return 0;
}
```
上面的代码首先定义了一副牌的数量,然后实现了洗牌的函数 `shuffle`,使用随机数交换每张牌的位置,以保证每次洗牌的结果不同。最后在主函数中初始化牌组,调用洗牌函数并发牌。
相关问题
用c语言写一个洗牌发牌程序
本题需要用到随机数生成函数rand()和srand(),需要包含stdlib.h头文件。
洗牌程序:
```
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define CARD_NUM 54 // 牌的数量
int main() {
int cards[CARD_NUM]; // 存储牌的数组
int i, j, temp;
srand((unsigned int)time(NULL)); // 初始化随机数种子
// 初始化牌
for (i = 0; i < CARD_NUM; i++) {
cards[i] = i;
}
// 洗牌
for (i = CARD_NUM - 1; i > 0; i--) {
j = rand() % (i + 1); // 生成0到i之间的随机数
if (j != i) { // 交换位置
temp = cards[i];
cards[i] = cards[j];
cards[j] = temp;
}
}
// 输出洗牌后的牌
for (i = 0; i < CARD_NUM; i++) {
printf("%d ", cards[i]);
}
return 0;
}
```
发牌程序:
```
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define CARD_NUM 54 // 牌的数量
#define PLAYER_NUM 4 // 玩家数量
int main() {
int cards[CARD_NUM]; // 存储牌的数组
int players[PLAYER_NUM][CARD_NUM / PLAYER_NUM]; // 存储每个玩家的牌
int i, j, k;
srand((unsigned int)time(NULL)); // 初始化随机数种子
// 初始化牌
for (i = 0; i < CARD_NUM; i++) {
cards[i] = i;
}
// 洗牌
for (i = CARD_NUM - 1; i > 0; i--) {
j = rand() % (i + 1); // 生成0到i之间的随机数
if (j != i) { // 交换位置
int temp = cards[i];
cards[i] = cards[j];
cards[j] = temp;
}
}
// 发牌
k = 0;
for (i = 0; i < CARD_NUM / PLAYER_NUM; i++) {
for (j = 0; j < PLAYER_NUM; j++) {
players[j][i] = cards[k++];
}
}
// 输出每个玩家的牌
for (i = 0; i < PLAYER_NUM; i++) {
printf("Player %d: ", i+1);
for (j = 0; j < CARD_NUM / PLAYER_NUM; j++) {
printf("%d ", players[i][j]);
}
printf("\n");
}
return 0;
}
```
这里假设4个玩家,每个玩家发13张牌,剩余的2张不发给任何人。
用c语言写一个洗牌和发牌的代码
### 回答1:
下面是一个示例代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define CARDS 52
#define FACES 13
#define SUITS 4
void shuffle(unsigned int wDeck[][FACES]);
void deal(unsigned int wDeck[][FACES], const char *wFace[],
const char *wSuit[]);
int main(void) {
unsigned int deck[SUITS][FACES] = {0};
const char *face[] = {"Ace", "Deuce", "Three", "Four", "Five", "Six", "Seven",
"Eight", "Nine", "Ten", "Jack", "Queen", "King"};
const char *suit[] = {"Hearts", "Diamonds", "Clubs", "Spades"};
srand(time(NULL));
shuffle(deck);
deal(deck, face, suit);
return 0;
}
void shuffle(unsigned int wDeck[][FACES]) {
size_t row;
size_t column;
size_t card;
for (card = 1; card <= CARDS; ++card) {
row = rand() % SUITS;
column = rand() % FACES;
while (wDeck[row][column] != 0) {
row = rand() % SUITS;
column = rand() % FACES;
}
wDeck[row][column] = card;
}
}
void deal(unsigned int wDeck[][FACES], const char *wFace[],
const char *wSuit[]) {
size_t card;
size_t row;
size_t column;
for (card = 1; card <= CARDS; ++card) {
for (row = 0; row < SUITS; ++row) {
for (column = 0; column < FACES; ++column) {
if (wDeck[row][column] == card) {
printf("%5s of %-8s%c", wFace[column], wSuit[row],
card % 2 == 0 ? '\n' : '\t');
}
}
}
}
}
```
这段代码实现了洗牌和发牌的功能。它首先定义了一副扑克牌的数组,然后通过随机数生成来洗牌,最后按顺序发牌。
### 回答2:
下面是一个使用C语言写的洗牌和发牌的简单代码。
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void shuffle(int *deck, int size);
void deal(int *deck, int size);
int main()
{
int deck[52];
// 初始化一副牌
for (int i = 0; i < 52; i++)
{
deck[i] = i + 1;
}
// 洗牌
srand(time(NULL));
shuffle(deck, 52);
// 发牌
deal(deck, 52);
return 0;
}
// 洗牌函数
void shuffle(int *deck, int size)
{
for (int i = size - 1; i > 0; i--)
{
int j = rand() % (i + 1);
int temp = deck[i];
deck[i] = deck[j];
deck[j] = temp;
}
}
// 发牌函数
void deal(int *deck, int size)
{
char *suits[] = {"♠", "♥", "♦", "♣"};
char *ranks[] = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
for (int i = 0; i < size; i++)
{
int suit = (deck[i] - 1) / 13;
int rank = (deck[i] - 1) % 13;
printf("%s%s ", ranks[rank], suits[suit]);
if ((i + 1) % 13 == 0)
{
printf("\n"); // 每行输出13张牌
}
}
}
```
这段代码首先会初始化一副牌,然后使用`shuffle()`函数对牌进行洗牌操作。`shuffle()`函数采用了Fisher-Yates洗牌算法,通过随机交换数组中的元素来实现洗牌。随后,`deal()`函数会根据洗好的牌进行发牌操作,并输出每个人的手牌。这里将牌的花色和数字分别用字符数组`suits[]`和`ranks[]`表示,然后根据牌的数字进行索引打印。最后,`main()`函数调用了洗牌和发牌函数。运行这段代码后,将会输出一副洗好并发到玩家手上的扑克牌。
### 回答3:
洗牌和发牌是扑克牌类游戏中常见的操作,我们可以用C语言编写一个简单的洗牌和发牌的代码。
首先,我们需要一个数组来表示一副扑克牌,可以使用整数表示不同的牌面和花色,例如1到13表示不同的牌面,1到4表示不同的花色。我们可以定义一个大小为52的一维数组来表示一副扑克牌,其中数组元素的值对应着扑克牌的编号。
接下来,我们需要实现一个洗牌的函数,该函数将随机打乱扑克牌的顺序,使得每张牌出现的概率相等。可以使用rand()函数来生成一个随机的整数,然后将这个整数对52取余,得到一个在0到51之间的随机数作为索引,将该索引对应的牌与当前遍历到的牌进行交换,从而完成洗牌操作。
最后,我们可以编写一个发牌函数来模拟发牌的过程。可以用一个循环来依次将牌发给玩家,可以使用一个变量来表示当前发到的位置,每次发牌时将该位置自增1,同时将该位置对应的牌分配给当前玩家。
综上,我们可以编写如下的C代码来实现洗牌和发牌的操作:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void shuffle(int *cards, int size) {
srand(time(NULL));
for (int i = 0; i < size; i++) {
int j = rand() % size;
int temp = cards[i];
cards[i] = cards[j];
cards[j] = temp;
}
}
void deal(int *cards, int size, int players, int cardsPerPlayer) {
int position = 0;
for (int i = 0; i < players; i++) {
printf("Player %d: ", i + 1);
for (int j = 0; j < cardsPerPlayer; j++) {
printf("%d ", cards[position++]);
}
printf("\n");
}
}
int main() {
int cards[52];
for (int i = 0; i < 52; i++) {
cards[i] = i + 1;
}
shuffle(cards, 52);
deal(cards, 52, 4, 13);
return 0;
}
```
以上代码创建一个包含52个牌的数组,先进行洗牌操作,然后将洗好的牌发给4个玩家,每个玩家发到13张牌。输出结果类似于:
```
Player 1: 42 8 19 50 35 3 47 51 40 14 7 28 52
Player 2: 12 38 23 41 2 15 24 26 21 10 13 43 48
Player 3: 45 27 33 18 22 36 30 11 44 20 32 34 29
Player 4: 46 9 5 49 31 4 25 39 1 6 37 17 16
```
这样我们就成功地使用C语言编写了一个简单的洗牌和发牌的代码。
阅读全文