管理員
|
要寫檔的話... 可以使用 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]++;
}
}
}
/*----------------------------------------------------------------------------*/
|