微剋多資訊

 找回密碼
 註冊

Login

Login

搜索
回覆 1則 瀏覽 912篇

小型CMD遊樂場 Alphe 版

該用戶從未簽到

發表於 2012-12-5 23:33 | 顯示全部樓層 |閱讀模式
這是一個遊樂場的小遊戲
未來會再遊戲增加
有些程式碼是之前寫的
演算法不太好 請多多包涵哦!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. void a();
  5. void b();
  6. void shuffling(int [], int);
  7. void printCard(int);
  8. int main(){
  9.   srand((unsigned) time(NULL));
  10.   int i;
  11.   printf("歡迎光臨小遊戲天地!\n");
  12.     printf("    (1) 比大小\n");
  13.     printf("    (2) 終極密碼\n");
  14.     printf("    (0) 結束\n");
  15.   printf("您想玩什麼遊戲?");
  16.   scanf("%d",&i);
  17.   if(i==1){
  18.     a();
  19.     fflush(stdin);
  20.     main();
  21.   }else if(i==2){
  22.     b();
  23.     fflush(stdin);
  24.     main();
  25.   }else{
  26.     system("PAUSE");
  27.     return 0;
  28.   }
  29. }
  30. void a(){
  31.   int i=1,k=0,m=0,c,p;
  32.   int card[52]={0};
  33.   printf("您要 (1) 比大 (2) 比小 (0) 結束遊戲?");
  34.    
  35.   scanf("%d",&i);
  36.   while(m==k){
  37.     srand((unsigned) time(NULL));  
  38.     shuffling(card,52);
  39.     k=rand()%52;
  40.     c=card[k];
  41.     m=rand()%52;
  42.     p=card[m];
  43.   }
  44.     printf("您是抽到");
  45.     printCard(p);
  46.     printf("電腦抽到");
  47.     printCard(c);
  48.   if(i==1){
  49.     if((c%4>p%4&&c==p)||c%13>p%13){
  50.       printf("您輸了!\n");
  51.     }else{
  52.       printf("您贏了!\n");
  53.     }
  54.   }else if(i==2){
  55.     if((c%4<p%4&&c==p)||c%13<p%13){
  56.       printf("您輸了!\n");
  57.     }else{
  58.       printf("您贏了!\n");
  59.     }
  60.   }
  61.   if(i!=0){
  62.     a();
  63.   }

  64. }
  65. void b(){
  66.   srand((unsigned int)time(NULL));
  67.   int a,n,max=100,min=1;
  68.   a=rand()%100+1;
  69.   printf("猜1~100之間");
  70.   
  71.   while(scanf("%d",&n)){
  72.     if(n>a)
  73.     {
  74.       max=n;
  75.       printf("猜%d~%d之間:",min,max);
  76.       
  77.     }else if(n<a)
  78.     {
  79.       min=n;
  80.       printf("猜%d~%d之間:",min,max);
  81.       
  82.     }else
  83.     {
  84.       printf("答對了!\n");
  85.       break;
  86.     }
  87.   }
  88. }
  89. void shuffling(int a[], int n){
  90.   srand( (unsigned)time(NULL) );
  91.   int t,k;
  92.   for(k=0;k<n;k++){
  93.     a[k]=k;
  94.   }
  95.   while(n>1){
  96.     k=rand()%n;
  97.     t=a[k];
  98.     a[k]=a[n-1];
  99.     a[n-1]=t;
  100.     n--;
  101.   }
  102. }
  103. void printCard(int n){
  104.   char *suitSymbol[4] = {"梅花","方塊","紅心","黑桃"};
  105.   if(n%4==0){
  106.     if(n%13==12)
  107.     {printf("%sA ",suitSymbol[0]);}
  108.     else if(n%13==9)
  109.     {printf("%sJ ",suitSymbol[0]);}
  110.     else if(n%13==10)
  111.     {printf("%sQ ",suitSymbol[0]);}
  112.     else if(n%13==11)
  113.     {printf("%sK ",suitSymbol[0]);}
  114.     else{printf("%s%d ",suitSymbol[0],n%13+2);}
  115.   }
  116.   else if(n%4==1){
  117.     if(n%13==12)
  118.     {printf("%sA ",suitSymbol[1]);}
  119.     else if(n%13==9)
  120.     {printf("%sJ ",suitSymbol[1]);}
  121.     else if(n%13==10)
  122.     {printf("%sQ ",suitSymbol[1]);}
  123.     else if(n%13==11)
  124.     {printf("%sK ",suitSymbol[1]);}
  125.     else{printf("%s%d ",suitSymbol[1],n%13+2);}
  126.   }
  127.   else if(n%4==2){
  128.     if(n%13==12)
  129.     {printf("%sA ",suitSymbol[2]);}
  130.     else if(n%13==9)
  131.     {printf("%sJ ",suitSymbol[2]);}
  132.     else if(n%13==10)
  133.     {printf("%sQ ",suitSymbol[2]);}
  134.     else if(n%13==11)
  135.     {printf("%sK ",suitSymbol[2]);}
  136.     else{printf("%s%d ",suitSymbol[2],n%13+2);}
  137.   }
  138.   else if(n%4==3){
  139.     if(n%13==12)
  140.     {printf("%sA ",suitSymbol[3]);}
  141.     else if(n%13==9)
  142.     {printf("%sJ ",suitSymbol[3]);}
  143.     else if(n%13==10)
  144.     {printf("%sQ ",suitSymbol[3]);}
  145.     else if(n%13==11)
  146.     {printf("%sK ",suitSymbol[3]);}
  147.     else{printf("%s%d ",suitSymbol[3],n%13+2);}
  148.   }
  149. }
複製代碼

該用戶從未簽到

發表於 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, 2016-12-9 07:57

Discuz! X

© 2009-2016 Microduo

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