精華區beta C_and_CPP 關於我們 聯絡資訊
※ 引述《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