指针编程:从赛马模拟到UML与调试
立即解锁
发布时间: 2025-08-19 01:36:33 阅读量: 1 订阅数: 6 


C++面向对象编程入门与实践
# 指针编程:从赛马模拟到UML与调试
## 1. 赛马模拟程序概述
在编程中,我们可以通过模拟赛马比赛来学习和应用多种编程概念。下面是一个赛马模拟程序的核心代码结构:
```cpp
// 马类
class horse {
private:
float finish_time; // 这匹马的完成时间
float distance_run; // 到目前为止跑过的距离
int horse_number; // 马的编号
const track* ptrTrack; // 指向赛道的指针
public:
horse(const int n, const track* ptrT); // 构造函数
~horse(); // 析构函数
void display_horse(const float elapsed_time); // 显示马的信息
};
// 赛道类
class track {
private:
horse* hArray[maxHorses]; // 指向马的指针数组
int total_horses; // 马的总数
int horse_count; // 到目前为止创建的马的数量
const float track_length; // 赛道长度(弗隆)
float elapsed_time; // 比赛开始以来的时间
public:
track(float lenT, int nH); // 构造函数
~track(); // 析构函数
void display_track(); // 显示赛道
void run(); // 开始比赛
float get_track_len() const; // 返回赛道总长度
};
```
### 1.1 马类的实现
马类主要负责管理每匹马的状态,包括完成时间、跑过的距离等。以下是马类的具体实现:
```cpp
// 马类构造函数
horse::horse(const int n, const track* ptrT) :
horse_number(n), ptrTrack(ptrT),
distance_run(0.0) { }
// 马类析构函数
horse::~horse() { /*empty*/ }
// 显示马的信息
void horse::display_horse(float elapsed_time) {
set_cursor_pos( 1 + int(distance_run * CPF),
2 + horse_number*2 );
set_color(static_cast<color>(cBLUE+horse_number));
char horse_char = '0' + static_cast<char>(horse_number);
putch(' '); putch('\xDB'); putch(horse_char); putch('\xDB');
if( distance_run < ptrTrack->get_track_len() + 1.0 / CPF ) {
if( rand() % 3 ) // 大约每3次跳过1次
distance_run += 0.2F; // 前进0.2弗隆
finish_time = elapsed_time; // 更新完成时间
} else {
int mins = int(finish_time)/60;
int secs = int(finish_time) - mins*60;
cout << " Time=" << mins << ":" << secs;
}
}
```
### 1.2 赛道类的实现
赛道类负责管理整个比赛,包括创建马、显示赛道、开始比赛等。以下是赛道类的具体实现:
```cpp
// 赛道类构造函数
track::track(float lenT, int nH) :
track_length(lenT), total_horses(nH),
horse_count(0), elapsed_time(0.0) {
init_graphics(); // 启动图形界面
total_horses = (total_horses > maxHorses) ? maxHorses : total_horses;
for(int j=0; j<total_horses; j++) // 创建每匹马
hArray[j] = new horse(horse_count++, this);
time_t aTime; // 初始化随机数
srand( static_cast<unsigned>(time(&aTime)) );
display_track();
}
// 赛道类析构函数
track::~track() {
for(int j=0; j<total_horses; j++) // 删除每匹马
delete hArray[j];
}
// 显示赛道
void track::display_track() {
clear_screen(); // 清屏
for(int f=0; f<=track_length; f++) // 每个弗隆
for(int r=1; r<=total_horses*2 + 1; r++) // 每个屏幕行
{
set_cursor_pos(f*CPF + 5, r);
if(f==0 || f==track_length)
cout << '\xDE'; // 绘制起点或终点线
else
cout << '\xB3'; // 绘制弗隆标记
}
}
// 开始比赛
void track::run() {
while( !kbhit() ) {
elapsed_time += 1.75; // 更新时间
for(int j=0; j<total_horses; j++) // 更新每匹马
hArray[j]->display_horse(elapsed_time);
wait(500);
}
getch(); // 消耗按键
cout << endl;
}
// 返回赛道总长度
float track::get_track_len() const {
return track_length;
}
```
### 1.3 主函数
主函数负责获取用户输入的赛道长度和马的数量,并创建赛道对象开始比赛:
```cpp
int main() {
float length;
int total;
// 获取用户输入
cout << "\nEnter track length (furlongs; 1 to 12): ";
cin >> length;
cout << "\nEnter number of horses (1 to 7): ";
cin >> total;
track theTrack(length, total); // 创建赛道
theTrack.run(); // 开始比赛
return 0;
}
```
### 1.4 模拟程序的时间管理
在模拟程序中,时间管理是一个重要的方面。在赛马模拟程序中,通过在`track::run()`函数中不断更新`elapsed_time`来模拟时间的流逝:
```mermaid
graph TD;
A[开始比赛] --> B[更新时间];
B --> C[更新每匹马的状态];
C --> D[等待500毫秒];
D --> E{是否按键};
E -- 否 --> B;
E -- 是 --> F[结束比赛];
```
### 1.5 删除对象指针数组
在程序结束时,需要正确删除赛道对象中指向马的指针数组。不能简单地使用`delete[] hArray`,因为这样只会删除指针数组,而不会删除指针所指向的马对象。正确的做法是逐个删除每个马对象:
```cpp
for(int j=0; j<total_horses; j++) // 删除每匹马
delete hArray[j];
```
### 1.6 使用`putch()`函数
为了让每匹马显示不同的颜色,使用了`putch()`函数。因为不是所有编译器都允许`cout`生成颜色,而一些旧的C函数可以实现这一点。在显示马的信息时,使用`putch()`函数绘制马的图形:
```cpp
putch(' '); putch('\xDB'); putch(horse_char); putch('\xDB');
```
这个函数需要包含`CONIO.H`头文件,但在`HORSE
0
0
复制全文
相关推荐










