|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2006-06-11, 12:19 AM | #1 |
長老會員
|
程式 - 關於c語言的猜數字問題?
請寫一個猜數字遊戲,電腦會產生一個四位數且每個數字都不重複的數字讓使用
者去猜,使用者猜測一組數字後,電腦會顯示 ?A?B 的訊息,A 代表正確的數字 數目,B 代表數字正確但位置不對的數字數目,一直重複到使用者猜對為止,或 是使用者按 0 投降。 不知道有沒有已經寫好的原始碼可以參考。 不知道可以不可以提供參考一下? |
__________________ 服務時間AM6:00~7:00,PM10:00~12:00 |
|
送花文章: 2,
|
2006-06-11, 06:31 PM | #2 (permalink) |
管理員
|
剛剛完工的 測試一下
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]++; } } } /*----------------------------------------------------------------------------*/ 此帖於 2006-06-12 12:21 AM 被 getter 編輯. |
__________________ 在「專業主討論區」中的問題解決後,要記得按一下 按鈕喔, 這是一種禮貌動作。 一樣是在「專業主討論區」中發問,不管問題解決與否,都要回應別人的回答文喔。 不然搞 [斷頭文],只看不回應,下次被別人列入黑名單就不要怪人喔。 天線寶寶說再見啦~ ... 天線寶寶說再見啦~ 迪西:「再見~ 再見~」 『 Otaku Culture Party 』 關心您 ... |
|
送花文章: 37855,
|
2006-06-11, 08:06 PM | #3 (permalink) |
長老會員
|
PHP 語法:
寫出來大概是這樣,請問要再如何把文件檔輸出。記錄猜過的數字。 寫出來的程式要像這樣。 http://wlanrc.nchc.org.tw/bcc/files/Example/EX-2.zip |
送花文章: 2,
|
2006-06-11, 08:41 PM | #4 (permalink) |
長老會員
|
PHP 語法:
這是c++的版本,不知道有人可以把它改成c語言的版本嗎? |
送花文章: 2,
|
2006-06-12, 12:20 AM | #5 (permalink) |
管理員
|
要寫檔的話... 可以使用 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]++; } } } /*----------------------------------------------------------------------------*/ |
送花文章: 37855,
|
2006-06-12, 01:47 AM | #6 (permalink) |
長老會員
|
PHP 語法:
還有我想在玩完一次後,詢問是否再玩一次。該如何改呢? |
送花文章: 2,
|
2006-06-12, 10:25 AM | #7 (permalink) | |
管理員
|
引用:
語法:
FILE *file1; //宣告檔案指標 file1 file1=fopen("list.txt","w"); //將檔案指標指到一個檔案 "list.txt","w" 為文字檔寫入模式 fprintf(file1,"文字"); //寫入檔案,用法與 printf 一樣,只是多了檔案指標 file1 fprintf(file1,"文字"); . . . fclose( file1 ); //對應 fopen 用途,將檔案指標關閉,結束程式或寫入完成時。 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 的怪現象 竟然不是程式碼的問題而是註解符號 ... 有人跟我一樣嗎 ? |
|
送花文章: 37855,
|
2006-06-12, 02:29 PM | #8 (permalink) |
長老會員
|
PHP 語法:
還有一個問題,就是我想印出答案在文件檔中。 不過打fprintf("%d",com[i]); 出現的卻不是答案,而是一串數字,請問該如何做呢 |
送花文章: 2,
|
2006-06-12, 03:18 PM | #9 (permalink) | |
管理員
|
引用:
不過 ... 照你說的出現 一串數字,我假設的式 那個 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]); 會讓 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]); 這一次就不貼 改過的原碼了 ... 這樣子就能還原出原來的一個數而不是分開的方式。 這個程式當初應該用 字串的方式去寫才對 ... 會比較好寫。因為 1A 2B 的遊戲並不做 + - * / 的運算。 有空的話我會再寫一個用字串的看看。 |
|
送花文章: 37855,
|
2006-06-12, 10:54 PM | #10 (permalink) |
長老會員
|
PHP 語法:
十分感謝幫忙^^ |
送花文章: 2,
|