这本书还是很不错的,虽然没有很炫的游戏制作,但是涉及到游戏制作的基础内容,而且范围也很广,值得推荐。我说过要踏踏实实学习的,所以现在把学习成果post上来,一步一步,也可以自我监督呀!
第一章 猜数字游戏
本书提供了一个通用的游戏模版,类似于上学时对于理论知识用自己的语言以特例表达出来,很形象,很有特色,如下:
int main(){
int a,b,c; //Init
while(a!='q'){ /***game loop starts***/
printf("%d",c); //draw screen
a=getch(); //get inputs
c=a*b; //change var
} /***game loop ends***/
}
可见一个游戏的要素可以分为:
1. init
2.1 game loop (starts)
3. draw
4. handle inputs
5. change var
2.2 game loop (ends)
然后书上提出了制作文本游戏的要求,也就是没有图形的游戏,可以集中精力处理游戏算法问题。它的例子是“猜数字”。玩法:程序给出一个4位数字,玩家猜测,如果猜测的数字的某一位和给出数字某一位,位置和数值都相等,就记为1A,如果数值相等,为数不等则计为1B,如:给出1234,猜1245,则为2A1B,如此反复,直到最后猜对,记为4A0B,游戏结束(或重新开始)。以下为我写的程序,不是作者的程序。
分析:这个程序核心问题是比较数字,并做标记,我想到了利用两个数组每位依次比较的方法,利用2次for循环。代码如下:
for(i=0;i<4;++i)
for(j=0;j<4;++j){
if(Qus[i]==Ans[j]){ //Qus[] is the Question array
if(i==j)++n; //Ans[] is the Answer array
else ++m;
}//if
}//for
所以整个流程为:
1、给出要猜的数值 //init
2、把数值导入Ans[] //init
2、开始循环 //game loop starts
3、输入答案数值 //rescive inputs
4、比较并记录 //handle inputs
5、输出 //draw screen
6、结束循环 //game loop ends
对于1,最开始我指定了一个值,后来用了随机数,可参考msdn,具体方法如下: 对于2,我利用了在考程序员时见到的一种算法,观察下列数据:
#include<time.h>
//init random number "guess"
srand((unsigned)time(NULL));
int RANGE_MIN = 1000;
int RANGE_MAX = 9999;
guess = (((double) rand() /
(double) RAND_MAX) * RANGE_MAX + RANGE_MIN);
given 5210
/1000 5 %10 5
/100 52 %10 2
/10 521 %10 1
/1 5210 %10 0
可见将数据处以某数e,再取10的模就可以了,具体来说e分别是1000,100,10,1,代码如下:
//init Qus[]
e=1000;
for(j=0;j<4;++j){
Qus[j]=guess/e%10;
e/=10;
}
完整的代码如下:
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
//Qus[] :question number
//Ans[] :answer number
//n for A;m for B
int Qus[4],Ans[4],
i,j,m,n,e,
guess;
int main(){
while(1){
//init random number "guess"
srand((unsigned)time(NULL));
int RANGE_MIN = 1000;
int RANGE_MAX = 9999;
guess = (((double) rand() /
(double) RAND_MAX) * RANGE_MAX + RANGE_MIN);
//init Qus[]
e=1000;
for(j=0;j<4;++j){
Qus[j]=guess/e%10;
e/=10;
}
//-----------check--------------
for(j=0;j<4;++j)
printf("%d/n",Qus[j]);
//------------------------------
printf("enter your answer :");
//***start guessing*****//
do{
n=0;m=0;
scanf("%d",&guess);
//init Ans[]
e=1000;
for(j=0;j<4;++j){
Ans[j]=guess/e%10;
e/=10;
}
//compare
for(i=0;i<4;++i)
for(j=0;j<4;++j){
if(Qus[i]==Ans[j]){
if(i==j)++n;
else ++m;
}//if
}//for
printf("%dA%dB/n",n,m);
}while(n!=4);
//***end guessing*****//
printf("Bingo!/n);
}
}
compare算法还有不完备的地方,就是当出现6442这种由重复的数字时,AB会累计计数,猜对了显示为4A2B。整个程序还有些问题,比如没有禁止输入字母或位数不对的数字,没有游戏结束点,以后再修改吧!又像一起学习的同志们一起到我的blog讨论吧!希望能进入文档中心!!!
《C游戏编程从入门到精通》下载地址:http://book1.ibook8.com/ibook8com/pc2005/80/1/c游戏编程从入门到精通.rar