C++遊戲程式 – 龜兔賽跑Ⅳ

來源:互聯網
上載者:User

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;
}

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.