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