主題: 1A 2B 的遊戲
查看單個文章
舊 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 i, j, k, r;
 
 
FILE *file1;                    /* 宣告檔案指標 */
 
 
logo();
  
 
restart:      /* 標籤起點 (配合 RePlay) 再玩一次 */  
 
 
start_default ( npc, data_source );  /* 起始開始資料 */
 
AB[2] = 0;  
 
clrer_1st( inv ,AB );  /* 清除 1 次資料  */
 
clrer_list( list_a, list_b ); /* 清除 memory_list */
 
i = j = r = 0;
 while ( 
AB[2] != 4 )       /* 條件為 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 ( npc, data_source );  /* 起始開始資料 */
                 
i = j = 0;             /* 清除 while 計數器 */
                 
clrer_1st( inv ,AB );  /* 清除 1 次資料  */
                 
clrer_list( list_a, list_b ); /* 清除 memory_list */
                 
r = 1;                 /* 紀錄按了 R 鍵 */ 
                 
continue;
            } 
            
     if ( 
i > 0 )   /* 檢查是否有以猜過的數字組  */
         
for ( k = 0 ; k < i ; k++ )
               if ( 
atoi( user ) == list_a[k]  )
                  { 
              
puts("\n");
              
printf ("該數字組 %s 已數入過,請重新輸入",user);
                   
puts("\n");
              
pause();  
              goto 
nxit;
             }
     
        
strcat ( inv, npc );   /* 資料組合 npc (配合 check_AB)  */
        
strcat ( inv, user );  /* 資料組合 npc + user (配合 check_AB)  */ 
        
check_AB ( inv , AB ); /* 檢查猜測數字的 A,B 值 */ 
      
      
memory ( i , j );      /* 把遊戲的過程寫入至 memory list */      
        
print_setp ( user, AB , i , r ); /* 列印遊戲過程 */
        
clrer_1st( inv ,AB );  /* 清除 1 次資料  */

        
if ( i == ( S -1 ) )   /* 步驟滿了遊戲結束,玩家算輸 */ 
           
{ 
        
AB[2] = 5;         /* 紀錄玩家算輸的狀態 */ 
        
display ( list_a, list_b );  /* 顯示畫面 */    
        
puts("\n");
        
puts("\n");
        
print_LOSE( npc ); /* 列印 YOU LOSE */
        
break;
       } 
        else                   
/* 控制 list_array 的寫入位置  */
           
{ 
           
i++; 
            
j+=2; 
       }  

    }
        
 if ( 
AB[2] == 4)  /* YOU WIN 遊戲結束的處理 */ 
     
print_WIN( npc, user ); /* 列印 YOU WIN */
 
 
if( RePlay(AB[2]) )  /* 是否再玩一次的判斷 */ 
    
if ( AB[2] >= 4 )
        goto 
restart; 
    else 
        goto 
nxit;
 
 if ( 
AB[2] < 4 )   /* YOU LOSE 遊戲結束的處理 */  
     
print_LOSE( npc ); /* 列印 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 ( i , j )
{
 
list_a[i] = atoi( user ); /* 將每筆的猜測值寫入到 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*AB, int i , int r )
{
 
FILE *file1;                    /* 宣告檔案指標 */
 
file1=fopen("list.txt","a");  /* 將 file1 指標 = 開啟檔案, a 接著寫入 */
    
 
if( r == 1 )                    /* 當按下 R 鍵重來時 */
    
fprintf ( file1,"\n");
 if( 
i == 0 )                    /* 第一筆資時先寫入表頭項目(檔案) */ 
    
fprintf ( file1,"\n%4s\t%8s\t %s ","No.","Number","Check" ); 
 
fprintf ( file1,"\n %02d.\t%8s\t%dA,%dB", i, user, AB[0], AB[1] );
 
fclose( file1 );                /* 關閉檔案 */   
}
/*----------------------------------------------------------------------------*/
/* 列印 YOU RESET */
int print_RESET( char*npc )
{
 
FILE *file1;                    /* 宣告檔案指標 */
 
printf("\n\t\t\tYOU LOSE,RESET GAME!!");
 
printf("\n公佈答案 : ");
 
display_ans ( npc );    
          
 
file1=fopen("list.txt","a");  /* 將 file1 指標 = 開啟檔案, a 接著寫入 */
 
fprintf( file1,"\nYOU LOSE,RESET GAME!!");
 
fprintf ( file1,"\n公佈答案 : %s",npc);
 
fprintf( file1,"\n--------------------\n"); 
 
fclose( file1 );              /* 關閉檔案 */   
}
/*----------------------------------------------------------------------------*/
/* 列印 YOU WIN */
int print_WIN( char*npc, char*user )
{
 
FILE *file1;                    /* 宣告檔案指標 */
 
display ( list_a, list_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);
 
fprintf( file1,"\n--------------------\n"); 
 
fclose( file1 );  
}
/*----------------------------------------------------------------------------*/
/* 列印 YOU LOSE */
int print_LOSE( char*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);
 
fprintf( file1,"\n--------------------\n"); 
 
fclose( file1 );              /* 關閉檔案 */ 
}    
/*----------------------------------------------------------------------------*/
/* 寫入來源資料的 1 ~ 9 */
int data_default ( char*data )
{
 
int i;
 for ( 
i = 0; i < 9; i++ )
       
data [i] = i + 49; 
 
data[9] = '\0'; /* 補上字串結尾 */         
 
randomize();     /* 亂數種子表歸零 */  
}
/*----------------------------------------------------------------------------*/
/* 來源資料交錯 ABCD => DBCA (配合 rand_source) */
int data_ins ( char*data ) 
{
 
int i;  
 for ( 
i = 0; i < 4; i += 2 )
      
swap_tmp ( data[i], data[8-i] );
}
/*----------------------------------------------------------------------------*/
/* 來源資料亂數交換,打亂源有次序 */
int rand_source ( char*data )
{
 
int a, b, i;
 
int rad_[2] = {0};
 for ( 
i = 0; i < 20 ; i++ )  /* 亂數交換 20 次 */ 
     
{
      
rad_[0] = random (9);
      
rad_[1] = random (9);
      
data_ins ( data );    
      
swap_tmp ( data[ rad_[0] ], data[ rad_[1] ] );
     }
}
/*----------------------------------------------------------------------------*/
/* 從來源資料中的取 4 位數 為 NPC 數值的方法 */
int in_npc ( char*destination, char*source  ) 
{
 
int i, j, k;               
 if ( ( 
random (2) + 1 ) == 1 ) /* 隨機決定取值的方法 1 或 2 */ 
    
{ 
     for ( 
i = 0; i < 4; i++ )  /* 取 NPC 數值的方法 1: 亂數抓取法  */ 
         
{
      
j = random (9-i);
      
destination[i] = source[j];  /* 亂數取值  */ 
      
source[j] = ' ';             /* 亂數取值後歸 ' ' */ 
      
move_data ( source );        /* 整理來源的 data */ 
         
} 
    }
 else                           
/* 取 NPC 數值的方法 2: 亂數連號抓取法 */  
    
{
     
j = random (9);
     if ( 
j < 5 )  /* 亂數值小於 5 時,取連續 4 位數  */ 
    
{
     for ( 
i = 0; i < 4; i++ )
              
destination[i] = source[i+j];
    } 
     else          
/* 亂數值大於 5 時,取連續 4 位數  */  
        
{ 
     for ( 
i = 0; i < 4; i++ )
         {
          if ( 
i + j > 8 ) 
              
destination[i] = source[i+j-9]; 
          else 
          
destination[i] = source[i+j];  
             }
        }
    }  
 
destination[4] = '\0';
}
/*----------------------------------------------------------------------------*/
/* 來源資料中的特定的值記號的空值往後移動 (配合 in_npc 使用) */
int move_data ( char*data ) 
{
 
int i, j;
 for ( 
i = 0; i < 9; i++ )
      {
      if ( 
data[i] == ' ' )  /* 以 ACSII 碼空白字元為整理對象 */ 
          
for ( j = 0; j < 9 - i ; j++ )
               
swap_tmp ( data[j+i] , data[j+i+1] );               
     } 
}
/*----------------------------------------------------------------------------*/ 
/* 起始開始資料 */
int start_default ( char*npc, char*data_source )
{
 
data_default ( data_source ); /* 寫入來源資料的 1 ~ 9 */
 
rand_source ( data_source );  /* 來源資料亂數交換,打亂源有次序 */ 
 
in_npc ( npc, data_source );  /* 從來源資料中的取 4 位數 為 NPC 數值的方法 */
}
/*----------------------------------------------------------------------------*/
/* 顯示畫面 */
int display ( short*tab1, short*tab2 )
{
 
int i, j, k;
 
k = S / 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 ( 
i = j = 0; i < k; i++ )      
      { 
      
printf ("\n %02d.", i+1);
       if ( 
tab1[i] != 0 )
         { 
          
printf ("\t%8d \t %dA,%dB", tab1[i], tab2[j], tab2[j+1] );
          if ( 
tab1[i+k] != 0 )
              
printf ("\t%4s\t %02d.\t%8d \t %dA,%dB",
                      
"▕", i+k+1, tab1[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 ( 
i = 0; i < 4; i++ )
      
printf ("%c ", data[i]);
 
puts(" "); 
}
/*----------------------------------------------------------------------------*/
/* 輸入猜測數字 + 檢查 4 位數 + 有無重複 + 檢查 0 值 */
int input_number ( char*destination )
{
 
char input[10] = "";
 
int number = 0;
 
int i, j;
 while( 
1 )
   { 
    
reinkny: 
    
display ( list_a, list_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 ( 
i = 0; i < 4 ; i++ )  
               { 
         if ( 
input[i] == '0' )      /* 檢查 0 值 */
                
{ 
         
puts("\n");
         
printf ("發現 0 值,請重新輸入,");
         
pause();
         goto 
reinkny;
        }
             for ( 
j = 0; j < 4; j++ ) 
                  if ( 
i != j )
              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*inv, char*AB )
{
 
int i, j;
 for ( 
i = 0; i < 4; i++ )
      if ( 
inv[i] == inv[i+4] ) /* 檢查 A */
          
AB[0]++;
      else                     
/* 檢查 B */
          
for ( j = 0; j < 4 ; j++ )
           if ( 
inv[i] == inv[j+4] )
                   
AB[1]++; 
}

/*----------------------------------------------------------------------------*/ 
/* 清除 1 次資料  */
int clrer_1st ( char*inv, char*AB )
{
 
AB[0]= 0;
 
AB[1]= 0;
 
strcpy ( inv,"" );
} 
/*----------------------------------------------------------------------------*/ 
/* 清除 memory_list */
int clrer_list ( char*list_a, char*list_b )
{
 
int i;
 for ( 
i = 0; i < S*2; i++ )
     { 
      if ( 
i < S )
          
list_a [i] = 0;         
      
list_b [i] = 0; 
     } 
} 
/*----------------------------------------------------------------------------*/ 
/* 再玩一次 */
int RePlay ( x )
{
 
char input;
 if ( 
x >= 4 )
     
printf("要在玩一次嗎(Y/N) ? ");
     
 else
     
printf("\n要退出遊戲了嗎(Y/N) ? ");
     
 while(
1)
 {
  
input = getchar();
  if ( 
input == 'y' | input == 'Y' )
      if ( 
x >= 4 )
          return 
1;
      else 
          return 
0; 
      
  else if ( 
input == 'n' | input == 'N' )
           if ( 
x >= 4 )
               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 次
回覆時引用此帖