《C游戏编程从入门到精通》第一章心得和代码分析

        这本书还是很不错的,虽然没有很炫的游戏制作,但是涉及到游戏制作的基础内容,而且范围也很广,值得推荐。我说过要踏踏实实学习的,所以现在把学习成果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

 


 

 

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值