1.网格世界类
网格中每个元素存放各种生物对象的指针或者为空。模拟过程中,我们需要移动生物,还有繁殖和饥饿(死亡),所以在网格类中,我们可以将一只生物放到网格中;可以读取网格中的某个指定位置的生物,获取它的指针,以便在每一个time step中对它进行处理(移动、繁殖和饥饿死亡)。在一个time step中,网格中每只生物都要处理一遍,先狮蚁,后蚂蚁。另外,应该有一个显示网格的成员函数。
2.有机生物类
生物要能够放到网格中,所以每一只生物都有相关的函数。可以是构造函数,即构造生物的时候,同时指明放到网格的哪一个位置上。
有Move函数,Breed函数,Starve函数(是否饿死)。这些函数在派生类中有派生类自己的实现。所以,在有机生物类中,这些函数应该是纯虚函数,有机生物类是一个抽象类。
网格世界类中,从某个网格位置读取生物并处理时,需要知道是哪一种类型的生物(是狮蚁还是蚂蚁),所以,有机生物类里应该考虑如何返回生物的类型。简单的办法是,用不同的常量来表示狮蚁和蚂蚁。例如,用整数1表示狮蚁,2表示蚂蚁。在有机生物类中定义纯虚函数GetType,返回生物的具体类型。
3.蚂蚁类
实现Move函数,Breed函数,Starve函数和GetType函数。
4.狮蚁类
实现Move函数,Breed函数,Starve函数和GetType函数。
(二)细化:
1.网格世界类:
(1)属性。数据结构:网格世界中如何存放蚂蚁或狮蚁对象?
20*20的网格,用一个20*20的二维数组来表示,数组元素是什么类型?
(2)方法。网格世界类应该有哪些成员函数?
构造函数:初始化网格。
析构函数:释放掉所有生物。
Set函数:指定x,y位置(二维数组的下标),以及一只生物的地址(指针),将这只生物存入网格中。
Get函数:获取网格中x,y坐标上的生物的地址(指针)。
OneStep函数:在一个time step中,网格中每只生物都要处理一遍,包括移动、繁殖和饥饿。首先,把网格中的每一只生物在本轮是否移动过的标记moved先都标记为假(为什么?);其次,移动,先狮蚁,后蚂蚁,同时把该生物的moved标记为真;再次,把饥饿的狮蚁消灭掉;最后,繁殖。
Display函数:显示函数,显示网格中的具体情况。每个网格,如果是空,显示”.”;如果是蚂蚁,显示”o”;如果是狮蚁,显示”x”。
2.有机生物类
(1)属性
要记录每只生物的一些基本属性:属于哪个网格对象,具体在哪个位置上(x,y坐标),本轮是否移动过。另外,为了记录是否到了繁殖时间,要有一个跟踪器,即记录上次繁殖之后,又经历了多少次time step。
(2)方法
构造函数:
带参数的构造函数:指定网格对象和x、y位置,把构造的生物放到网格中。
析构函数:
Move函数,Breed函数,Starve函数和GetType函数为纯虚函数。
3.蚂蚁类
(1)属性
不需要再添加属性。
(2)方法
构造函数:
带参数的构造函数:指定网格对象和x、y位置,把构造的蚂蚁放到网格中。
析构函数:
Move函数:随机选择一个方向,看是否能移动,否则保持在原位置。
Breed函数:繁殖跟踪器+1.如果是3的倍数,就需要繁殖,同时跟踪器清零。
Starve函数:本模拟中蚂蚁不会饿死,所以仅返回false值即可。
GetType函数:返回蚂蚁的类型标记。
4.狮蚁类
(1)属性
狮蚁会饿死,需要添加一个属性,跟踪记录狮蚁饥饿了多少次time step。
(2)方法
构造函数:
带参数的构造函数:指定网格对象和x、y位置,把构造的狮蚁放到网格中。
析构函数:
Move函数:若有相邻蚂蚁,移动到单元网格,吃掉蚂蚁;否则,随机选择一个方向,看是否能移动,不能移动则保持在原位置。
Breed函数:繁殖跟踪器+1,如果是8的倍数,就需要繁殖,同时跟踪器清零。
Starve函数:饥饿跟踪器+1,如果是3的倍数,则饥饿并死亡,从网格中拿掉该狮蚁,同时跟踪器清零。
GetType函数:返回狮蚁的类型标记。
四、其它
(一)所有涉及的常量定义为类型常量。如:
const int ANTBREED = 3; //蚂蚁的繁殖周期为3个time steps
const int DOODLEBREED = 8; //狮蚁的繁殖周期为8个time steps
初始化网格世界时,用的狮蚁只数和蚂蚁只数,分别为5只和100只,也定义为类型常量。如:
const int INITIALANTS = 100;
const int INITIALBUGS = 5;
C++课程设计 求大神帮忙写下构造函数和析构函数
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
5条回答
- 知常曰明 2015-06-02 06:35关注
- 你是第三个在这里问这个的了。以前的问题找一找就有答案
- SOURCE.H
#ifndef __SOURCE_H__ #define __SOURCE_H__ struct Step { int dx; int dy; }; enum AnimalType { IsAnt, IsDoodlebug }; class Animal; class Cell { public: int x; int y; Animal *animal; public: Cell(int x0, int y0); Cell *nearbyCell(int dir); bool in(Animal *animal0); Animal *leave(); }; class Animal { protected: int maxBreedTime; int breedTime; int maxStarveTime; int starveTime; public: AnimalType type; Animal *next; Animal *prior; public: Animal(); virtual ~Animal(); public://virtual virtual Animal *breedChild() = 0; virtual bool canEat(AnimalType animal) = 0; virtual bool eat() = 0; public: Cell *cell; bool breed(); bool move(); void step(); }; class Ant :public Animal { public: Ant() ; public: virtual Animal *breedChild(); virtual bool canEat(AnimalType t); virtual bool eat(); }; class Doodlebug :public Animal { public: Doodlebug() ; public: virtual Animal *breedChild(); virtual bool canEat(AnimalType t); virtual bool eat(); }; Step Steps[4] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } }; int maxWidth; int maxHeight; Cell ***Status; Animal *DoodleBugs; Animal *Ants; #endif //__SOURCE_H__
SOURCE.CPP
#include <stdio.h> #include <stdlib.h> #include "Source.h" //======================================== // // Cell // Cell::Cell(int x0, int y0) { this->x = x0; this->y = y0; this->animal = NULL; } Cell *Cell::nearbyCell(int dir) { int x0 = this->x + Steps[dir].dx; int y0 = this->y + Steps[dir].dy; if (x0 < 0 || y0 < 0 || x0 >= maxWidth || y0 >= maxHeight) return NULL; else { return Status[x0][y0]; } } bool Cell::in(Animal *animal0) { if (this->animal != NULL) return false; else { animal0->cell = this; this->animal = animal0; return true; } } Animal *Cell::leave() { Animal *theAnimal = this->animal; theAnimal->cell = NULL; this->animal = NULL; return theAnimal; } //======================================== // // Animal // Animal::Animal() { this->cell = NULL; this->breedTime = 0; this->starveTime = 0; this->prior = NULL; this->next = NULL; } bool Animal::breed() { if (this->breedTime >= maxBreedTime) { for (int i = 0; i < 4; i++) { Cell *c = this->cell->nearbyCell(i); if (c != NULL && c->animal == NULL) { c->in(this->breedChild()); this->breedTime = 0; return true; } } } return false; } bool Animal::move() { int dir = rand() % 4; Cell *c = this->cell->nearbyCell(dir); if (c == NULL) return false; else if (c->animal == NULL) { c->in(this->cell->leave()); return true; } } void Animal::step() { bool dosth = false; this->breedTime++; this->starveTime++; dosth |= this->breed(); dosth |= this->eat(); if (!dosth) { this->move(); } if (this->maxStarveTime > 0 && this->starveTime >= this->maxStarveTime) { //starve this->cell->leave(); delete (this); } } Animal::~Animal() { Animal *t = this->next; this->prior->next = t; if (t != NULL) t->prior = this->prior; } //======================================== // // Ant // Ant::Ant() : Animal() { this->type = IsAnt; this->maxStarveTime = -1; this->maxBreedTime = 3; if (Ants != NULL) { this->prior = Ants; this->next = Ants->next; if (Ants->next != NULL) Ants->next->prior = this; Ants->next = this; } } Animal *Ant::breedChild() { return new Ant(); } bool Ant::canEat(AnimalType t) { return false; } bool Ant::eat() { return false; } //======================================== // // Doodlebug // Doodlebug::Doodlebug() :Animal() { this->type = IsDoodlebug; this->maxStarveTime = 3; this->maxBreedTime = 8; if (DoodleBugs != NULL) { this->prior = DoodleBugs; this->next = DoodleBugs->next; if (DoodleBugs->next != NULL) DoodleBugs->next->prior = this; DoodleBugs->next = this; } } Animal * Doodlebug::breedChild() { return new Doodlebug(); } bool Doodlebug::canEat(AnimalType t) { if (t == IsAnt) return true; else return false; } bool Doodlebug::eat() { for (int i = 0; i < 4; i++) { Cell *c = this->cell->nearbyCell(i); if (c!=NULL && c->animal != NULL && this->canEat(c->animal->type)) { Animal *theAnimal = c->leave(); delete(theAnimal); this->starveTime = 0; return true; } } return false; } //======================================== // // main // void randomSet(Animal *animal0) { srand(0); int x; int y; do { x = rand() % maxWidth; y = rand() % maxHeight; } while (Status[x][y]->animal != NULL); Status[x][y]->in(animal0); } void printoutHead() { printf("+"); for (int i = 0; i < maxWidth; i++) { printf("="); } printf("+\n"); } void printoutDetail(int r) { printf("|"); for (int i = 0; i < maxWidth; i++) { if (Status[i][r]->animal == NULL) printf(" "); else { switch (Status[i][r]->animal->type) { case IsAnt: printf("O"); break; case IsDoodlebug: printf("X"); break; default: printf("?"); break; } } } printf("|\n"); } void printout() { printoutHead(); for (int i = 0; i < maxHeight; i++) printoutDetail(i); printoutHead(); } void main() { int nDoodleBug; int nAnt; printf("请输入区域宽度:"); scanf("%d", &maxWidth); printf("请输入区域高度:"); scanf("%d", &maxHeight); printf("请输入初始狮蚁数量:"); scanf("%d", &nDoodleBug); printf("请输入初始蚂蚁数量:"); scanf("%d", &nAnt); //maxWidth = 3; //maxHeight = 4; //nDoodleBug = 2; //nAnt = 5; Status = new Cell**[maxWidth]; DoodleBugs = new Doodlebug(); Ants = new Ant(); for (int i = 0; i < maxWidth; i++) { Status[i] = new Cell*[maxHeight]; for (int j = 0; j < maxHeight; j++) { Status[i][j] = new Cell(i, j); } } for (int i = 0; i < nDoodleBug; i++) { randomSet(new Doodlebug()); } for (int i = 0; i < nAnt; i++) { randomSet(new Ant()); } printout(); system("pause"); while (true) { Animal *a = DoodleBugs->next; Animal *a0; for ( a0 = (a == NULL ? NULL : a->next); a != NULL; a = a0, a0 = (a == NULL ? NULL : a->next)) a->step(); a = Ants->next; for ( a0 = (a == NULL ? NULL : a->next); a != NULL; a = a0, a0 = (a == NULL ? NULL : a->next)) a->step(); printout(); system("pause"); } }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥60 版本过低apk如何修改可以兼容新的安卓系统
- ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
- ¥50 有数据,怎么建立模型求影响全要素生产率的因素
- ¥50 有数据,怎么用matlab求全要素生产率
- ¥15 TI的insta-spin例程
- ¥15 完成下列问题完成下列问题
- ¥15 C#算法问题, 不知道怎么处理这个数据的转换
- ¥15 YoloV5 第三方库的版本对照问题
- ¥15 请完成下列相关问题!
- ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?