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