初学者c语言
C語言,我帶著你入門...
還沒入門不要緊...也不要認為學C就要很多的數學知識!
最要緊的,你要明白C語言是多么的好玩.
做一個<猜數字>游戲...
游戲規則參照文曲星里的猜數字:
輸入四入不重復的數字(中間用空格隔開)按<回車>后結果顯示在后邊,
形式為 " ? A ? B", 四個數中位置和數字都正確為 A,數字相同位置不同為 B,
當 4 A 0 B 時為猜對,每一局有8次機會.
如:原四個數為1234,則
1234 4 A 0 B
5678 0 A 0 B 沒有一個對.
1243 2 A 2 B 3,4雖對但位置錯.
明白了規則后,下手就容易了,也許你還沒頭緒,沒關系,一步一步來.
1.首先明白自己的游戲要做什么?
由玩家輸入四個數字,驗證這四個數和正確答案的關系,提供一個" X A X B"的
提示給玩家,再輸入...直至玩家猜對或到達八次.
2.游戲需要什么資源?
這個游戲并不需要什么特別的,只要一個printf,和scanf獲得輸入.
所以程序開頭:
#include <stdio.h>
加入標準輸入輸出,沒有它Turbo C不知道printf和scanf在哪來.
好,程序設計開始...
main(){
}
先把這個函數寫下來,這個叫主函數,一個程序就只有一個,也稱為程序入口函數,
你的程序就是從這里開始執行的.(是不是有點廢話?)
(以下操作都在main()中)
設定四個變量儲存正確答案:(也可以結個初值)
int a1,a2,a3,a4;
再設定四個變量諸存玩家的輸入:
int b1,b2,b3,b4;
設定一個變量諸存猜的次數并賦初值:
int n = 0;
設定兩個變量諸存結果A,B的個數:
int cA,cB;
準備工作完成,設定正確答案:
a1 = 3;
a2 = 5;
a3 = 9;
a4 = 7;
(當然你會抱怨正確答案是固定的,不要緊,下面會告訴你怎么產生隨機的效果,慢慢來.)
仔細想一想整個游戲流程...
大概是這樣的:
循環執行:
輸入;
對比正確答案;
輸出提示;
判斷是否猜對;
是:顯示勝利并退出循環,否:不理會;
次數加1;
判斷次數是否超出;
是:顯示失敗并退出循環;
循環結束;
那么,為了更容易理解,我們使用死循環,但要注意一點:里面必須有使循環結束的語句!
break;就是這個語句.
那么:
while(1){
...
break;
...
}
就寫下吧.while(XX){YYYY}是這樣工作的:
XX是不是0 (真)
不是:
執行 YYYY
是:退出循環
再檢查XX是不是不為0
...
不過你必須明確:break;會強制退出循環.
好,就這樣:
printf("\n\t Guess Numbers!\n\n"); /*打印一點提示信息*/
while(1){ /*開始用戶的輸入和程序輸出*/
printf("%d: ",n+1); /*打印當前是第幾次輸入*/
scanf("%d %d %d %d",&b1,&b2,&b3,&b3);
/*先不要知道為什么要在b1,b2這前加&,先認為,scanf就要這樣*/
cA=0;
cB=0; /*對比就要開始,先把結果置0*/
/*對比開始,我們用一堆if來為我們做事*/
/*雖然這有點累贅,但誰叫我們是初學者呢?不過告訴你,這種表達效率是最高的*/
if(a1 == b1) cA++;
if(a2 == b2) cA++;
if(a3 == b3) cA++;
if(a4 == b4) cA++; /*逐個檢查增加A的數量*/
if(a1 == b2 || a1 == b3 || a1 == b4) cB++;
if(a2 == b1 || a2 == b3 || a2 == b4) cB++;
if(a3 == b1 || a3 == b2 || a3 == b4) cB++;
if(a4 == b1 || a4 == b2 || a4 == b3) cB++;
/*窮舉檢查得到B的數量*/
/*當然,你必須保證玩家輸入的都不一樣,不然就會鬧出笑話*/
/*檢查對比結束*/
/*打印提示*/
printf("\t\t%d A %d B\n",cA,cB);
/*判斷是否勝利*/
if(cA == 4){
printf("\n\tWell Done!\n");
getch(); /*getch()的功能是輸入一個字符,不需要回車,也不會顯示到屏幕*/
/*通常用來暫停程序*/
break; /*退出循環*/
}
/*次數加一*/
n++;
/*判斷次數*/
if(n > 7){
printf("\nYou Lose!\n");
getch();
break;
}
}
整個游戲過程完成.
整理一下:
/*guess.c*/
#include <stdio.h>
main(){
int a1 = 0,a2 = 0,a3 = 0,a4 = 0;
int b1 = 0,b2 = 0,b3 = 0,b4 = 0;
int n = 0;
int cA,cB;
a1 = 3;
a2 = 5;
a3 = 9;
a4 = 7;
printf("\n\t Guess Numbers!\n\n");
while(1){
printf("%d: ",n+1);
scanf("%d %d %d %d",&b1,&b2,&b3,&b4);
cA=0;
cB=0;
if(a1 == b1) cA++;
if(a2 == b2) cA++;
if(a3 == b3) cA++;
if(a4 == b4) cA++;
if(a1 == b2 || a1 == b3 || a1 == b4) cB++;
if(a2 == b1 || a2 == b3 || a2 == b4) cB++;
if(a3 == b1 || a3 == b2 || a3 == b4) cB++;
if(a4 == b1 || a4 == b2 || a4 == b3) cB++;
printf("\t\t%d A %d B\n",cA,cB);
if(cA == 4){
printf("\n\tWell Done!\n");
getch();
break;
}
n++;
if(n > 7){
printf("\nYou Lose!\n");
getch();
break;
}
}
}
這樣一個簡單的猜數字游戲就做成了.
不過你可能得意不起來,因為這樣規定正確答案實在不能算個游戲,你說呢?
另外,我們還需驗證玩家的輸入是不是符合規定的"不重復"和"不出界".
于是我們來給這個游戲潤色潤色.
(以下部分要多一點C語言知識,如簡單數組)
第一:取得隨機的不重復的答案.
C標準函數庫stdlib里有兩個預定義的函數:
randomize() 復位隨機發生器.
int random(num) 生成一個0到num-1的隨機數.
好,說干就干!
可問題就來了,要怎么產生呢?
我們不能保證隨機產生的四個數都不同啊?
不過你可能會想,每次都隨機產生一個數直至與現有的不同,不就可以了么?
這的確是個不錯的想法,用在這里是不會產生問題的.
不過這種想法不符合程序設計的思想...我們無法確定這個過程在什么時候完成,
因為有可能三分鐘內沒有"生"出與其它不同的數,雖然可能性近乎不可能...
另外,如果要在1億個數中挑出5000萬個,怎么辦?顯然這是不可行的...
下面演示了一個新的算法:
1.創建一個諸存著0,1,2,...,9的數組.(10個元素)
2.打散這個數.
3.取數組的前四個(其它的也可以,不過是固定的)
打散數組可以這樣表達:
隨機取得數組的兩個位置,然后交換.當然做一兩次效果不明顯,我們讓它做500次或更多
就"看起來很無規律"了.
下面是代碼:
#include <stdlib.h> /*要用到隨機發生函數*/
在main()里:
int arr[10]={0,1,2,3,4,5,6,7,8,9); /*聲明數組,用來兩兩交換*/
int i,index1,index2; /*一個用于循環計數,index1,2用來保存產生的兩個隨機生成的數組位置*/
int temp; /*聲明臨時變量,你會體會到交換兩個數時臨時變量的作用*/
randomize(); /*復位隨機發生器,你可試一試沒有這句會有什么結果*/
for(i=0;i<500;i++){ /*做500次交換*/
index1=random(10);
index2=random(10); /*隨機產生0~9,剛好符合數組的下標最大小值*/
temp=arr[index1]; /*將arr[index1]的值保存到temp中*/
arr[index1]=arr[index2]; /*將arr[index2]放到arr[index1]中*/
arr[index2]=temp; /*從temp中取出原來arr[index1]的值給[index2]*/
}
a1=arr[0];
a2=arr[1];
a3=arr[2];
a4=arr[3]; /*取出前四個作為問題的答案,當然不一定前四個*/
........
下面解決玩家的"不守規距"問題.
玩家的輸入有時是不可預料的,也就是說,我們必須檢測并在有錯時讓玩家重輸.
重輸的話,超過這重循環,直接進入下一層循環而不往下執行 就行了,因為我們用的是死循環.
他再怎么錯都不怕循環會用完,并且次數本身不會被改.
首先,在玩家輸入之前給b1~b4,重新賦值,使其不合法.
b1=11;
b2=11;
b3=11;
b4=11;
在玩家輸入之后:
(這里又要用到窮舉法了,當然還有其它的方法,自己想)
if(b1==b2 || b1==b3 || b1==b4 || b2==b3 || b2==b4 || b3==b4){ /*四個數兩兩比較用六次*/
printf("Input error!\n");
continue;
}
if(b1<0 || b1>9 || b2<0 || b2>9 || b3<0 || b3>9 || b4<0 || b4>9){ /*不用理會這么長的if*/
printf("Input error!\n");
continue;
}
這樣的話,我們的代碼就這樣了:
/*guess.c*/
#include <stdio.h>
#include <stdlib.h>
main(){
int a1 = 0,a2 = 0,a3 = 0,a4 = 0;
int b1 = 0,b2 = 0,b3 = 0,b4 = 0;
int n = 0;
int cA,cB;
int arr[10]={0,1,2,3,4,5,6,7,8,9};
int i,index1,index2;
int temp;
randomize();
for(i=0;i<500;i++){
index1=random(10);
index2=random(10);
temp=arr[index1];
arr[index1]=arr[index2];
arr[index2]=temp;
}
a1=arr[0];
a2=arr[1];
a3=arr[2];
a4=arr[3];
printf("\n\t Guess Numbers!\n\n");
while(1){
printf("%d: ",n+1);
b1=11;
b2=11;
b3=11;
b4=11;
scanf("%d %d %d %d",&b1,&b2,&b3,&b4);
if(b1==b2 || b1==b3 || b1==b4 || b2==b3 || b2==b4 || b3==b4){
printf("Input error!\n");
continue;
}
if(b1<0 || b1>9 || b2<0 || b2>9 || b3<0 || b3>9 || b4<0 || b4>9){
printf("Input error!\n");
continue;
}
cA=0;
cB=0;
if(a1 == b1) cA++;
if(a2 == b2) cA++;
if(a3 == b3) cA++;
if(a4 == b4) cA++;
if(a1 == b2 || a1 == b3 || a1 == b4) cB++;
if(a2 == b1 || a2 == b3 || a2 == b4) cB++;
if(a3 == b1 || a3 == b2 || a3 == b4) cB++;
if(a4 == b1 || a4 == b2 || a4 == b3) cB++;
printf("\t\t%d A %d B\n",cA,cB);
if(cA == 4){
printf("\n\tWell Done!\n");
getch();
break;
}
n++;
if(n > 7){
printf("\nYou Lose!\n");
getch();
break;
}
}
}
轉載于:https://www.cnblogs.com/zfrankice/p/4174353.html
總結
- 上一篇: 思科交换机开机后显示switch:
- 下一篇: bzoj1430