微剋多資訊

 找回密碼
 註冊

Sign in with google

Google帳號登入

搜索
回覆 0則 瀏覽 17295篇
Line

小型CMD遊樂場 Alphe 版

該用戶從未簽到

升級   100%

主題
發表於 2012-12-7 07:36 | 顯示全部樓層
本帖最後由 edisonx 於 2012-12-7 07:47 編輯

沒細看,不過很明顯有些地方可以化繁為簡。

  1. void printCard(int n){
  2.   char *suitSymbol[4] = {"梅花","方塊","紅心","黑桃"};
  3.   if(n%4==0){
  4.     if(n%13==12)
  5.     {printf("%sA ",suitSymbol[0]);}
  6.     else if(n%13==9)
  7.     {printf("%sJ ",suitSymbol[0]);}
  8.     else if(n%13==10)
  9.     {printf("%sQ ",suitSymbol[0]);}
  10.     else if(n%13==11)
  11.     {printf("%sK ",suitSymbol[0]);}
  12.     else{printf("%s%d ",suitSymbol[0],n%13+2);}
  13.   }
  14.   else if(n%4==1){
  15.     if(n%13==12)
  16.     {printf("%sA ",suitSymbol[1]);}
  17.     else if(n%13==9)
  18.     {printf("%sJ ",suitSymbol[1]);}
  19.     else if(n%13==10)
  20.     {printf("%sQ ",suitSymbol[1]);}
  21.     else if(n%13==11)
  22.     {printf("%sK ",suitSymbol[1]);}
  23.     else{printf("%s%d ",suitSymbol[1],n%13+2);}
  24.   }
  25.   else if(n%4==2){
  26.     if(n%13==12)
  27.     {printf("%sA ",suitSymbol[2]);}
  28.     else if(n%13==9)
  29.     {printf("%sJ ",suitSymbol[2]);}
  30.     else if(n%13==10)
  31.     {printf("%sQ ",suitSymbol[2]);}
  32.     else if(n%13==11)
  33.     {printf("%sK ",suitSymbol[2]);}
  34.     else{printf("%s%d ",suitSymbol[2],n%13+2);}
  35.   }
  36.   else if(n%4==3){
  37.     if(n%13==12)
  38.     {printf("%sA ",suitSymbol[3]);}
  39.     else if(n%13==9)
  40.     {printf("%sJ ",suitSymbol[3]);}
  41.     else if(n%13==10)
  42.     {printf("%sQ ",suitSymbol[3]);}
  43.     else if(n%13==11)
  44.     {printf("%sK ",suitSymbol[3]);}
  45.     else{printf("%s%d ",suitSymbol[3],n%13+2);}
  46.   }
  47. }
複製代碼
我不確定你的 n<----> 牌面對應是怎樣,但若只是要單純的輸出,其實有更方便的方法。

  1. #include <stdio.h>

  2. void printCard(int n)
  3. {
  4.      static const char   SuitSymbol[4] = {5,4,6,3}; // 去查 ASCII-Code
  5.      static const char * NumSymbol[13] = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};     
  6.      printf("%c%2s ",SuitSymbol[n/13], NumSymbol[n%13]);
  7. }

  8. int main()
  9. {
  10.     int i;
  11.     for(i=0; i<52; ++i){
  12.         if(i%13==0)  puts("");
  13.         printCard(i);
  14.     }   
  15.     getchar();
  16.     return 0;
  17. }
複製代碼
上面這是一種對照方式,以你的問題來講反而這種方式還不是較佳的對照。

試想一下,如果有種編碼模式,對應如下

黑桃 K --> 51 , 紅心 K --> 50 , 磚塊 K --> 49 , 梅花 K --> 48
黑桃 Q --> 47 , 紅心 Q --> 46 , 磚塊 Q --> 45 , 梅花 Q --> 44
....
黑桃 A --> 3+52=55 , 紅心 A ---> 2 + 52 = 54, 磚塊 A---> 1 + 52 = 53 , 梅花 A---->  0 + 52 = 52

大小和顯示是一瞬間結束的事,剩下的不明講,留著細思。


另外 srand((unsigned int)time(NULL));,這個不要常用,正常而言一份程式在「初始化」的時候做一次就行了。你可以試試下面這段 code

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>

  4. int main()
  5. {
  6.     int i;
  7.    
  8.     srand( (unsigned) time(NULL) );
  9.     for(i=0; i<10; ++i) printf("%d ", rand());
  10.     puts("");
  11.    
  12.     srand( (unsigned) time(NULL) );
  13.     for(i=0; i<10; ++i) printf("%d ", rand());
  14.     getchar();
  15.    
  16.     return 0;
  17. }
複製代碼
會發現亂數序列一樣的機率非常非常高,原理我就不講了,總之盡可能在一份程式裡面, srand 只用一次,除了少數例外之情況與特定編譯器除外。

使用道具

您需要登入後才可以回帖 登入 | 註冊

本版積分規則

小黑屋|Archiver|微剋多資訊(MicroDuo)

GMT+8, 2024-6-9 04:06

Discuz! X

© 2009-2023 Microduo

快速回覆 返回頂部 返回列表