我把我的程式重新寫過之後... 使其可玩性大增。
PHP 語法:
/*
猜數字 1A2B
規則&條件:
1.先由電腦亂數決定 4 重複的位數。
2.讓玩家可以輸入猜測的數字。
3.判斷+顯示玩家的數字的 A B 率,A:位置,數值相等。B:僅數值相等。
4.可以按下 Q 鍵離開,按 R 鍵重新遊戲。
*/
#include <stdio.h> /* 載入引導檔 stdio.h */
#include <math.h> /* 載入引導檔 math.h */
#define S 20 /* 設定巨集 S 為 20 */
#define random(num) (rand() % (num)) /* 取亂數巨集 random(number) */
#define randomize() srand((unsigned)time(NULL)) /* 歸零亂數種子巨集 */
#define clrscr() system("CLS") /* 清除畫面巨集 */
#define pause() system("PAUSE") /* 暫停畫面巨集 */
#define swap_tmp(x,y) (temp=x,x=y,y=temp) /* 用 變數 做 AB 交換 */
unsigned temp;
char data_source[10] = ""; /* PC 答案的來源 */
char npc[5] = ""; /* NPC 的答案 */
char user[6] = ""; /* Uesr 的答案 */
char inv[9] = ""; /* NPC: 0~3,Uesr: 4~7 */
char AB[3] = ""; /* 紀錄單次的 A,B 值的檢查結果*/
short list_a[S] = {0}; /* 表格 1 連續紀錄 User 的輸入數字 */
short list_b[S*2] = {0}; /* 表格 2 連續紀錄 User 輸入數字 A,B 值 */
int main(void)
{
int i, j, k, r;
FILE *file1; /* 宣告檔案指標 */
logo();
restart: /* 標籤起點 (配合 RePlay) 再玩一次 */
start_default ( npc, data_source ); /* 起始開始資料 */
AB[2] = 0;
clrer_1st( inv ,AB ); /* 清除 1 次資料 */
clrer_list( list_a, list_b ); /* 清除 memory_list */
i = j = r = 0;
while ( AB[2] != 4 ) /* 條件為 4A,離開 while loop */
{
nxit: /* 標籤起點 (配合 RePlay) 繼續玩 */
input_number ( user ); /* 輸入猜測數字 + 檢查 4 位數 + 有無重複 + 檢查 0 值 */
if ( user[0] == 'q' || user[0] == 'Q' )
break; /* 按 Q 鍵,離開 while loop */
else if ( user[0] == 'r' || user[0] == 'R' ) /* 按 R 鍵,RESET */
{
print_RESET ( npc ); /* 列印 YOU RESET */
puts("\n");
pause();
start_default ( npc, data_source ); /* 起始開始資料 */
i = j = 0; /* 清除 while 計數器 */
clrer_1st( inv ,AB ); /* 清除 1 次資料 */
clrer_list( list_a, list_b ); /* 清除 memory_list */
r = 1; /* 紀錄按了 R 鍵 */
continue;
}
if ( i > 0 ) /* 檢查是否有以猜過的數字組 */
for ( k = 0 ; k < i ; k++ )
if ( atoi( user ) == list_a[k] )
{
puts("\n");
printf ("該數字組 %s 已數入過,請重新輸入",user);
puts("\n");
pause();
goto nxit;
}
strcat ( inv, npc ); /* 資料組合 npc (配合 check_AB) */
strcat ( inv, user ); /* 資料組合 npc + user (配合 check_AB) */
check_AB ( inv , AB ); /* 檢查猜測數字的 A,B 值 */
memory ( i , j ); /* 把遊戲的過程寫入至 memory list */
print_setp ( user, AB , i , r ); /* 列印遊戲過程 */
clrer_1st( inv ,AB ); /* 清除 1 次資料 */
if ( i == ( S -1 ) ) /* 步驟滿了遊戲結束,玩家算輸 */
{
AB[2] = 5; /* 紀錄玩家算輸的狀態 */
display ( list_a, list_b ); /* 顯示畫面 */
puts("\n");
puts("\n");
print_LOSE( npc ); /* 列印 YOU LOSE */
break;
}
else /* 控制 list_array 的寫入位置 */
{
i++;
j+=2;
}
}
if ( AB[2] == 4) /* YOU WIN 遊戲結束的處理 */
print_WIN( npc, user ); /* 列印 YOU WIN */
if( RePlay(AB[2]) ) /* 是否再玩一次的判斷 */
if ( AB[2] >= 4 )
goto restart;
else
goto nxit;
if ( AB[2] < 4 ) /* YOU LOSE 遊戲結束的處理 */
print_LOSE( npc ); /* 列印 YOU LOSE */
puts("\n程式結束\n");
pause();
}
/*----------------------------------------------------------------------------*/
/* 把logo 規則 */
int logo ( void )
{
clrscr();
puts("\n");
puts("\t\t\t 猜數字 1A 2B 小遊戲");
puts("\n");
puts("\t遊戲規則:");
puts("\n");
puts("\t1.輸入 1 ~ 9 不可重覆之 4 位數字的組合,如 1234、9876 等。");
puts("\t2.輸入後如有數字和位置與 NPC 相同者為 A,2A 為兩個數字和位置相同。");
puts("\t3.輸入後僅數字與 NPC 相同者為 B,2B 為兩個數字相同。");
puts("\t4.當輸入的數字全部為 4A 時,玩家勝利。而退出遊戲、重新遊戲,玩家失敗。");
puts("\t5.當畫面的表格子用完( 20 格)時,未達 4A 時,玩家失敗。");
puts("\n");
puts("\t getter 以 DEV-C 撰寫 ...,版權沒有,當機不究。");
puts("\n");
pause();
}
/*----------------------------------------------------------------------------*/
/* 把遊戲的過程寫入至 memory list */
int memory ( i , j )
{
list_a[i] = atoi( user ); /* 將每筆的猜測值寫入到 memory list_a */
AB[2] = AB[0]; /* 將每筆的 A 值寫入到 while 檢查器中 */
list_b[j] = AB[0]; /* 將每筆的 A 值寫入到 memory list_b */
list_b[j+1] = AB[1]; /* 將每筆的 B 值寫入到 memory list_b */
}
/*----------------------------------------------------------------------------*/
/* 列印 setp */
int print_setp ( char*user , char*AB, int i , int r )
{
FILE *file1; /* 宣告檔案指標 */
file1=fopen("list.txt","a"); /* 將 file1 指標 = 開啟檔案, a 接著寫入 */
if( r == 1 ) /* 當按下 R 鍵重來時 */
fprintf ( file1,"\n");
if( i == 0 ) /* 第一筆資時先寫入表頭項目(檔案) */
fprintf ( file1,"\n%4s\t%8s\t %s ","No.","Number","Check" );
fprintf ( file1,"\n %02d.\t%8s\t%dA,%dB", i, user, AB[0], AB[1] );
fclose( file1 ); /* 關閉檔案 */
}
/*----------------------------------------------------------------------------*/
/* 列印 YOU RESET */
int print_RESET( char*npc )
{
FILE *file1; /* 宣告檔案指標 */
printf("\n\t\t\tYOU LOSE,RESET GAME!!");
printf("\n公佈答案 : ");
display_ans ( npc );
file1=fopen("list.txt","a"); /* 將 file1 指標 = 開啟檔案, a 接著寫入 */
fprintf( file1,"\nYOU LOSE,RESET GAME!!");
fprintf ( file1,"\n公佈答案 : %s",npc);
fprintf( file1,"\n--------------------\n");
fclose( file1 ); /* 關閉檔案 */
}
/*----------------------------------------------------------------------------*/
/* 列印 YOU WIN */
int print_WIN( char*npc, char*user )
{
FILE *file1; /* 宣告檔案指標 */
display ( list_a, list_b ); /* 顯示畫面 */
printf("\n\t\t\tYOU WIN!!\n");
printf("公佈答案 : ");
display_ans ( npc );
printf("你的答案 : ");
display_ans ( user );
printf("\n");
file1=fopen("list.txt","a"); /* 將 file1 指標 = 開啟檔案, a 接著寫入 */
fprintf(file1,"\nYOU WIN!!\n");
fprintf(file1,"公佈答案 : %s\n",npc);
fprintf(file1,"你的答案 : %s\n",user);
fprintf( file1,"\n--------------------\n");
fclose( file1 );
}
/*----------------------------------------------------------------------------*/
/* 列印 YOU LOSE */
int print_LOSE( char*npc )
{
FILE *file1; /* 宣告檔案指標 */
printf("\n\t\t\tYOU LOSE!!");
printf("\n公佈答案 : ");
display_ans ( npc );
file1=fopen("list.txt","a"); /* 將 file1 指標 = 開啟檔案, a 接著寫入 */
fprintf(file1,"\nYOU LOSE!!\n");
fprintf(file1,"公佈答案 : %s\n",npc);
fprintf( file1,"\n--------------------\n");
fclose( file1 ); /* 關閉檔案 */
}
/*----------------------------------------------------------------------------*/
/* 寫入來源資料的 1 ~ 9 */
int data_default ( char*data )
{
int i;
for ( i = 0; i < 9; i++ )
data [i] = i + 49;
data[9] = '\0'; /* 補上字串結尾 */
randomize(); /* 亂數種子表歸零 */
}
/*----------------------------------------------------------------------------*/
/* 來源資料交錯 ABCD => DBCA (配合 rand_source) */
int data_ins ( char*data )
{
int i;
for ( i = 0; i < 4; i += 2 )
swap_tmp ( data[i], data[8-i] );
}
/*----------------------------------------------------------------------------*/
/* 來源資料亂數交換,打亂源有次序 */
int rand_source ( char*data )
{
int a, b, i;
int rad_[2] = {0};
for ( i = 0; i < 20 ; i++ ) /* 亂數交換 20 次 */
{
rad_[0] = random (9);
rad_[1] = random (9);
data_ins ( data );
swap_tmp ( data[ rad_[0] ], data[ rad_[1] ] );
}
}
/*----------------------------------------------------------------------------*/
/* 從來源資料中的取 4 位數 為 NPC 數值的方法 */
int in_npc ( char*destination, char*source )
{
int i, j, k;
if ( ( random (2) + 1 ) == 1 ) /* 隨機決定取值的方法 1 或 2 */
{
for ( i = 0; i < 4; i++ ) /* 取 NPC 數值的方法 1: 亂數抓取法 */
{
j = random (9-i);
destination[i] = source[j]; /* 亂數取值 */
source[j] = ' '; /* 亂數取值後歸 ' ' */
move_data ( source ); /* 整理來源的 data */
}
}
else /* 取 NPC 數值的方法 2: 亂數連號抓取法 */
{
j = random (9);
if ( j < 5 ) /* 亂數值小於 5 時,取連續 4 位數 */
{
for ( i = 0; i < 4; i++ )
destination[i] = source[i+j];
}
else /* 亂數值大於 5 時,取連續 4 位數 */
{
for ( i = 0; i < 4; i++ )
{
if ( i + j > 8 )
destination[i] = source[i+j-9];
else
destination[i] = source[i+j];
}
}
}
destination[4] = '\0';
}
/*----------------------------------------------------------------------------*/
/* 來源資料中的特定的值記號的空值往後移動 (配合 in_npc 使用) */
int move_data ( char*data )
{
int i, j;
for ( i = 0; i < 9; i++ )
{
if ( data[i] == ' ' ) /* 以 ACSII 碼空白字元為整理對象 */
for ( j = 0; j < 9 - i ; j++ )
swap_tmp ( data[j+i] , data[j+i+1] );
}
}
/*----------------------------------------------------------------------------*/
/* 起始開始資料 */
int start_default ( char*npc, char*data_source )
{
data_default ( data_source ); /* 寫入來源資料的 1 ~ 9 */
rand_source ( data_source ); /* 來源資料亂數交換,打亂源有次序 */
in_npc ( npc, data_source ); /* 從來源資料中的取 4 位數 為 NPC 數值的方法 */
}
/*----------------------------------------------------------------------------*/
/* 顯示畫面 */
int display ( short*tab1, short*tab2 )
{
int i, j, k;
k = S / 2;
clrscr();
printf ("%4s\t%8s\t %s ","No.","4_Number","Check" );
printf ("\t%4s\t%4s\t%8s\t %s ","▕","No.","4_Number","Check" );
for ( i = j = 0; i < k; i++ )
{
printf ("\n %02d.", i+1);
if ( tab1[i] != 0 )
{
printf ("\t%8d \t %dA,%dB", tab1[i], tab2[j], tab2[j+1] );
if ( tab1[i+k] != 0 )
printf ("\t%4s\t %02d.\t%8d \t %dA,%dB",
"▕", i+k+1, tab1[k+i], tab2[S+j], tab2[S+j+1] );
else
printf ("\t%4s\t %02d.","▕", i+k+1);
}
else
printf ("\t%8s \t %s %s\t%4s\t %02d.","","","","▕", i+k+1);
j+=2;
}
puts("\n\n按 R 鍵重新遊戲;按 Q 鍵離開\n");
printf("請輸入猜測數字 4 位數,1 ~ 9 不可重複: ");
}
/*----------------------------------------------------------------------------*/
/* 資料顯示 NPC 或 uesr 的答案 */
int display_ans ( char*data )
{
int i;
for ( i = 0; i < 4; i++ )
printf ("%c ", data[i]);
puts(" ");
}
/*----------------------------------------------------------------------------*/
/* 輸入猜測數字 + 檢查 4 位數 + 有無重複 + 檢查 0 值 */
int input_number ( char*destination )
{
char input[10] = "";
int number = 0;
int i, j;
while( 1 )
{
reinkny:
display ( list_a, list_b ); /* 顯示畫面 */
scanf("%s",&input);
if ( input[0] == 'q' | input[0] == 'Q' | /* 檢查是否按下 Q 鍵中斷 */
input[0] == 'r' | input[0] == 'R' ) /* 檢查是否按下 R 鍵中斷 */
{
destination[0] = input[0]; /* 回傳中斷的按鍵值 */
destination[1] = '\0';
return 0;
/* return input[0]; */
}
number = atoi ( input );
if ( number > 999 & number < 10000 ) /* 檢查 4 位數 */
{
for ( i = 0; i < 4 ; i++ )
{
if ( input[i] == '0' ) /* 檢查 0 值 */
{
puts("\n");
printf ("發現 0 值,請重新輸入,");
pause();
goto reinkny;
}
for ( j = 0; j < 4; j++ )
if ( i != j )
if ( input[i] == input[j] ) /* 有無重複 */
{
puts("\n");
printf ("發現重複,請重新輸入,");
pause();
goto reinkny;
}
destination[i] = input[i];
}
break;
}
else
{
puts("\n");
printf ("位數不符合,請重新輸入,");
pause();
}
}
destination[4] = '\0';
}
/*----------------------------------------------------------------------------*/
/* 檢查猜測數字的 A,B 值 */
int check_AB ( char*inv, char*AB )
{
int i, j;
for ( i = 0; i < 4; i++ )
if ( inv[i] == inv[i+4] ) /* 檢查 A */
AB[0]++;
else /* 檢查 B */
for ( j = 0; j < 4 ; j++ )
if ( inv[i] == inv[j+4] )
AB[1]++;
}
/*----------------------------------------------------------------------------*/
/* 清除 1 次資料 */
int clrer_1st ( char*inv, char*AB )
{
AB[0]= 0;
AB[1]= 0;
strcpy ( inv,"" );
}
/*----------------------------------------------------------------------------*/
/* 清除 memory_list */
int clrer_list ( char*list_a, char*list_b )
{
int i;
for ( i = 0; i < S*2; i++ )
{
if ( i < S )
list_a [i] = 0;
list_b [i] = 0;
}
}
/*----------------------------------------------------------------------------*/
/* 再玩一次 */
int RePlay ( x )
{
char input;
if ( x >= 4 )
printf("要在玩一次嗎(Y/N) ? ");
else
printf("\n要退出遊戲了嗎(Y/N) ? ");
while(1)
{
input = getchar();
if ( input == 'y' | input == 'Y' )
if ( x >= 4 )
return 1;
else
return 0;
else if ( input == 'n' | input == 'N' )
if ( x >= 4 )
return 0;
else
return 1; ;
}
}
/*----------------------------------------------------------------------------*/