---
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` 类必须维护和管理浆果的位置，作为一个方形行 X 列的网格，(0,0) 是左上角，(N-1, N-1) 是右下角。每个空间包含 0-10 个浆果单位。

- 初始化类必须至少能够接收一个值网格（想想我们的数独实验），并使用它创建一个包含网格中值的浆果田。
- 字符串函数必须至少能够生成当前浆果田状态的字符串。网格中的每个块必须使用 `"{:>4}"` 格式说明符进行格式化。如果该位置有熊，网格应显示 `"B"`；如果有游客，网格应显示 `"T"`；如果既有熊又有游客，网格应显示 `"X"`。如果既没有熊也没有游客，它应显示该位置的浆果数量。
- 浆果会生长。`BerryField` 类必须提供一种方法来生长浆果田。当浆果生长时，任何值为 `1 <= 浆果数量 < 10` 的位置将增加一个浆果。
- 浆果也会扩散。任何没有浆果且与有10个浆果的位置相邻的位置，在生长操作期间将获得1个浆果。

### Bear

每只熊都有一个位置和一个它们正在行走的方向。熊也非常饥饿。在你的程序中，你必须管理两组熊。第一组是当前在田野中行走的熊。第二组是等待进入田野的熊队列。

- 初始化类必须至少能够接收行和列位置以及行进方向。
- 字符串函数必须至少能够打印出熊的位置、行进方向以及熊是否在睡觉。
- 熊可以向 `北 (N)`、`南 (S)`、`东 (E)`、`西 (W)`、`东北 (NE)`、`西北 (NW)`、`东南 (SE)` 或 `西南 (SW)` 行走。一旦熊开始向某个方向行走，它永远不会转弯。
- 熊总是饥饿的。每回合，除非同一位置有游客，否则熊会吃掉该空间中所有可用的浆果，然后沿着当前方向移动到下一个空间。这种情况会持续到当前回合结束，直到熊吃了30个浆果或遇到游客。
- 对于熊和游客在同一位置的特殊情况，熊不会吃任何浆果，但游客会神秘消失，熊会睡三回合。
- 一旦熊到达田野的边界（其行或列变为-1或N），它就不再在田野中行走，不再需要考虑。

### Tourist

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

- 初始化类必须至少能够接收行和列位置。
- 如果熊在游客当前位置的4个单位内，游客会看到熊。
- 字符串函数必须至少能够打印出游客的位置以及自上次看到熊以来经过的回合数。
- 游客会站着观看。他们不会移动，但如果以下情况发生，他们会离开田野：
  1. 三回合内没有看到熊；他们会感到无聊并回家。
  2. 他们同时看到三只熊；他们会感到害怕并回家。
  3. 一只熊撞到他们；他们会神秘消失，不再出现在田野中。

## 执行

记得从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个浆果，将下一只备用熊添加到活跃熊中。
- 然后，如果备用队列中仍有游客且至少有一只活跃的熊，将下一只备用游客添加到田野中。
- 不要在5回合后停止，而是运行直到田野中没有更多的熊且备用列表中没有更多的熊，或者田野中没有更多的熊且没有更多的浆果。
- 最后，不要每回合报告状态，而是每5回合报告一次，并在模拟结束时再次报告。

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

## 支持文件

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

## 解决方案

> [!NOTE]
> 我没有在这份作业中获得满分，所以我没发布解决方案。我可能会重做以获得满分解决方案。之后，我会在这里添加它。