※ 引述《gogo (gogo)》之銘言:
: ※ 引述《[email protected] (喔god)》之銘言:
: : 比如說發撲克牌
: : 如何讓發過的牌不再重覆出現呢?
: : 就是同時考慮花色與點數
: : 在C++裡要如何剔除發過的牌?
: : 試過一種方法
: : 但是那居然要寫17個if-else statement
: : 吼........
: 可以說明一下方法的阿..
: 在來討論
看一下吧....
大概能用吧....
多說一下方法....
不知道能不能用....
#include <time.h>
#include <stdlib.h>
struct stack_node /* 堆疊的結構宣告 */
{
int data; /* 堆疊資料 */
struct stack_node *next; /* 指向下一節點 */
};
typedef struct stack_node stack_list; /* 串列新型態 */
typedef stack_list *link; /* 串列指標新型態 */
link stack = NULL; /* 堆疊指標 */
/* ---------------------------------------- */
/* 堆疊資料的存入 */
/* ---------------------------------------- */
int push(int value)
{
link new_node; /* 新節點指標 */
/* 配置節點記憶體 */
new_node = ( link ) malloc(sizeof(stack_list));
if ( !new_node )
{
printf("記憶體配置失敗! \n");
return -1; /* 存入失敗 */
}
new_node->data = value; /* 建立節點內容 */
new_node->next = stack; /* 新節點指向原開始 */
stack = new_node; /* 新節點成為堆疊開始 */
}
/* ---------------------------------------- */
/* 堆疊資料的取出 */
/* ---------------------------------------- */
int pop()
{
link top; /* 指向堆疊頂端 */
int temp;
if ( stack != NULL ) /* 堆疊是否是空的 */
{
top = stack; /* 指向堆疊頂端 */
stack = stack->next; /* 堆疊指標指向下節點 */
temp = top->data; /* 取出資料 */
free(top); /* 釋回節點記憶體 */
return temp; /* 堆疊取出 */
}
else
return -1;
}
/* ---------------------------------------- */
/* 檢查堆疊是否是空的 */
/* ---------------------------------------- */
int empty()
{
if ( stack == NULL ) /* 是否是空 */
return 1; /* 空的 */
else
return 0; /* 不是空的 */
}
/* ---------------------------------------- */
/* 主程式: 洗牌後, 將牌發給四個人. */
/* 紅心: 陣列 0 - 12 */
/* 方塊: 陣列 13 - 25 */
/* 梅花: 陣列 26 - 38 */
/* 黑桃: 陣列 39 - 51 */
/* ---------------------------------------- */
void main()
{
int card[52]; /* 樸克牌陣列 */
int pos; /* 牌代碼 */
int i,temp;
srand(time(&temp) % 60); /* 使用時間初始亂數 */
for ( i = 0; i < 52; i++ )
card[i] = 0; /* 清除樸克牌陣列 */
i = 0;
while ( i != 52 ) /* 洗牌迴路 */
{
pos = rand() % 52; /* 亂數取值 0-51 */
if ( card[pos] == 0 ) /* 是否是未洗牌 */
{
push(pos); /* 存此張牌進堆疊 */
card[pos] = 1; /* 設定此張牌洗過 */
i++; /* 下一張牌 */
}
}
printf(" 1 2 3 4 \n");
printf(" ==========================\n");
for ( i = 0; i < 5; i++ ) /* 發牌給四人的迴路 */
{
temp = pop(); /* 取出堆疊資料 */
printf(" [%c%2d] ",temp / 13 + 3,temp % 13 + 1);
temp = pop(); /* 取出堆疊資料 */
printf(" [%c%2d] ",temp / 13 + 3,temp % 13 + 1);
temp = pop(); /* 取出堆疊資料 */
printf(" [%c%2d] ",temp / 13 + 3,temp % 13 + 1);
temp = pop(); /* 取出堆疊資料 */
printf(" [%c%2d] ",temp / 13 + 3,temp % 13 + 1);
printf("\n"); /* 換行 */
}
}
--
※發信站: 漢神小站 <bbs.ee.nsysu.edu.tw>
◆ From: 140.117.184.35