查看單個文章
舊 2006-06-12, 10:25 AM   #7 (permalink)
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 金幣
預設

引用:
作者: hoio121
[php]
這是現在我寫的。我還是不會寫入檔案的說,不知道大大可不可以幫我改一下。
還有我想在玩完一次後,詢問是否再玩一次。該如何改呢?...
一.就是用 FILE 宣告 檔案指標、fopen 開檔、fprintf 寫入、fclose 關檔

語法:
FILE *file1; //宣告檔案指標 file1
file1=fopen("list.txt","w"); //將檔案指標指到一個檔案 "list.txt","w" 為文字檔寫入模式

fprintf(file1,"文字"); //寫入檔案,用法與 printf 一樣,只是多了檔案指標 file1
fprintf(file1,"文字");
     .
     .
     .

fclose( file1 ); //對應 fopen 用途,將檔案指標關閉,結束程式或寫入完成時。
我不曉得你要寫入哪一種訊息喔?只好 copy printf 的訊息寫入 ...
1.在一開始宣告變數的地方補上這兩行

FILE *file1;
file1=fopen("list.txt","w");

也可以寫成

FILE *file1=fopen("list.txt","w");

2.把有 printf 的全部複製一行 改寫成 fprintf

3.你的程式本身的程式結尾不像一般是在 main 的最後一行,
而是在 return 0; 的地方 (有兩處),在 return 0; 前
補上 fclose( file1 ); 就差不多了

除非你還想再加寫一些東西 ... 可以用 fprintf 在加寫 ...
不過要在 fopen 到 fclose 之間加入。

-------------------------------------------------------------------

二.在程式結束時,加入控制用副程式 ...,問玩家要不要在 P 一次。

你的程式本身的程式結尾不像一般是在 main 的最後一行,
而是在 return 0; 的地方 (有兩處),補上一個控制程式

詢問 user 既可,按 R 強制程式到回到 restart: 的標籤,
按 Q 則是接到 fclose 跟 return 結束程式


我是拿我的控制程式直接套用在你的程式上面 ...,加在剛剛說的地方



以我之前的程式在修改︰

RS 下載我的程式 : http://rapidshare.de/files/22832692/3A2B.rar.html
RS 下載你的程式 : http://rapidshare.de/files/22832753/fix.rar.html

我的程式:
語法:
/*
猜數字 1A2B
規則&條件:
1.先由電腦亂數決定 4 重複的位數。
2.讓玩家可以輸入猜測的數字。
3.判斷+顯示玩家的數字的 A B 率,A:位置,數值相等。B:僅數值相等。
4.可以按下 Q 鍵離開。 
*/
#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_xor(x,y) (x^=y,y^=x,x^=y)    /* 用 XOR 做 AB 交換 */  
#define swap_tmp(x,y) (temp=x,x=y,y=temp) /* 用 變數 做 AB 交換 */  
unsigned temp;  

int main(void)
{
 int data_num [10] = {0};        /* 亂數取值的資料庫 */  
 int kc_num [2][4] = {0};		 /* [0][4]:NPC的答案 ; [1][4]:次猜測數值 */ 
 int check[3] = {0};             /* 0:紀錄 A; 1:紀錄 ; 2:while 判斷 4A條件 */ 
 int input = 0;					 /* 提供每次猜測數值、 Q 鍵時、答案 */
 int list_a[S] = {0};            /* list_a 記錄每次猜測數值 */
 int list_b[S][2] = {0};         /* list_b 記錄每次猜測時的 A,B */   
 int i, j , r;                   /* main 方法 while 使用變數 */
 
 FILE *file1;                    /* 宣告檔案指標 */
 file1=fopen("list01.txt","w");  /* 將 file1 指標 = 開啟檔案, w 寫入 */
 
 restart:
 data_default ( data_num );  	 /* 資料起始 */
 rand_scan ( data_num );         /* 資料亂數交換,洗排列 */
 in_pc_mun ( kc_num[0], data_num ); /* 取 pc_mun 數值的方法 */

 i = j = r = 0;
 while ( check[3] != 4 )       /* 條件為 4A,離開 while loop  */
       {
        reset:
		display( list_a, list_b );      /* 顯示資料 */
		   
        input = get_num ( kc_num[1] );  /* 輸入猜測數字 */
				
		if ( input == 'q' || input == 'Q' ) 
		    break; /* 檢查為 q 鍵,離開 while loop */
		else if ( input == 'r' || input == 'R' ) 
		   {
  	 	    reset01 ( kc_num[0], data_num );
		    reset02 ( list_a, list_b ); 
		    i = j = 0;
		    check[0] = 0 ;                  /* 將判斷的 check A 歸 0 */ 
	        check[1] = 0 ;					/* 將判斷的 check B 歸 0 */
	        r = 1;
	        printf("\n\t\t\t放棄重來!");
	        fprintf( file1,"\n放棄重來");
    		input = display_pc_num ( kc_num[0] , 1 );
     		fprintf ( file1,",公佈答案 : %d",input);
     		fprintf( file1,"\n--------------------");
     		pause();
		    goto reset;
		   }
		   	
        AB_check ( kc_num, check );      /* 檢查 A,B */ 
        
        display_us_num ( kc_num[1], check );   /* 顯示需入的檢查結果 */
        
		list_a [i] = input;             /* 將單次的猜測數值記錄到 list */
		
		j++; 	  						/* 計數器 j 筆資料供寫入到檔案用 */ 
		if( r == 1 )
		   fprintf ( file1,"\n\n");
		   
		if( j == 1 )                    /* 第一筆資時先寫入表頭項目(檔案) */ 
		   fprintf ( file1,"%4s\t%8s\t %s ","No.","Number","Check" );
		  
	    fprintf ( file1,"\n %02d.\t%8d\t%dA,%dB", j, input, check[0], check[1]);
	    /* 寫入資料(檔案) */ 
	    
		check  [3]    = check[0];       /* 指定 while 判斷條件的隨機值 */ 	
		list_b [i][0] = check[0];       /* 寫入到記憶體 list 中的 A */ 
		list_b [i][1] = check[1];       /* 寫入到記憶體 list 中的 B */  
	    check[0] = 0 ;                  /* 將判斷的 check A 歸 0 */ 
	    check[1] = 0 ;					/* 將判斷的 check B 歸 0 */ 
       	    
		if ( i > ( S -1 ) )             /* 控制 list 的寫入位置 */ 
           	i = 0;
  	    else 
		    i++;
				
		pause();
	   }
puts(" ");
 if ( check[3] == 4)
    {
     printf("\n\t\t\t你贏了!");
     input = display_pc_num ( kc_num[0] , 1 );
     fprintf ( file1,"\n公佈答案 : %d",input);
     input = display_us_num ( kc_num[1] );
     fprintf ( file1,"\n你的答案 : %d",input);
	}
 else 
	{ 
	 printf("\n\t\t\t你輸了!");
     input = display_pc_num ( kc_num[0] , 1 );
     fprintf ( file1,"\n公佈答案 : %d",input);     
	} 
 
 if( RePlay() )
    goto restart;
 	
 fclose( file1 ); 
 puts("\n程式結束\n"); 
 pause();
}
/*----------------------------------------------------------------------------*/
/* 來源資料起始 */
int data_default ( int*data )
{
 int i;
 for ( i = 0; i < 9; i++ )
 	  data [i] = i + 1; 
 randomize(); 
}
/*----------------------------------------------------------------------------*/
/* 來源資料交錯 */
int data_ins ( int*data ) 
{
 int i;  
 for ( i = 0; i < 4; i += 2 )
 	  	   swap_xor ( data [ i ], data [ 8 - i ] );
}
/*----------------------------------------------------------------------------*/
/* 來源資料亂數交換 */
int rand_scan ( int*data )
{
 int a, b, i;
 int rad_[2] = {0};
 for ( i = 0; i < 100; i++ )
     {
	  rad_[0] = random (9);
	  rad_[1] = random (9);
	  data_ins ( data );	
	  swap_tmp ( data [ rad_[0] ], data [ rad_[1] ] );
     }
}


/*----------------------------------------------------------------------------*/
/* 從來源資料中的取 4 位數 為 NPC 數值的方法 */
int in_pc_mun ( int*destination, int*source  ) 
{
 int i, j, k; 			  
 if ( ( random (2) + 1 ) == 1 ) /* 取 NPC 數值的方法 1: 亂數抓取法  */ 
    { 
     for ( i = 0; i < 4; i++ )  
         {
   	     j = random (9-i);
 	     destination [i] = source [ j ]; 
	     source [ j ] = 32;
	     move_data ( source ); 	  
	     } 
    }
 else                           /* 取 NPC 數值的方法 2: 亂數連號抓取法 */  
    {
	 j = random (9);
 	 if ( j < 5 )
	    {
	     for ( i = 0; i < 4; i++ )
              destination [ i ] = source [ i + j ];
	    } 
     else 
        { 
	     for ( i = 0; i < 4; i++ )
	         {
	          if ( i + j > 8 )
		          destination [ i ] = source [ i + j - 9 ];
		      else 
		          destination [ i ] = source [ i + j ];  
		     }
		}
	}
}
/*----------------------------------------------------------------------------*/
/* 來源資料中的特定的值記號往後移動 */
int move_data ( int*data ) 
{
 int i, j;
 for ( i = 0; i < 9; i++ )
 	 {
	  if ( data[i] >= 9 ) 
	      for ( j = 0; j < 9 - i ; j++ )
	           swap_xor ( data [j+i] , data [j+i+1] );			   
	 } 
}
/*----------------------------------------------------------------------------*/
/* 資料顯示 */
int display ( int*dat1, int*dat2[S][2] )
{
 int i, j;
 j = 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 = 0; i < j; i++ )	  
 	 { 
	  printf ("\n %02d.", i+1);
 	  if ( dat1[i] != 0 )
	     { 
          printf ("\t%8d \t %dA,%dB", dat1[i], dat2[i][0], dat2[i][1] );
          if ( dat1[i+j] != 0 )
		      printf ("\t%4s\t %02d.\t%8d \t %dA,%dB",
		              "▕", i+j+1, dat1[i+j], dat2[i+j][0], dat2[i+j][1] );	
          else 
  	          printf ("\t%4s\t %02d.","▕", i+j+1);
		 }
	  else 
  	  printf ("\t%8s \t %s %s\t%4s\t %02d.","","","","▕", i+j+1);  	  
	 } 
	 
 puts("\n\n按 R 鍵重來;按 Q 鍵離開\n"); 
}
/*----------------------------------------------------------------------------*/
/* 資料顯示 NPC 的答案 */
int display_pc_num ( int*data )
{
 int i, sum = 0;
 printf("\n公佈答案   : "); 
 for ( i = 0; i < 4; i++ )
     {	  
      printf ("%d ", data [i]);
      sum = sum + data [i] * pow(10,3-i);
     } 
 puts("\n"); 
 return sum;
}
/*----------------------------------------------------------------------------*/
/* 資料顯示玩家猜測的數值 */
int display_us_num ( int*data,int*check )
{
 int i, sum = 0;
 printf("你猜的數字 : "); 
 for ( i = 0; i < 4; i++ )	  
     {	  
      printf ("%d ", data [i]);
      sum = sum + data [i] * pow(10,3-i);
     }
 if ( check[0] >= 0 )
     printf("\t%dA,%dB", check[0], check[1] );
 puts("\n");
 return sum;
}
/*----------------------------------------------------------------------------*/
/* 輸入猜測數字 */
int get_num ( int*destination )
{
 char input[10];
 int num;
 printf("請輸入猜測數字 4 位數,1 ~ 9 不可重複: ");
 rest:
 scanf("%s",&input);
 if ( input[0] == 'q' | input[0] == 'Q' | 
      input[0] == 'r' | input[0] == 'R' )
     return input[0]; 
 num = atoi (input);
 if ( num > 9999 )
    { 
     printf("超過 4 位數,請重新輸入 : ");
	 goto rest;
    }
 destination[0] = num/1000%10; /* 取千位數 */
 destination[1] = num/100%10;  /* 取百位數 */ 
 destination[2] = num/10%10;   /* 取拾位數 */  
 destination[3] = num%10;      /* 取個位數 */  
 if ( check_get_num ( destination ) ) 
    { 
     printf("有重複位數或 0 值,請重新輸入 : ");
     goto rest;
    }

 else 
 printf("\n");
     return num;
}
/*----------------------------------------------------------------------------*/
/* 檢查輸入猜測數字 */
int check_get_num ( int*check )
{
 int i, j, k = 0;
 for ( i = 0; i < 4 ; i++ )  
     {
      for ( j = 0; j < 4 ; j++ ) 
          {
	  if ( check[i] == check[j] )
	      k++;
	  if ( 0 == check[j] )
	      k++;
          }  
     }
 k -= 4;
 if ( k > 0 ) 
     return 1; 
 else 
     return 0;
}
/*----------------------------------------------------------------------------*/
/* 檢查猜測數字的 A,B 值 */
int AB_check ( int data[2][4], int*C )
{
 int i, j, k = 0;
 for ( i = 0; i < 4; i++ )
      if ( data[0][i] == data[1][i] )
          C [0]++;
      else 
         {
          for ( j = 0; j < 4 ; j++ )
	     {
  	      if ( data[0][j] == data[1][i] )
                   C [1]++;
	     }
	}
}
/*----------------------------------------------------------------------------*/ 
/* 重置01 */
int reset01 ( int*dat1,int*dat2 )
{
 data_default ( dat2 );  	 /* 資料起始 */
 rand_scan ( dat2 );         /* 資料亂數交換 */
 in_pc_mun ( dat1, dat2 ); /* 取 pc_mun 數值的方法 */
} 
/*----------------------------------------------------------------------------*/ 
/* 重置02 */
int reset02 ( int*list_a,int*list_b[S][2] )
{
 int i, j;
 for ( i = 0; i < S; i++ )
     {
      list_a [i] = 0;
      for ( j = 0; j < 2; j++ )
      list_b [i][j] = 0;            	  
     }
} 
/*----------------------------------------------------------------------------*/ 
/* 再玩一次 */
int RePlay ()
{
 char input[10];
 int num;
 printf("要再玩一次 嗎 ? ");
 printf("\n按 R 再玩一次;按 Q 鍵離開 :");
 rest:
 scanf("%s",&input);
 if ( input[0] == 'q' | input[0] == 'Q' )
     return 0;
 else if ( input[0] == 'r' | input[0] == 'R' )
     return 1; 
 goto rest; 
}
/*----------------------------------------------------------------------------*/

你的程式
語法:
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
int main() 
{ 
 int com[4],self[4],   /*com陣列是要儲存電腦隨機產生的數字;self陣列是要儲存使用者自己輸入到num後所分割出來的單個數字*/  
 i,j,num;     /*i變數與j變數都是下面for迴圈要用到的變數;num是要讓使用者輸入一串數字*/  
  
 FILE *file1;                    /* 宣告檔案指標 */
 file1=fopen("list.txt","w");    /* 將 file1 指標 = 開啟檔案, w 寫入 */
  
 restart:         /* 對應 RePlay 控制的標籤 */
 	
 srand(time(NULL)); /*加入此行可以使隨機的數字可以隨著時間變化而不會出現重複的*/  
    	
 for (i=0;i<4;i++)
     {                      /*此for迴圈是要產生隨機數字*/  
      com[i]=(rand()%9)+1; 
      for (j=0;j<i;j++) 
          { 
           if (com[j]==com[i])   /*這個if判斷如果產生重複的數字則要求電腦再重新產生一數字放回原位置內*/  
              {
	       i--; 
               break; 
              } 
          } 
     } 
  

 while (1)  
       {       /*這裡的while是為了要在使用者輸入錯誤時重複執行*/ 
        int a=0,b=0,war=0;  /*這裡的a,b也就是指遊戲中的a,b;war則是要判斷使用者輸入的數串是否有重複*/  
        printf("輸入4個數字(輸入0結束):"); 
        fprintf(file1,"輸入4個數字(輸入0結束):"); 
        scanf("%d",&num); 
        if (num==0)     /*此if控制當輸入0時 */ 
           { 
	    printf("笨蛋~你輸囉!\n") ; 
	    fprintf(file1,"笨蛋~你輸囉!\n") ;
            
            if ( RePlay() ) /* RePlay 控制 */
               {
                fprintf(file1,"再玩一次\n" );                         
		goto restart; 
	       }	                
	    fclose( file1 );  /* 關閉檔案 */
	               
            return 0;             
           } 
        else if (num>=10000 || num<1000)   /*此if是要判斷使用者輸入的數是否為4位數*/   
           {
	    printf("輸入的數字有誤" );
            fprintf(file1,"輸入的數字有誤" ); 
           }
        else 
	   {   /*當輸入的數確定為4位數且不是0時開始判斷a,b*/ 
            for (i=3;i>=0;i--) /*此for迴圈將使用者輸入數串切割為單個數字放入self陣列*/ 
                { 
		 self[i]=num%10; 
                 num/=10; 
                }
				 
            for (i=0;i<4;i++) /*此for迴圈判斷使用者輸入的數串是否有重複*/  
     	    	{   
                 for (j=0;j<i;j++) 
		     { 
                      if (self[j]==self[i]) 
		         { 
                          war++;     /*當使用者輸入數字重覆時war++,如果war++過則表示war不等於0可以拿來做下面判斷 */ 
                          break; 
                         }  
                     } 
                }
				 
            if (war==0)    /*當war不為0時表示使用者輸入數串沒有重複*/  
               { 
		for (i=0;i<4;i++) 
		    { 
                     if (com[i]==self[i])  /*當數字相同且位置也相同時a++...兩個陣列內都放入i表示他們位置相同*/  
                         a++; 
                     else 
		        { 
                         for (j=0;j<4;j++) 
		             {
                              if (com[i]==self[j])  /*當數字相同位置不同時b++..位置變數一個為i一個為j*/  
                              b++; 
                             } 
                        }  
                    } 
                if (a==4)    /*輸出遊戲結果*/ 
                   {
                    printf("你輸入的為:%dA%bB\n,a,b"); 
                    printf("你答對囉");
                    fprintf(file1,"你輸入的為:%dA%bB\n,a,b"); 
                    fprintf(file1,"你答對囉");        
                    
                    if ( RePlay() )  /* RePlay 控制 */
                       {
                        fprintf(file1,"再玩一次\n" );                         
			goto restart; 
		       }	                
		    fclose( file1 );  /* 關閉檔案 */  
                    
                    return 0; 
		   }
                else 
		   { 
                    printf("你輸入的為: %d A %d B\n",a,b); 
                    printf("請再輸入" ); 
                    fprintf(file1,"你輸入的為: %d A %d B\n",a,b); 
                    fprintf(file1,"請再輸入" ); 
                   } 
               } 
             else /*當war不為0表示數串有重複所以重新執行while迴圈*/ 
                { 
		 printf("輸入數字有誤\n" ); 
                 fprintf(file1,"輸入數字有誤\n" ); 
                }        
           } 
       } 
}  

/* 再玩一次 */
int RePlay ()
{
 char input[10];
 int num;
 printf("要再玩一次 嗎 ? ");
 printf("\n按 R 再玩一次;按 Q 鍵離開 :");
 rest:
 scanf("%s",&input);
 if ( input[0] == 'q' | input[0] == 'Q' )
     return 0;
 else if ( input[0] == 'r' | input[0] == 'R' )
     return 1; 
 goto rest; 
}

有機會在討論吧 ...,我是用 DEV-C++ 寫 C 的 ... 會挑 //註解文字
只能用 /*註解文字*/,真是氣死我了,貼上原始碼 ... 會有錯誤 ...
這是 DEV-C++ 寫 C 的怪現象 竟然不是程式碼的問題而是註解符號 ...
有人跟我一樣嗎 ?
__________________
在「專業主討論區」中的問題解決後,要記得按一下 http://forum.slime.com.tw/images/stamps/is_solved.gif 按鈕喔,
這是一種禮貌動作。

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

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

迪西:「再見~ 再見~」

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