fork(2) download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. #define N 52
  6. #define TIMES 100 // 遊戲戰績儲存次數上限常數
  7. #define BUF_SIZE 3
  8.  
  9. /* run this program using the console pauser or add your own getch, system("pause") or input loop */
  10.  
  11.  
  12. const char flower_table[4] = { '\5', '\4', '\3', '\6' }; // ascii code, \5 \4 \3 \6 分別代表梅花、方塊、紅心、黑桃
  13. const char number_table[13][BUF_SIZE] = {
  14. " A", " 2", " 3", " 4", " 5", " 6",
  15. " 7", " 8", " 9", "10", " J", " Q", " K" };
  16.  
  17. /* ※花色與數字的決定方法
  18. for (i = 0; i!=52; ++i){
  19. flower = i % 4; // 花色, 0~3
  20. number = i / 4; // 數字, 0~12
  21. }
  22. */
  23.  
  24. typedef struct handle Handle;
  25. struct handle{
  26. Handle *node;
  27. int card; // 牌值
  28. int flower; // 計算牌的花色
  29. int number; // 計算牌的點數
  30. float point; // 這一局的點數
  31. float fnumber; // 這張牌的點數
  32. int cardnum; // 手牌數量
  33. };
  34.  
  35.  
  36. typedef struct player Player;
  37. struct player{
  38. char record[TIMES]; // 戰績
  39. int record_flag; // 戰績陣列索引
  40. Handle hand; // struct 手牌
  41. int Case; // Case 1: 玩家要牌 遊戲結束
  42. };
  43.  
  44.  
  45.  
  46. // SWAP 交換
  47.  
  48. void Swap(int *a, int *b){
  49.  
  50. // printf("***** Function Swap Begin *****\n\n");
  51.  
  52. int temp;
  53.  
  54. temp = *a;
  55. *a = *b;
  56. *b = temp;
  57.  
  58. return;
  59.  
  60. // printf("***** Function Swap End *****\n\n");
  61.  
  62. }
  63.  
  64. // Shuttle 洗牌
  65. void Shuttle(int *array){
  66.  
  67. // printf("***** Function Shttle Begin *****\n\n");
  68.  
  69. //BLACK_RED;
  70. printf("Creat New Deck And Shuttle !\n\n");
  71. ////BLACK_WHITE;
  72.  
  73. int i, pos;
  74. srand((unsigned)time(NULL));
  75. rand(); // 先抽一次亂數 打亂亂數序
  76.  
  77.  
  78. for (i = 0; i<52; i++){
  79.  
  80. array[i] = i + 1;
  81.  
  82. }
  83.  
  84.  
  85. for (i = 0; i != N; ++i){
  86. // 取出第pos張牌
  87. pos = (int)(N*(double)rand() / RAND_MAX);
  88. // 交換第i張與第pos張牌
  89. Swap(&array[i], &array[pos]);
  90. }
  91.  
  92. // printf("***** Function Shttle End *****\n\n");
  93.  
  94. return;
  95.  
  96. }
  97.  
  98.  
  99. void Deal(int *array, Player *a, int *flag){
  100.  
  101. //BLACK_RED;
  102. printf("Deal !\n\n");
  103. ////BLACK_WHITE;
  104. a->hand.card = array[*flag];
  105. ++*flag;
  106. a->hand.flower = a->hand.card % 4;
  107. a->hand.number = a->hand.card / 4;
  108. a->hand.fnumber = a->hand.number;
  109.  
  110. // printf("test card number : %d \n\n",a->hand.card);
  111.  
  112. // printf("Your card is %c%s \n\n",flower_table[flower],number_table[number]);
  113.  
  114.  
  115. }
  116.  
  117.  
  118. // Cardnum 算手牌數量
  119.  
  120. void Cardnum(int *cardnum){
  121.  
  122. *cardnum = *cardnum + 1;
  123.  
  124. }
  125.  
  126.  
  127. // Point 算手牌點數
  128.  
  129. void Point(float *fnumber, float *sumpoint){
  130.  
  131. if (*fnumber <10.0 && *fnumber >0.0){
  132. *fnumber = *fnumber + 1.0;
  133. *sumpoint = *sumpoint + *fnumber;
  134. }
  135. else if (*fnumber == 0.0){
  136. *fnumber = 1.0;
  137. *sumpoint = *sumpoint + *fnumber;
  138. }
  139. else if (*fnumber >= 10.0 && *fnumber <= 12.0){
  140. *fnumber = 0.5;
  141. *sumpoint = *sumpoint + *fnumber;
  142. }
  143.  
  144. }
  145.  
  146. // Watchdeal 得牌顯示
  147.  
  148. void Watchdeal(Player *a){
  149.  
  150. //// BLACK_CYAN;
  151. printf("Your card is %c%s \n\n", flower_table[a->hand.flower], number_table[a->hand.number]);
  152. Point(&a->hand.fnumber, &a->hand.point);
  153. printf("POINT Now: %.1f\n\n", a->hand.point);
  154. Cardnum(&a->hand.cardnum);
  155. printf("Card Num Now: %d\n\n\n\n", a->hand.cardnum);
  156. ////BLACK_WHITE;
  157.  
  158. }
  159.  
  160.  
  161. // Win Lose 輸贏
  162.  
  163. void Lose(Player *A, Player *B){
  164.  
  165. A->record[A->record_flag] = 'L';
  166. A->record_flag++;
  167. B->record[B->record_flag] = 'W';
  168. B->record_flag++;
  169.  
  170. }
  171.  
  172. void Win(Player *A, Player *B){
  173.  
  174. B->record[A->record_flag] = 'L';
  175. B->record_flag++;
  176. A->record[B->record_flag] = 'W';
  177. A->record_flag++;
  178.  
  179. }
  180.  
  181.  
  182. void Getcard(Player *A, Player *B, int card[], int *flag){
  183.  
  184. char buffer[2];
  185. char temp = '0';
  186. printf("%p\n", &A->Case);
  187.  
  188. while (1){
  189.  
  190. // 詢問是否要牌
  191. ////BLACK_YELLOW;
  192. printf("Do you want to get card ? ( max card is 5 )\n\n");
  193. ////BLACK_YELLOW;
  194. printf("Type 1 for YES , 2 for NO .\n\n");
  195. ////BLACK_WHITE;
  196.  
  197. scanf(" %c", &temp);
  198.  
  199. // 防呆機制
  200. if (temp != '1' && temp != '2'){
  201.  
  202. //BLACK_RED;
  203. printf("Your Type is wrong ! Retype Please.\n");
  204. ////BLACK_WHITE;
  205. scanf(" %c", &temp);
  206. printf("\n");
  207.  
  208. }
  209.  
  210. // 不要牌
  211. if (temp == '2'){
  212. ////BLACK_YELLOW;
  213. printf("You Do Not Get Card Anymore !\n");
  214. //// BLACK_CYAN;
  215. printf("Your End Point : %.1f\n\n\n\n", A->hand.point);
  216. ////BLACK_WHITE;
  217. return;
  218. }
  219.  
  220.  
  221. if (temp == '1'){
  222. Deal(card, A, flag);
  223. Watchdeal(A);
  224. if (A->hand.point >10.5){
  225. //BLACK_RED;
  226. printf("BOOM ! YOU LOSE !\n\n");
  227. ////BLACK_WHITE;
  228. Lose(A, B);
  229. A->Case = 1;
  230. return;
  231. }
  232. if (A->hand.cardnum == 5){
  233. //BLACK_RED;
  234. printf("FIVE CARD ! YOU WIN !\n\n");
  235. ////BLACK_WHITE;
  236. Win(A, B);
  237. A->Case = 1;
  238. return;
  239. }
  240. if (A->hand.point == 10.5){
  241. //BLACK_RED;
  242. printf("10.5 ! YOU WIN !\n\n");
  243. ////BLACK_WHITE;
  244. Win(A, B);
  245. A->Case = 1;
  246. return;
  247. }
  248. }
  249.  
  250. }
  251.  
  252. }
  253.  
  254. void Cgetcard(Player *A, Player *B, int card[], int *flag){
  255.  
  256. //BLACK_PURPLE;
  257. printf("Computer's First Card is %c%s\n\n", flower_table[B->hand.flower], number_table[B->hand.number]);
  258. printf("Coumputer's Point : %.1f\n\n", B->hand.point);
  259.  
  260. }
  261.  
  262.  
  263.  
  264. void Display(){
  265.  
  266. ////BLACK_YELLOW;
  267. printf("\nGame Start !\n\n");
  268. ////BLACK_WHITE;
  269.  
  270. // 建立牌組
  271. int card[52] = {};
  272. int flag = 0; // 牌組堆疊用旗標
  273.  
  274. // 洗牌
  275. Shuttle(card);
  276.  
  277. // 建立Player
  278. Player A;
  279. A.hand.cardnum = 0;
  280. A.hand.fnumber = 0.0;
  281. A.hand.point = 0.0;
  282. A.record_flag = 0;
  283. A.Case = 0;
  284.  
  285. int i = 0;
  286. for (i = 0; i<TIMES; i++){
  287. A.record[i] = '\0';
  288. }
  289.  
  290. Player B;
  291. B.hand.cardnum = 0;
  292. B.hand.fnumber = 0.0;
  293. B.hand.point = 0.0;
  294. B.record_flag = 0;
  295. B.Case = 0;
  296.  
  297. for (i = 0; i<TIMES; i++){
  298. B.record[i] = '\0';
  299. }
  300.  
  301.  
  302. // 第一次發牌 (玩家)
  303. //BLACK_YELLOW;
  304. printf("You Get First.\n\n");
  305. //BLACK_WHITE;
  306.  
  307. Deal(card, &A, &flag);
  308.  
  309. // BLACK_CYAN;
  310. printf("Your card is %c%s \n\n", flower_table[A.hand.flower], number_table[A.hand.number]);
  311. Point(&A.hand.fnumber, &A.hand.point);
  312. printf("POINT: %.1f\n\n", A.hand.point);
  313. Cardnum(&A.hand.cardnum);
  314. printf("Card Num Now: %d\n\n", A.hand.cardnum);
  315. //BLACK_WHITE;
  316.  
  317. // 第一次發牌 (電腦)
  318. //BLACK_YELLOW;
  319. printf("Computer Get Now.\n\n");
  320. //BLACK_WHITE;
  321.  
  322. Deal(card, &B, &flag);
  323. Cardnum(&B.hand.cardnum);
  324. printf("\n\n");
  325.  
  326. // printf("Computer's card is %5c%s\n\n",flower_table[B.hand.flower],number_table[B.hand.number]); // 電腦的點數(按遊戲規則不顯示)
  327. Point(&B.hand.fnumber, &B.hand.point);
  328.  
  329. printf("%p\n", &A.Case);
  330. // 要牌(玩家)
  331. Getcard(&A, &B, card, &flag);
  332. printf("%p\n", &A.Case);
  333. if (A.Case == 1) return; // 玩家點數爆 & 過五關 & 10半 結束遊戲
  334.  
  335. // 要牌(電腦)
  336. Cgetcard(&A, &B, card, &flag);
  337.  
  338.  
  339. }
  340.  
  341.  
  342.  
  343.  
  344. int main(int argc, char *argv[]) {
  345.  
  346. char p = 0;
  347. // BLACK_BLUE;
  348. printf("Program Start !\n\n");
  349. //BLACK_WHITE;
  350. do{
  351. Display();
  352. //BLACK_YELLOW;
  353. printf("Do you want to play again ?\n(1 for YES 2 for NO.)\n\n");
  354. //BLACK_WHITE;
  355. scanf(" %c", &p);
  356. while (p != '1' && p != '2'){
  357. //BLACK_YELLOW;
  358. printf("Type Wrong ! Retype !\n\n");
  359. //BLACK_WHITE;
  360. scanf(" %c", &p);
  361. }
  362. } while (p == '1');
  363.  
  364. if (p == '2'){
  365. // BLACK_BLUE;
  366. printf("\nProgram End.\n\n");
  367. //BLACK_WHITE;
  368. }
  369.  
  370. return 0;
  371. }
Success #stdin #stdout 0s 2256KB
stdin
1
1
2
2
stdout
Program Start !


Game Start !

Creat New Deck And Shuttle !

You Get First.

Deal !

Your card is 10 

POINT: 10.0

Card Num Now: 1

Computer Get Now.

Deal !



0xbf901fc4
0xbf901fc4
Do you want to get card ?  ( max card is 5 )

Type 1 for YES , 2 for NO .

Deal !

Your card is  9 

POINT Now: 19.0

Card Num Now: 2



BOOM ! YOU LOSE !

0xbf901fc4
Do you want to play again ?
(1 for YES 2 for NO.)


Game Start !

Creat New Deck And Shuttle !

You Get First.

Deal !

Your card is 10 

POINT: 10.0

Card Num Now: 1

Computer Get Now.

Deal !



0xbf901fc4
0xbf901fc4
Do you want to get card ?  ( max card is 5 )

Type 1 for YES , 2 for NO .

You Do Not Get Card Anymore !
Your End Point : 10.0



0xbf901fc4
Computer's First Card is  Q

Coumputer's Point : 0.5

Do you want to play again ?
(1 for YES 2 for NO.)


Program End.