史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2006-06-13, 04:22 PM   #1
getter
管理員
 
getter 的頭像
榮譽勳章
UID - 6433
在線等級: 級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時
註冊日期: 2002-12-08
住址: 天線星球
文章: 8157
精華: 0
現金: 19955 金幣
資產: 765391 金幣
預設 程式 - 1A 2B 的遊戲

原文 http://www.slime2.com.tw/forums/showthread.php?t=176835

應該是版胞 hoio121 的作業 ...

我把我的程式重新寫過之後... 使其可玩性大增。

程式 + 原始碼 RS下載︰ http://rapidshare.de/files/23016544/3A3B.rar.html

程式上有問題的話再討論吧 ...

修正 第 10 開始,顯示 A B 值的錯誤

原始碼︰
PHP 語法:
/*
猜數字 1A2B
規則&條件:
1.先由電腦亂數決定 4 重複的位數。
2.讓玩家可以輸入猜測的數字。
3.判斷+顯示玩家的數字的 A B 率,A:位置,數值相等。B:僅數值相等。
4.可以按下 Q 鍵離開,按 R 鍵重新遊戲。
*/
#include <stdio.h>  /* 載入引導檔 stdio.h */ 
#include <math.h>   /* 載入引導檔 math.h */ 
#define S 20        /* 設定巨集 S 為 20 */ 
#define random(num) (rand() % (num))  /* 取亂數巨集 random(number)  */  
#define randomize() srand((unsigned)time(NULL)) /* 歸零亂數種子巨集 */  
#define clrscr() system("CLS")            /* 清除畫面巨集 */ 
#define pause() system("PAUSE")           /* 暫停畫面巨集 */  
#define swap_tmp(x,y) (temp=x,x=y,y=temp) /* 用 變數 做 AB 交換 */  
unsigned temp;  

char data_source[10] = ""/* PC 答案的來源 */ 
char npc[5] = "";          /* NPC 的答案 */
char user[6] = "";         /* Uesr 的答案 */
char inv[9] = "";         /* NPC: 0~3,Uesr: 4~7 */
char AB[3] = "";       /* 紀錄單次的 A,B 值的檢查結果*/
short list_a[S] = {0};       /* 表格 1 連續紀錄 User 的輸入數字 */
short list_b[S*2] = {0};   /* 表格 2 連續紀錄 User 輸入數字 A,B 值 */ 

int main(void)
{
int ijkr;
 
 
FILE *file1;                    /* 宣告檔案指標 */
 
 
logo();
  
 
restart:      /* 標籤起點 (配合 RePlay) 再玩一次 */  
 
 
start_default npcdata_source );  /* 起始開始資料 */
 
AB[2] = 0;  
 
clrer_1stinv ,AB );  /* 清除 1 次資料  */
 
clrer_listlist_alist_b ); /* 清除 memory_list */
 
0;
 while ( 
AB[2] != )       /* 條件為 4A,離開 while loop  */
       
{
        
nxit:  /* 標籤起點 (配合 RePlay) 繼續玩 */ 
                               
        
input_number user ); /* 輸入猜測數字 + 檢查 4 位數 + 有無重複 + 檢查 0 值 */
    
if ( user[0] == 'q' || user[0] == 'Q' 
        break; 
/* 按 Q 鍵,離開 while loop */
    
else if ( user[0] == 'r' || user[0] == 'R' )  /* 按 R 鍵,RESET */
            
{
         
print_RESET npc );                 /* 列印 YOU RESET */
         
puts("\n");
         
pause();                 
         
start_default npcdata_source );  /* 起始開始資料 */
                 
0;             /* 清除 while 計數器 */
                 
clrer_1stinv ,AB );  /* 清除 1 次資料  */
                 
clrer_listlist_alist_b ); /* 清除 memory_list */
                 
1;                 /* 紀錄按了 R 鍵 */ 
                 
continue;
            } 
            
     if ( 
)   /* 檢查是否有以猜過的數字組  */
         
for ( k++ )
               if ( 
atoiuser ) == list_a[k]  )
                  { 
              
puts("\n");
              
printf ("該數字組 %s 已數入過,請重新輸入",user);
                   
puts("\n");
              
pause();  
              goto 
nxit;
             }
     
        
strcat invnpc );   /* 資料組合 npc (配合 check_AB)  */
        
strcat invuser );  /* 資料組合 npc + user (配合 check_AB)  */ 
        
check_AB inv AB ); /* 檢查猜測數字的 A,B 值 */ 
      
      
memory );      /* 把遊戲的過程寫入至 memory list */      
        
print_setp userAB ); /* 列印遊戲過程 */
        
clrer_1stinv ,AB );  /* 清除 1 次資料  */

        
if ( == ( -) )   /* 步驟滿了遊戲結束,玩家算輸 */ 
           

        
AB[2] = 5;         /* 紀錄玩家算輸的狀態 */ 
        
display list_alist_b );  /* 顯示畫面 */    
        
puts("\n");
        
puts("\n");
        
print_LOSEnpc ); /* 列印 YOU LOSE */
        
break;
       } 
        else                   
/* 控制 list_array 的寫入位置  */
           

           
i++; 
            
j+=2
       }  

    }
        
 if ( 
AB[2] == 4)  /* YOU WIN 遊戲結束的處理 */ 
     
print_WINnpcuser ); /* 列印 YOU WIN */
 
 
if( RePlay(AB[2]) )  /* 是否再玩一次的判斷 */ 
    
if ( AB[2] >= )
        goto 
restart
    else 
        goto 
nxit;
 
 if ( 
AB[2] < )   /* YOU LOSE 遊戲結束的處理 */  
     
print_LOSEnpc ); /* 列印 YOU LOSE */
         
 
puts("\n程式結束\n"); 
 
 
pause();
}
/*----------------------------------------------------------------------------*/
/* 把logo 規則 */
int logo void )
{
 
clrscr();
 
puts("\n");
 
puts("\t\t\t 猜數字 1A 2B 小遊戲");
 
puts("\n");
 
puts("\t遊戲規則:");
 
puts("\n");
 
puts("\t1.輸入 1 ~ 9 不可重覆之 4 位數字的組合,如 1234、9876 等。");
 
puts("\t2.輸入後如有數字和位置與 NPC 相同者為 A,2A 為兩個數字和位置相同。");
 
puts("\t3.輸入後僅數字與 NPC 相同者為 B,2B 為兩個數字相同。");
 
puts("\t4.當輸入的數字全部為 4A 時,玩家勝利。而退出遊戲、重新遊戲,玩家失敗。");
 
puts("\t5.當畫面的表格子用完( 20 格)時,未達 4A 時,玩家失敗。");
 
puts("\n");
 
puts("\t getter 以 DEV-C 撰寫 ...,版權沒有,當機不究。");  
 
puts("\n"); 
 
pause();
}
/*----------------------------------------------------------------------------*/
/* 把遊戲的過程寫入至 memory list */
int memory )
{
 
list_a[i] = atoiuser ); /* 將每筆的猜測值寫入到 memory list_a */
 
AB[2] = AB[0];            /* 將每筆的 A 值寫入到 while 檢查器中 */
 
list_b[j] = AB[0];        /* 將每筆的 A 值寫入到 memory list_b */
 
list_b[j+1] = AB[1];      /* 將每筆的 B 值寫入到 memory list_b */
}
/*----------------------------------------------------------------------------*/
/* 列印 setp */
int print_setp char*user char*ABint i int r )
{
 
FILE *file1;                    /* 宣告檔案指標 */
 
file1=fopen("list.txt","a");  /* 將 file1 指標 = 開啟檔案, a 接著寫入 */
    
 
if( == )                    /* 當按下 R 鍵重來時 */
    
fprintf file1,"\n");
 if( 
== )                    /* 第一筆資時先寫入表頭項目(檔案) */ 
    
fprintf file1,"\n%4s\t%8s\t %s ","No.","Number","Check" ); 
 
fprintf file1,"\n %02d.\t%8s\t%dA,%dB"iuserAB[0], AB[1] );
 
fclosefile1 );                /* 關閉檔案 */   
}
/*----------------------------------------------------------------------------*/
/* 列印 YOU RESET */
int print_RESETchar*npc )
{
 
FILE *file1;                    /* 宣告檔案指標 */
 
printf("\n\t\t\tYOU LOSE,RESET GAME!!");
 
printf("\n公佈答案 : ");
 
display_ans npc );    
          
 
file1=fopen("list.txt","a");  /* 將 file1 指標 = 開啟檔案, a 接著寫入 */
 
fprintffile1,"\nYOU LOSE,RESET GAME!!");
 
fprintf file1,"\n公佈答案 : %s",npc);
 
fprintffile1,"\n--------------------\n"); 
 
fclosefile1 );              /* 關閉檔案 */   
}
/*----------------------------------------------------------------------------*/
/* 列印 YOU WIN */
int print_WINchar*npcchar*user )
{
 
FILE *file1;                    /* 宣告檔案指標 */
 
display list_alist_b );  /* 顯示畫面 */    
 
printf("\n\t\t\tYOU WIN!!\n");
 
printf("公佈答案 : ");
 
display_ans npc );
 
printf("你的答案 : ");
 
display_ans user );
 
printf("\n");

 
file1=fopen("list.txt","a");  /* 將 file1 指標 = 開啟檔案, a 接著寫入 */
 
fprintf(file1,"\nYOU WIN!!\n");
 
fprintf(file1,"公佈答案 : %s\n",npc);
 
fprintf(file1,"你的答案 : %s\n",user);
 
fprintffile1,"\n--------------------\n"); 
 
fclosefile1 );  
}
/*----------------------------------------------------------------------------*/
/* 列印 YOU LOSE */
int print_LOSEchar*npc )
{
 
FILE *file1;                    /* 宣告檔案指標 */
 
printf("\n\t\t\tYOU LOSE!!");
 
printf("\n公佈答案 : ");
 
display_ans npc );
   
 
file1=fopen("list.txt","a");  /* 將 file1 指標 = 開啟檔案, a 接著寫入 */
 
fprintf(file1,"\nYOU LOSE!!\n");
 
fprintf(file1,"公佈答案 : %s\n",npc);
 
fprintffile1,"\n--------------------\n"); 
 
fclosefile1 );              /* 關閉檔案 */ 
}    
/*----------------------------------------------------------------------------*/
/* 寫入來源資料的 1 ~ 9 */
int data_default char*data )
{
 
int i;
 for ( 
09i++ )
       
data [i] = 49
 
data[9] = '\0'/* 補上字串結尾 */         
 
randomize();     /* 亂數種子表歸零 */  
}
/*----------------------------------------------------------------------------*/
/* 來源資料交錯 ABCD => DBCA (配合 rand_source) */
int data_ins char*data 
{
 
int i;  
 for ( 
04+= )
      
swap_tmp data[i], data[8-i] );
}
/*----------------------------------------------------------------------------*/
/* 來源資料亂數交換,打亂源有次序 */
int rand_source char*data )
{
 
int abi;
 
int rad_[2] = {0};
 for ( 
020 i++ )  /* 亂數交換 20 次 */ 
     
{
      
rad_[0] = random (9);
      
rad_[1] = random (9);
      
data_ins data );    
      
swap_tmp datarad_[0] ], datarad_[1] ] );
     }
}
/*----------------------------------------------------------------------------*/
/* 從來源資料中的取 4 位數 為 NPC 數值的方法 */
int in_npc char*destinationchar*source  
{
 
int ijk;               
 if ( ( 
random (2) + ) == /* 隨機決定取值的方法 1 或 2 */ 
    

     for ( 
04i++ )  /* 取 NPC 數值的方法 1: 亂數抓取法  */ 
         
{
      
random (9-i);
      
destination[i] = source[j];  /* 亂數取值  */ 
      
source[j] = ' ';             /* 亂數取值後歸 ' ' */ 
      
move_data source );        /* 整理來源的 data */ 
         

    }
 else                           
/* 取 NPC 數值的方法 2: 亂數連號抓取法 */  
    
{
     
random (9);
     if ( 
)  /* 亂數值小於 5 時,取連續 4 位數  */ 
    
{
     for ( 
04i++ )
              
destination[i] = source[i+j];
    } 
     else          
/* 亂數值大於 5 時,取連續 4 位數  */  
        

     for ( 
04i++ )
         {
          if ( 

              
destination[i] = source[i+j-9]; 
          else 
          
destination[i] = source[i+j];  
             }
        }
    }  
 
destination[4] = '\0';
}
/*----------------------------------------------------------------------------*/
/* 來源資料中的特定的值記號的空值往後移動 (配合 in_npc 使用) */
int move_data char*data 
{
 
int ij;
 for ( 
09i++ )
      {
      if ( 
data[i] == ' ' )  /* 以 ACSII 碼空白字元為整理對象 */ 
          
for ( 0j++ )
               
swap_tmp data[j+i] , data[j+i+1] );               
     } 
}
/*----------------------------------------------------------------------------*/ 
/* 起始開始資料 */
int start_default char*npcchar*data_source )
{
 
data_default data_source ); /* 寫入來源資料的 1 ~ 9 */
 
rand_source data_source );  /* 來源資料亂數交換,打亂源有次序 */ 
 
in_npc npcdata_source );  /* 從來源資料中的取 4 位數 為 NPC 數值的方法 */
}
/*----------------------------------------------------------------------------*/
/* 顯示畫面 */
int display short*tab1short*tab2 )
{
 
int ijk;
 
2;
 
clrscr();
 
printf ("%4s\t%8s\t %s ","No.","4_Number","Check" );
 
printf ("\t%4s\t%4s\t%8s\t %s ","▕","No.","4_Number","Check" );
 for ( 
0ki++ )      
      { 
      
printf ("\n %02d."i+1);
       if ( 
tab1[i] != )
         { 
          
printf ("\t%8d \t %dA,%dB"tab1[i], tab2[j], tab2[j+1] );
          if ( 
tab1[i+k] != )
              
printf ("\t%4s\t %02d.\t%8d \t %dA,%dB",
                      
"▕"i+k+1tab1[k+i], tab2[S+j], tab2[S+j+1] );    
          else 
                
printf ("\t%4s\t %02d.","▕"i+k+1);
         }
      else 
        
printf ("\t%8s \t %s %s\t%4s\t %02d.","","","","▕"i+k+1);        
     
     
j+=2;
     } 
 
 
puts("\n\n按 R 鍵重新遊戲;按 Q 鍵離開\n");
 
printf("請輸入猜測數字 4 位數,1 ~ 9 不可重複: "); 
}
/*----------------------------------------------------------------------------*/
/* 資料顯示 NPC 或 uesr 的答案 */
int display_ans char*data )
{
 
int i;
 for ( 
04i++ )
      
printf ("%c "data[i]);
 
puts(" "); 
}
/*----------------------------------------------------------------------------*/
/* 輸入猜測數字 + 檢查 4 位數 + 有無重複 + 檢查 0 值 */
int input_number char*destination )
{
 
char input[10] = "";
 
int number 0;
 
int ij;
 while( 
)
   { 
    
reinkny
    
display list_alist_b );                 /* 顯示畫面 */       
    
scanf("%s",&input);
    
    if ( 
input[0] == 'q' input[0] == 'Q' /* 檢查是否按下 Q 鍵中斷 */
         
input[0] == 'r' input[0] == 'R' /* 檢查是否按下 R 鍵中斷 */ 
       
{
        
destination[0] = input[0];           /* 回傳中斷的按鍵值 */ 
        
destination[1] = '\0';
        return 
0;
        
/* return input[0]; */ 
       
}
         
    
number atoi input );
    if ( 
number 999 number 10000 /* 檢查 4 位數 */ 
       
{
           for ( 
0i++ )  
               { 
         if ( 
input[i] == '0' )      /* 檢查 0 值 */
                

         
puts("\n");
         
printf ("發現 0 值,請重新輸入,");
         
pause();
         goto 
reinkny;
        }
             for ( 
04j++ ) 
                  if ( 
!= )
              if ( 
input[i] == input[j] ) /* 有無重複 */ 
                 
{           
                  
puts("\n");
              
printf ("發現重複,請重新輸入,");
                          
pause();
                  goto 
reinkny;
                 }
             
destination[i] = input[i];                 
            }                 
        break;
       }                 
    else 
       { 
        
puts("\n");
      
printf ("位數不符合,請重新輸入,");
    
pause();    
       } 
  }
 
destination[4] = '\0';
}
/*----------------------------------------------------------------------------*/
/* 檢查猜測數字的 A,B 值 */
int check_AB char*invchar*AB )
{
 
int ij;
 for ( 
04i++ )
      if ( 
inv[i] == inv[i+4] ) /* 檢查 A */
          
AB[0]++;
      else                     
/* 檢查 B */
          
for ( 0j++ )
           if ( 
inv[i] == inv[j+4] )
                   
AB[1]++; 
}

/*----------------------------------------------------------------------------*/ 
/* 清除 1 次資料  */
int clrer_1st char*invchar*AB )
{
 
AB[0]= 0;
 
AB[1]= 0;
 
strcpy inv,"" );

/*----------------------------------------------------------------------------*/ 
/* 清除 memory_list */
int clrer_list char*list_achar*list_b )
{
 
int i;
 for ( 
0S*2i++ )
     { 
      if ( 
)
          
list_a [i] = 0;         
      
list_b [i] = 0
     } 

/*----------------------------------------------------------------------------*/ 
/* 再玩一次 */
int RePlay )
{
 
char input;
 if ( 
>= )
     
printf("要在玩一次嗎(Y/N) ? ");
     
 else
     
printf("\n要退出遊戲了嗎(Y/N) ? ");
     
 while(
1)
 {
  
input getchar();
  if ( 
input == 'y' input == 'Y' )
      if ( 
>= )
          return 
1;
      else 
          return 
0
      
  else if ( 
input == 'n' input == 'N' )
           if ( 
>= )
               return 
0;
           else 
               return 
1; ; 
      
 } 
}
/*----------------------------------------------------------------------------*/ 

此帖於 2006-06-14 03:49 PM 被 getter 編輯.
__________________
在「專業主討論區」中的問題解決後,要記得按一下 http://forum.slime.com.tw/images/stamps/is_solved.gif 按鈕喔,
這是一種禮貌動作。

一樣是在「專業主討論區」中發問,不管問題解決與否,都要回應別人的回答文喔。
不然搞 [斷頭文],只看不回應,下次被別人列入黑名單就不要怪人喔。

天線寶寶說再見啦~ ... 天線寶寶說再見啦~

迪西:「再見~ 再見~」

Otaku Culture Party 關心您 ...
getter 目前離線  
送花文章: 37855, 收花文章: 6441 篇, 收花: 26052 次
回覆時引用此帖
發文 回覆



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 05:43 AM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2025, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1