史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   程式語言討論區 (http://forum.slime.com.tw/f76.html)
-   -   關於c語言的猜數字問題? (http://forum.slime.com.tw/thread176835.html)

hoio121 2006-06-11 12:19 AM

關於c語言的猜數字問題?
 
請寫一個猜數字遊戲,電腦會產生一個四位數且每個數字都不重複的數字讓使用
者去猜,使用者猜測一組數字後,電腦會顯示 ?A?B 的訊息,A 代表正確的數字
數目,B 代表數字正確但位置不對的數字數目,一直重複到使用者猜對為止,或
是使用者按 0 投降。

不知道有沒有已經寫好的原始碼可以參考。
不知道可以不可以提供參考一下?

getter 2006-06-11 06:31 PM

剛剛完工的 測試一下

RS 下載 http://rapidshare.de/files/22795294/1A2B.rar.html

語法:

/*
猜數字 1A2B
規則&條件:
1.先由電腦亂數決定 4 重複的位數。
2.讓玩家可以輸入猜測的數字。
3.判斷+顯示玩家的數字的 A B 率,A:位置,數值相等。B:僅數值相等。
4.可以按下 Q 鍵離開。
 
*/
#include <stdio.h> /* 載入引導檔 stdio.h */
#define random(num) (rand() % (num))
#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)
#define swap_tmp(x,y) (temp=x,x=y,y=temp)
unsigned temp;

int main(void)
{
 int data_num [10] = {0};
 int kc_num [2][4] = {0};
 int check[3] = {0};
 int checks[10][2] = {0};
 int input = 0;
 int inputs[10] = {0};
 int i;

 data_default ( data_num );  /* 資料起始 */
 rand_scan ( data_num );    /* 資料亂數交換 */
 in_pc_mun ( kc_num[0], data_num ); /* 取 pc_mun 數值的方法 */

 i = 0;
 while ( check[3] != 4 )
      {
       
                display( inputs, checks );    /* 顯示資料 */
                 
        input = get_num ( kc_num[1] );  /* 輸入猜測數字 */
                if ( input == 'q' || input == 'Q' )
                    break;
                         
        AB_check ( kc_num, check );      /* 檢查 A,B */
       
        display_us_num ( kc_num[1], check );  /* 顯示需入的檢查結果 */
       
                inputs [i] = input;
                check [3] = check[0];
                checks [i][0] = check[0];
                checks [i][1] = check[1];
            check[0] = 0 ;
            check[1] = 0 ;
                 
                if ( i > 9 )
            i = 0;
              else
                    i++;
                               
                pause();
          }

 if ( check[3] == 4)
    printf("\n 你贏了");
 else
        printf("\n 你輸了");
       
 puts("\n程式結束\n\n");
 pause();
}
/*----------------------------------------------------------------------------*/
/* 資料亂數交換 */
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] ] );
    }
}
/*----------------------------------------------------------------------------*/
/* 資料起始 */
int data_default ( int*data )
{
 int i;
 for ( i = 0; i < 9; i++ )
          data [i] = i + 1;
 randomize();
}
/*----------------------------------------------------------------------------*/
/* 資料顯示 */
int display ( int*dat1, int*dat2[10][2] )
{
 int i;
 clrscr();
 printf ("%4s\t%8s\t %s ","No.","Number","Check" );
 for ( i = 0; i < 10; i++ )         
          {
          printf ("\n %02d.", i+1);
          if ( dat1[i] != 0 )
          printf ("\t%8d \t %dA,%dB", dat1[i], dat2[i][0], dat2[i][1] );
      else
            printf ("\t%8s \t %s %s","","","");
        }
 puts("\n\n");
}
/*----------------------------------------------------------------------------*/
/* 資料顯示 pc_num */
int display_pc_num ( int*data )
{
 int i;
 printf(" pc_num : ");
 for ( i = 0; i < 4; i++ )         
          printf ("%d ", data [i]);
 puts("");
}
/*----------------------------------------------------------------------------*/
/* 資料顯示 us_num */
int display_us_num ( int*data,int*check )
{
 int i;
 puts("\n");
 printf(" ps_num : ");
 for ( i = 0; i < 4; i++ )         
          printf ("%d ", data [i]);
 printf("%dA,%dB", check[0], check[1] );
 puts("\n\n");
}
/*----------------------------------------------------------------------------*/
/* 資料交錯 */
int data_ins ( int*data )
{
 int i; 
 for ( i = 0; i < 4; i += 2 )
                      swap_xor ( data [ i ], data [ 8 - i ] );
}
/*----------------------------------------------------------------------------*/
/* 將特定的值記號往後移動 */
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] );                         
        }
}
/*----------------------------------------------------------------------------*/
/* 取 pc_mun 數值的方法 */
int in_pc_mun ( int*destination, int*source  )
{
 int i, j, k;                         
 if ( ( random (2) + 1 ) == 1 )
    {
    for ( i = 0; i < 4; i++ )
        {
                j = random (9-i);
              destination [i] = source [ j ];
            source [ j ] = 32;
            move_data ( source );         
            }
    }
 else
    {
        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 get_num ( int*destination )
{
 char input[10];
 int num;
 printf("請輸入猜測數字 0 ~ 9 不可重複 (按 Q 離開): ");
 scanf("%s",&input);
 num = atoi (input);
 destination[0] = num/1000%10; /* 取千位數 */
 destination[1] = num/100%10;  /* 取百位數 */
 destination[2] = num/10%10;  /* 取拾位數 */ 
 destination[3] = num%10;      /* 取個位數 */ 
 if ( input[0] == 'q' || input[0] == 'Q' )
    return input[0];
 else
    return num;
}
/*----------------------------------------------------------------------------*/
/* 檢查 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]++;
                          }
                }
}
/*----------------------------------------------------------------------------*/


hoio121 2006-06-11 08:06 PM

PHP 語法:

#include <time.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

int aa[4],bb[4]; //aa[]=電腦產生的數字 bb[]=使用者輸入的數字

int cmpA() //比較位置且數字相同的函數
{
int a=0,n;
for(
n=0;n<4;n++)
if(
aa[n]==bb[n]) //假如兩者位置且數字相同
a++;
return(
a);
}
int cmpB() //比較數字相同但位置不同的函數
{
int b=0,m,n;
for(
m=0;m<4;m++)
for(
n=0;n<4;n++)
if(
bb[m]==aa[n]) //假如兩者數字相同但位置不同
b++;
return(
b);
}
void main()
{
int i,j;
srand(time(NULL)); //亂數種子產生
printf("遊戲開始覺先請按任意鍵\n(Ctrl+q 離開)\n");
getch();
for(
i=0;i<4;i++) //產生要使用者猜的四位數
{
aa[i]=rand()%10+48//產生ASCII碼0~9的數字
for(j=0;j<i;j++)
{
if(
aa[i]==aa[j]) //電腦產生的數字不能重複
i--;

}
while(
i<6//假如猜中數字或使用者輸入Ctrl-q,則跳離
{
printf("輸入Ctrl-q則直接顯示答案\n");
printf("請輸入:\n");
for(
i=0;i<4;i++) //使用者要輸入小於五個字元
{
bb[i]=getche(); //顯示輸入的數字字元
if(bb[i]==17//假如輸入Ctrl-q則直接顯示答案
{
i=6;
break;
}
for(
j=0;j<i;j++)
if(
bb[i]==bb[j]) //使用者輸入的數字不能重複
{
i=4;
printf("\nyour number is overlap!\n");
break;
}

if(
cmpA()==4//假如使用者輸入的跟電腦完全相同
{
printf("\nYOU WIN!!!");
i=6;
}
else if(
i<5)
printf(" %dA%dB\n",cmpA(),cmpB()-cmpA()); //印出數字相同的訊息
}

printf("\n正確答案是 :"); //顯示答案
for(i=0;i<4;i++)
printf("%c",aa[i]);



寫出來大概是這樣,請問要再如何把文件檔輸出。記錄猜過的數字。

寫出來的程式要像這樣。
http://wlanrc.nchc.org.tw/bcc/files/Example/EX-2.zip

hoio121 2006-06-11 08:41 PM

PHP 語法:

#include <iostream.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    
int com[4],self[4],   //com陣列是要儲存電腦隨機產生的數字;self陣列是要儲存使用者自己輸入到num後所分割出來的單個數字
        
i,j,num;     //i變數與j變數都是下面for迴圈要用到的變數;num是要讓使用者輸入一串數字
    
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 (
true) {       //這裡的while是為了要在使用者輸入錯誤時重複執行
        
int a=0,b=0,war=0;  //這裡的a,b也就是指遊戲中的a,b;war則是要判斷使用者輸入的數串是否有重複
        
cout <<"輸入4個數字(輸入0結束):";
        
cin >> num;
        if (
num==0) {    //此if控制當輸入0時
            
cout << "笨蛋~你輸囉!" ;
            return 
0;   //程式結束
        
}
        else if (
num>=10000 || num<1000)   //此if是要判斷使用者輸入的數是否為4位數 
            
cout << "輸入的數字有誤" << endl << endl;
        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) {   //輸出遊戲結果
                    
cout << "你輸入的為:" << << "A" << << "B" << endl
                         
<< "程式結束" << endl << endl;  
                    return 
0;  //當結果為4A.B時則return0程式結束
                
} else {
                    
cout << "你輸入的為:" << << "A" << << "B" << endl   //如果結果不為4A0B則不return值回到while迴圈重新執行
                         
<< "請再輸入" << endl << endl;
                }
            } else 
//當war不為0表示數串有重複所以重新執行while迴圈
                
cout << "輸入數字有誤" << endl << endl;
        }
    }



這是c++的版本,不知道有人可以把它改成c語言的版本嗎?

getter 2006-06-12 12:20 AM

要寫檔的話... 可以使用 FILE 指標

範例 :
語法:


FILE *file1;  // 宣告檔案指標

file1=fopen("ABC.TXT","w");  // 開啟檔案 ABC.TXT 並為 寫入文字檔模式

fprintf ( file1,"哈囉你好 %s", "Hello" ); // 列印到檔案

fclose( file1 );  // 關閉檔案


以我之前的程式修改
RS 下載 http://rapidshare.de/files/22795140/2A2B.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;                        /* main 方法 while 使用變數 */
 
 FILE *file1;                    /* 宣告檔案指標 */
 file1=fopen("list01.txt","w");  /* 將 file1 指標 = 開啟檔案, w 寫入 */
 
 data_default ( data_num );          /* 資料起始 */
 rand_scan ( data_num );        /* 資料亂數交換,洗排列 */
 in_pc_mun ( kc_num[0], data_num ); /* 取 pc_mun 數值的方法 */

 i = j = 0;
 while ( check[3] != 4 )      /* 條件為 4A,離開 while loop  */
      {
       
                display( list_a, list_b );      /* 顯示資料 */
                 
        input = get_num ( kc_num[1] );  /* 輸入猜測數字 */
                               
                if ( input == 'q' || input == 'Q' )
                    break; /* 檢查為 q 鍵,離開 while loop */
                         
        AB_check ( kc_num, check );      /* 檢查 A,B */
       
        display_us_num ( kc_num[1], check );  /* 顯示需入的檢查結果 */
       
                list_a [i] = input;            /* 將單次的猜測數值記錄到 list */
               
                j++;                /* 計數器 j 筆資料供寫入到檔案用 */
                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] );
    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] );
    fprintf ( file1,"\n公佈答案 : %d",input);
        }
 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");
}
/*----------------------------------------------------------------------------*/
/* 資料顯示 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);
        }
 
 return sum;
}
/*----------------------------------------------------------------------------*/
/* 資料顯示玩家猜測的數值 */
int display_us_num ( int*data,int*check )
{
 int i, sum = 0;
 printf("\n你猜的數字 : ");
 for ( i = 0; i < 4; i++ )         
    {         
          printf ("%d ", data [i]);
          sum = sum + data [i] * pow(10,3-i);
        }
 if ( check[0] >= 0 )
    printf("%dA,%dB", check[0], check[1] );
 puts("\n\n");
 return sum;
}
/*----------------------------------------------------------------------------*/
/* 輸入猜測數字 */
int get_num ( int*destination )
{
 char input[10];
 int num;
 printf("請輸入猜測數字 4 位數,1 ~ 9 不可重複 (按 Q 離開): ");
 rest:
 scanf("%s",&input);
 if ( input[0] == 'q' || input[0] == 'Q' )
    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("有重複位數,請重新輸入 : ");
        goto rest;
    }

 else
    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++;
                  } 
        }
 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]++;
                          }
                }
}
/*----------------------------------------------------------------------------*/


hoio121 2006-06-12 01:47 AM

PHP 語法:

#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是要讓使用者輸入一串數字
    
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結束):");
        
scanf("%d",&num);
        if (
num==0) {    //此if控制當輸入0時
            
printf("笨蛋~你輸囉!\n") ;

system ("pause");            
   return 
0;
            
        }
        else if (
num>=10000 || num<1000)   //此if是要判斷使用者輸入的數是否為4位數 
            
printf("輸入的數字有誤" );
        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("你答對囉");       
          
system ("pause");
                return ;
                  
                } else {
                    
printf"你輸入的為: %d A %d B\n",a,b);
                    
printf("請再輸入" );
                }
            } else 
//當war不為0表示數串有重複所以重新執行while迴圈
                
printf("輸入數字有誤\n" );
        }
    }


這是現在我寫的。我還是不會寫入檔案的說,不知道大大可不可以幫我改一下。
還有我想在玩完一次後,詢問是否再玩一次。該如何改呢?

getter 2006-06-12 10:25 AM

引用:

作者: 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 的怪現象 竟然不是程式碼的問題而是註解符號 ...
有人跟我一樣嗎 ?

hoio121 2006-06-12 02:29 PM

PHP 語法:

#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結束):"); 
        
        
scanf("%d",&num); 
       
        
fprintf(file1,"你輸入的為%d     ",num); 
        if (
num==0)     /*此if控制當輸入0時 */ 
           

        
printf("笨蛋~你輸囉!\n") ; 
       
            
            if ( 
RePlay() ) /* RePlay 控制 */
               
{
                
fprintf(file1,"再玩一次\n" );                         
        goto 
restart
           }                    
        
fclosefile1 );  /* 關閉檔案 */
                   
            
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
               }                    
            
fclosefile1 );  /* 關閉檔案 */  
                    
                    
return 0
           }
                else 
           { 
                    
printf("你輸入的為: %d A %d B\n",a,b); 
                    
printf("請再輸入" ); 
                    
fprintf(file1,"%d A %d B\n",a,b); 
                    
                   } 
               } 
             else 
/*當war不為0表示數串有重複所以重新執行while迴圈*/ 
                

         
printf("輸入數字有誤\n" ); 
                 
fprintf(file1,"輸入數字有誤\n" ); 
                }        
           } 
       } 
}  

/* 再玩一次 */
int RePlay ()
{
 
char input[10];
 
int num;
 
printf("要再玩一次嗎(Y/N) ? ");

 
rest:
 
scanf("%s",&input);
 if ( 
input[0] == 'Y' input[0] == 'y' )
     return 
1;
 else if ( 
input[0] == 'n' input[0] == 'N' )
     {
     
printf("程式結束\n");
     
system("pause");
     return 
0;} 
 goto 
rest


修改完成,大概就像這樣囉。感謝大大的幫忙。
還有一個問題,就是我想印出答案在文件檔中。
不過打fprintf("%d",com[i]);
出現的卻不是答案,而是一串數字,請問該如何做呢

getter 2006-06-12 03:18 PM

引用:

作者: hoio121
[php]#include <stdio.h>
修改完成,大概就像這樣囉。感謝大大的幫忙。
還有一個問題,就是我想印出答案在文件檔中。
不過打fprintf("%d",com[i]);
出現的卻不是答案,而是一串數字,請問該如何做呢...

不曉得你要使用的 fprintf("%d",com[i]); 的上下的程式碼,有點難猜測試啥

不過 ... 照你說的出現 一串數字,我假設的式 那個 com[i] 的 i 有問題
因為 ... 可能 i 值超過 array 的範圍變成抓錯值 ...。

如果該 array 是字串的格式,如 char com[4] 的話,直接印 fprintf("%s",com);
是印一串想要的。int 或 float 的格式就要用一些方法了

因為 com 的 array 是放 1 位數的值,因此要印出來也只能依序去印他...
用 for loop 來做
我寫的程式中就有這一段喔
語法:

for (i=0;i<4;i++)
    fprintf("%d",com[i]);

如此才能全部印出,那麼你的問題也可能出在這裡,那個 i 如果是電腦的隨機值的話
會讓 com[i] 印出不對的資料,故要搭 for loop 來正確列印他 。

或是把 com [i] 的資料還原成為 1 個單一數值 (這種方式我寫的程式也有)。

假設
com [0] 為千分位、1 為百分位、2為拾位、3為個位

經過一些運算的方法還原回元數值 再加總到某一個變數硬出來

語法:

for ( i = 0; i < 4; i++ )         
    sum = sum + com [i] * pow(10,3-i); 

fprintf("%d",sum[i]);

RS 下載你的程式再改 http://rapidshare.de/files/22843988/fix02.rar.html

這一次就不貼 改過的原碼了 ...

這樣子就能還原出原來的一個數而不是分開的方式。

這個程式當初應該用 字串的方式去寫才對 ...
會比較好寫。因為 1A 2B 的遊戲並不做 + - * / 的運算。

有空的話我會再寫一個用字串的看看。

hoio121 2006-06-12 10:54 PM

PHP 語法:

#include <stdio.h>  
#include <stdlib.h>  
#include <time.h>  
int main()  
{  
 
int com[4],self[4],   /*com陣列是要儲存電腦隨機產生的數字;self陣列是要儲存使用者自己輸入到num後所分割出來的單個數字*/   
 
a,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;  
              }  
          }  
     }  
   
fprintf(file1,"答案為");             /* 印答案  */   
                    
for (a=0;a<4;a++)
                         
fprintf(file1,"%d",com[a]);
                        
fprintf(file1,"\n");  /* 印答案  */  
 
while (1
       {       
/*這裡的while是為了要在使用者輸入錯誤時重複執行*/  
        
int a=0,b=0,war=0;  /*這裡的a,b也就是指遊戲中的a,b;war則是要判斷使用者輸入的數串是否有重複*/   
       
         
printf("輸入4個數字(輸入0結束):");  
         
        
scanf("%d",&num);  
        

        
fprintf(file1,"你輸入的為%d     ",num);  
        if (
num==0)     /*此if控制當輸入0時 */  
           
{  
        
printf("笨蛋~你輸囉!\n") ;  
        
printf("答案為:") ;
        for (
a=0;a<4;a++)
        { 
printf("%d",com[a]);
        }
         
printf("\n") ;
        
fprintf(file1,"程式結束");  
          
             
            if ( 
RePlay() ) /* RePlay 控制 */ 
               

                
fprintf(file1,"再玩一次\n" );                          
        goto 
restart;  
           }                     
        
fclosefile1 );  /* 關閉檔案 */ 
                    
            
return 0;              
           }  
        else if (
num>=10000 || num<1000)   /*此if是要判斷使用者輸入的數是否為4位數*/    
           

        
printf("輸入的數字有誤" ); 
            
fprintf(file1,"輸入的數字有誤\n" );  
           } 
        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;  
               } 
                                           
            
fclosefile1 );  /* 關閉檔案 */   
                     
                    
return 0;  
           } 
                else  
           {  
                    
printf("你輸入的為: %d A %d B\n",a,b);  
                    
printf("請再輸入" );  
                    
fprintf(file1,"%d A %d B\n",a,b);  
                     
                   }  
               }  
             else 
/*當war不為0表示數串有重複所以重新執行while迴圈*/  
                
{  
         
printf("輸入數字有誤\n" );  
                 
fprintf(file1,"輸入數字有誤\n" );  
                }         
           }  
       }  
}   

/* 再玩一次 */ 
int RePlay () 

 
char input[10]; 
 
int num
 
printf("要再玩一次嗎(Y/N) ? "); 

 
rest
 
scanf("%s",&input); 
 if ( 
input[0] == 'Y' input[0] == 'y' 
     return 
1
 else if ( 
input[0] == 'n' input[0] == 'N' 
     { 
     
printf("程式結束\n"); 
     
system("pause"); 
     return 
0;}  
 goto 
rest;  


完成囉!最後的作回就是這樣。
十分感謝幫忙^^


所有時間均為台北時間。現在的時間是 07:02 AM

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

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1