C++游戏程序 - 龟兔赛跑Ⅳ

来源:互联网 发布:网络电影推广方案 ppt 编辑:程序博客网 时间:2024/06/01 08:37

windows程序设计上的作业,由于还不知道怎么做窗口程序,就自己在字符界面下写了。其实界面不是最重要的,重要的是程序的逻辑部分。

第一次写C++程序,对C++的类还不是很熟……

龟兔赛跑Ⅳ ,运动员资料:
-------------------------------------------------------------------------------------------

运动员    运动类型    时间比例    速度

乌龟     快速爬行    50%      3m/s
       缓慢爬行    30%      1m/s
       滑到      20%      -6m/s

兔子     睡觉      20%      0m/s
       大步跳     20%      9m/s
       小步跳     30%      1m/s
       大步滑到    10%      -12m/s
       小步滑到    20%      -2m/s
-------------------------------------------------------------------------------------------

比赛场地: 控制台字符界面
跑道长度: 受屏幕宽度限制,60字符左右

要求做一个程序模拟两位运动员赛跑。(其实算不上游戏程序>_<||)

最后作出来界面成这个样子,下面黄色的标注是Fireworks画上去的:

程序运行后就会看见两个运动员争先恐后向前跑,时快时慢,有时候会跌倒而后退。

在跑道左边可以随时查看运动员当前的运动状态,兔子在睡觉,乌龟在快速爬行……

第一次写C++程序,第一次用C的继承,第一次用C++的存虚函数……

1。设计思路。

  由于两位运动员只有运动方式不同,其他属性可以公用,于是写了一个Athlete的抽象类作为公共基类。Athlete类中把run()函数定义为存虚函数,由两个运动员类实现具体细节。

2。如何在字符界面下做动画。

  这个动画十分简单,就是不断清除屏幕内容,然后将新的画面打印上去。清屏用system("cls")函数来实现,需要包含stdlib.h文件。

3。如何控制动画速度。

  在这个动画循环中,如果不加入任何延时的函数,程序一闪就没了。所以需要在每个画面显示之后停顿一定时间。实现这个功能可以使用clock()函数,需要头文件time.h。自定义一个delay()函数:
void delay(int dly){
   int st=clock();
   while(clock()<st+dly);
}

============================================================

贴一下代码,不怎么优美……:

/*
龟兔赛跑
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define L 50

//Class Athlete
// super class of Tortoise and Rabbit
class Athlete{
 private:
  char name[L];
  char state[L];
  char logo;
  int speed;
  int position;
  int ending;
 public:
  Athlete(){
   name[0]='/0';
   setState("Waitting");
   speed=position=0;
   ending=56;
  }
  //set
  void setName(char *s){ strcpy(name,s); }
  void setState(char *s){ strcpy(state,s); }
  void setLogo(char c){ logo=c; }
  void setSpeed(int x){ speed=x; }
  void setPosition(int x){ position=x; }
  void incPosition(int i){
   position+=i;
   if(position<0) position=0;
   if(position>ending) position=ending;
  }
  void setInfo(char *s,int v){
   setState(s);
   setSpeed(v);
  }
  //get
  char* getName(){ return name; }
  char* getState(){ return state; }
  char getLogo(){ return logo; }
  int getSpeed(){ return speed; }
  int getEnding(){ return ending; }
  int getPosition(){ return position; }
  //print state
  void printState(){
   int v=getSpeed();
   char op=v<0?'-':'+';
   v=v>0?v:-v;
   printf("%-8s:%9s %c%-2d",getName(),getState(),op,v);
  }
  //print track
  void printTrack(){
   char s=16,t=17,p=getLogo();
   int n=getPosition(),m=getEnding()-n-1;
   int i;

   if(position!=0) {printf("%c",s); n--; }
   for(i=0;i<n;i++) printf(" ");
   printf("%c",p);
   for(i=0;i<m;i++) printf(" ");
   if(position!=getEnding()) printf("%c",t);
  }

  //virtual run
  virtual void run()=0;
};

class Rabbit:public Athlete{
 public:
  Rabbit(){
   setName("Rabbit");
   setLogo(1);
  }
  //virtual run() - Rabbit
  virtual void run(){
   int e=rand()%100;
   if(e<20){
    setInfo("Sleep", 0); //Sleep 0 %20
   }
   else if(e<40){
    setInfo("BigJump", 9); //BigJump +9 %20
   }
   else if(e<50){
    setInfo("BigSlip", -7);//BigSlip -7 %10
   }
   else if(e<80){
    setInfo("Jump", 5);  //Jump +5 %30
   }
   else{
    setInfo("Slip", -3); //Slip -5 %20
   }
   incPosition(getSpeed());
  }
};

class Tortoise:public Athlete{
 public:
  Tortoise(){
   setName("Tortoise");
   setLogo(2);
  }
  //virtual run() - Tortoise
  virtual void run(){
   int e=rand()%100;
   if(e<20){
    setInfo("Slip",-3);  //Slip -3 %20
   }
   else if(e<50){
    setInfo("Crawl",2);  //Crawl +2 %30
   }
   else{
    setInfo("FastCrawl",4); //FastCrawl +4 %50
   }
   incPosition(getSpeed());
  }
};

void delay(int dly){
 int st=clock();
 while(clock()<st+dly);
}

bool win(Athlete *p){
 if(p->getPosition()==p->getEnding()) return true;
 else return false;
}

void printa(Athlete *p){
 printf("***  %s Reach the Ending ***/n",p->getName());
}

void printRound(int r){
 printf("++  Round  %d  ++/n",r);
}

int main()
{
 int i,k,m,n;
 int delayTime=500;
 int round=0;
 bool finish;
 char msg;
 Athlete *p,*q,*w;
 srand(time(NULL));

 while(true){
  p = new Rabbit();
  q = new Tortoise();
  round++;

  system("cls");
  printRound(round);
  p->printState(); p->printTrack(); puts("");
  q->printState(); q->printTrack(); puts("");
  printf("%-15s===  Press Enter to Start. 'Q' to Quit  ===/n","");

  msg=getchar();
  if(msg=='q'||msg=='Q') break;

  //play the match
  finish=false;
  while(!finish){
   
   system("cls");
   p->run();
   q->run();

   printRound(round);
   p->printState(); p->printTrack(); puts("");
   q->printState(); q->printTrack(); puts("");

   delay(delayTime);

   if(win(p)){ printa(p);finish=true; }
   if(win(q)){ printa(q);finish=true; }
   if(finish){
    printf("%20s====  Press Enter to Continue  ====","");
    getchar();
   }
  }
  delete p;
  delete q;
 }

 return 0;
}

 

原创粉丝点击