---
title: CSCI 1100 - 作业 8 - 熊、浆果与游客重聚：类
subtitle:
date: 2024-09-13T15:36:47-04:00
slug: csci-1100-hw-8
draft: false
author:
  name: James
  link: https://www.jamesflare.com
  email:
  avatar: /site-logo.avif
description: 这篇博客文章提供了关于完成 CSCI 1100 课程作业 8 的详细指南，重点介绍了如何使用 Python 类模拟一个有熊和游客的莓果田。它涵盖了 BerryField、Bear 和 Tourist 类的创建，以及提交作业的说明。
keywords: ["Python", "类", "模拟"]
license:
comment: true
weight: 0
tags:
  - CSCI 1100
  - 作业
  - RPI
  - Python
  - 编程
categories:
  - 编程语言
collections:
  - CSCI 1100
hiddenFromHomePage: false
hiddenFromSearch: false
hiddenFromRss: false
hiddenFromRelated: false
summary: 这篇博客文章提供了关于完成 CSCI 1100 课程作业 8 的详细指南，重点介绍了如何使用 Python 类模拟一个有熊和游客的莓果田。它涵盖了 BerryField、Bear 和 Tourist 类的创建，以及提交作业的说明。
resources:
  - name: featured-image
    src: featured-image.jpg
  - name: featured-image-preview
    src: featured-image-preview.jpg
toc: true
math: false
lightgallery: false
password:
message:
repost:
  enable: false
  url:

# See details front matter: https://fixit.lruihao.cn/documentation/content-management/introduction/#front-matter
---

<!--more-->

## 概述
  
本作业满分 100 分，并将于2024年4月18日星期四晚上11:59:59截止。它包含三个部分，前两个部分的分值不高，最终可能为零分，主要是为了提供调试信息。请下载 `hw8_files.zip` 并将其解压到你的 HW8 目录中。你会找到每个部分的数据文件和示例输出。

本作业的目标是使用类进行编程。你将被要求编写一个模拟引擎，并使用类封装数据和功能。你有许多设计选择要做出，虽然我们以前做过类似的模拟，但这次的难度更高。特别重要的是你要慢慢来，先建立适用于简单情况的程序并测试它，然后再增加复杂性。我们将提供逐渐困难程度不同的测试用例，请确保你逐步开发并彻底测试。

## 提交说明

在本作业中，你第一次需要提交多个文件到 Submitty 以构成一个完整的程序。请仔细遵循以下指示。

每部分（第一部分、第二部分和第三部分）都需要编写主程序：`hw8_part1.py`、`hw8_part2.py` 和 `hw8_part3.py`。此外，你还需要为每个部分提交三个模块文件，其中每一个封装一个类。第一个是名为 `BerryField.py` 的文件，包含你的 BerryField 类；第二个是名为 `Bear.py` 的文件，包含你的 Bear 类；第三个是名为 `Tourist.py` 的文件，包含你的 Tourist 类。

一如既往，请确保你遵循程序结构的指导原则。我们将根据良好的程序结构和程序正确性进行评分。

请记住我们还将继续检查作业相似度。因此，请务必遵守合作指南中的可接受的合作程度。如果你需要复习，请从课程材料资源部分下载这些指南。我们对此非常重视，并且在必要时会毫不犹豫地施加处罚。

## 开始

你将需要为此作业编写至少三个类，分别对应 BerryField、Bear 和 Tourist。我们将给你很大的自由度来组织这三个类，但每个类必须有一个初始化器和一个字符串方法。其他的方法由你自己决定。每个类的描述如下：

### BerryField

`BerryField` 类必须维护并管理浆果的位置作为包含 (0, 0) 的左上角和 (N-1, N-1) 的右下角的行 X 列网格。每个位置可以容纳 0-10 单位的浆果。

- 初始化器类至少需要能够接收一个值网格（考虑我们之前的数独实验），并使用它来创建一个包含该网格中值的浆果田。
- 字符串方法至少需要能够生成当前浆果田的状态字符串。每个网格块必须以 `"{:>4}"` 格式化，如果有熊在位置上，则网格应该有一个 "B"；如果有游客在位置上，则网格应该有一个 "T"；如果同时有熊和游客，则网格应该有一个 "X"。如果没有熊或游客，则应该是该位置的浆果数量。
- 浆果会生长。`BerryField` 类必须提供一种方式来使浆果田生长。当浆果生长时，任何值为 `1 <= number of berries < 10` 的位置将增加一个浆果单位。
- 浆果也会扩散。任何没有浆果且相邻于有 10 单位浆果的位置在生长操作期间会获得一个浆果。

### Bear

每个熊都有一个位置和行走的方向。熊也总是很饿。你的程序必须管理两个熊列表：第一个包含当前正在田中行走的熊，第二个是等待进入田野的熊队列。

- 初始化器类至少需要能够接收行、列位置以及旅行方向。
- 字符串方法至少需要能够打印出熊的位置和行走方向，并且如果熊在睡觉，则显示这一点。
- 熊可以向北 (N)、南 (S)、东 (E)、西 (W)、东北 (NE)、西北 (NW)、东南 (SE) 或西南 (SW) 方向行走。一旦一只熊开始朝一个方向行走，它就不会改变方向。
- 熊总是很饿。每个回合，除非同一位置上有游客，否则熊会吃掉该空间的所有浆果，并然后朝其当前方向移动到下一个空间。在本回合中，这将一直持续直到熊吃了 30 单位的浆果或遇到一个游客为止。
- 对于熊和游客在同一地点的情况，在同一个回合内，熊不会吃任何浆果，但游客神秘地消失了并且熊会在三个回合后睡觉。
- 当一只熊达到田野边界（其行或列变为 -1 或 N）时，它将不再在田中行走，并且不需要再考虑。

### Tourist

每个游客都有一个位置。就像熊一样，你必须维护一个当前在田野中的游客列表和等待进入田野的游客队列。

- 初始化器类至少需要能够接收行、列位置。
- 游客可以看到距离他们当前位置 4 范围内的熊。
- 字符串方法至少需要能够打印出游客的位置以及自他上次看到熊以来经过的回合数。
- 游客站着观看。他们不会移动，但他们会离开田野的情况如下：
  - 如果三个回合没有看到熊，则他们会感到无聊并回家。
  - 如果他们同时可以看到三只熊，则会被吓跑并回家。
  - 如果一只熊撞到他们，游客会神秘消失并且再也无法在田野中找到。

## 执行

请记住从 Submitty 的课程材料部分获取 `hw8_files_F19.zip`。它包含两个示例输入文件和你程序的预期输出。

对于本作业，所需的所有初始化类和程序的数据都可以在 JSON 文件中找到。每个部分应该首先询问 JSON 文件名、读取该文件并根据所读数据创建所需的对象。下面的代码将帮助你完成此操作。

```python
f = open("bears_and_berries_1.json")
data = json.loads(f.read())
print(data["berry_field"])
print(data["active_bears"])
print(data["reserve_bears"])
print(data["active_tourists"])
print(data["reserve_tourists"])
```

你会看到田野是一个列表中的列表，其中每个 `[row][column]` 值是该位置的浆果数量；"active_bears" 和 "reserve_bears" 条目是定义熊的三元组 `(row, column, direction)` 的列表；以及 "active_tourists" 和 "reserve_tourists" 条目是定义游客的二元组 `(row, column)` 的列表。

## 第一部分

在第一部分中，读取 JSON 文件、创建你的对象，并简单报告初始模拟状态，打印浆果田、活跃熊和活跃游客。将程序命名为 `hw8_part1.py` 并与你开发的三个类一起提交。

## 第二部分

在第二部分中，先同上一样读取 JSON 文件、创建你的对象并再次打印初始模拟状态。然后运行五回合的模拟通过：

- 使浆果生长
- 移动熊
- 检查游客情况
- 打印模拟的状态

不用担心储备熊和储备游客进入田野，但报告离开的任何游客或熊。将程序命名为 `hw8_part2.py` 并与你开发的三个类一起提交。

## 第三部分

在第三部分中，做第二部分的所有事情，并进行以下更改：

- 在检查完游客之后，如果有剩余的储备队列中的熊且至少有 500 单位浆果，则将下一个储备熊添加到活跃熊列表。
- 然后，如果仍有等待进入田野的游客且至少有一个活跃熊，则将下一个储备游客添加到田野中。
- 不再在五个回合后停止，而是运行直到没有更多的熊在田里并且没有剩余的储备队列中的熊，或者如果没有更多的熊在田野上并且没有浆果了。
- 最终，在每五个回合报告一次状态，并且当模拟结束时再次报告。

在整个过程中，报告离开或进入田野的任何游客或熊。将程序命名为 `hw8_part3.py` 并与你开发的三个类一起提交。

## 支持文件

{{< link href="HW8.zip" content="HW8.zip" title="Download HW8.zip" download="HW8.zip" card=true >}}

## 解决方案

> [!NOTE]
> 我在这个作业中没有得到满分，所以我没有发布解决方案。我会重新做以获得满分的解决方案，并在此之后添加。