---
jupytext:
  formats: md:myst
  text_representation:
    extension: .md
    format_name: myst
rise:
  start_slideshow_at: beginning

kernelspec:
  display_name: Python 3
  language: python
  name: python3
---


# 游戏设计大作业 #

在做大作业之前，强烈建议先看一下[hw2](hw2.md)三个任务的答案。你可以点击链接，然后fork到自己的文件夹中，确保你对三个任务的代码都很了解了。

在你对任务四+五的代码没有弄懂之前，不要开始进行这次大作业。

—————————————————分割线——————————————————

到现在为止，你应该已经对小球的运动和碰撞有了相当程度的了解。 这次大作业你需要设计一个叫做Pong的游戏。Pong是有史以来第一款能够盈利的游戏，从此开启了今天的游戏行业。你的任务是实现一个符合要求的Pong。

Pong游戏试玩： https://www.ponggame.org/

首先，我们分解一下Pong游戏。为了使游戏运行起来，我们需要做什么？

## 物理运动 ##

乒乓球在桌子上移动，反弹墙壁和球拍。乒乓球满足以下要求：

* 它以恒定速度直线移动，反弹后速度大小不变。

* 反弹后的反射角度与进入时的角度相同（想象一下激光反射在镜子上）。

这与原始游戏不太一致。在Pong的经典版本中，乒乓会在每次碰撞后加速，直到有人失分。乒乓球在球拍上反射的角度也会因为球拍被击中的部位的不同而改变。你可以实现这个更高级的版本以获得附加分。

## 键盘操纵 ##

由于是双人游戏，所以你需要用到两组方向键来控制球拍。你可以规定球拍的运动规则：可以只上下运动，也可以上下左右都可以运动。如果是后者，你需要使两方球拍的活动区域大小一致，从而保证游戏公平性。

## 基本规则 ##
以下是游戏基本规则，你的游戏需要完成这些规则：

当乒乓球越过球拍并到达左右墙面时，游戏逻辑发生变化。以下事情会发生：

1. 得分的玩家得到一分，界面显示分数（显示分数代码参考上次作业答案）
2. 乒乓球被移回桌子中央。
3. 乒乓球获得一个初速度，使它向被得分的玩家移动。
4. 谁先得到5分谁是游戏赢家，屏幕上必须显示出谁赢了的信息。

## 附加规则 ##
以下是附加作业的规则。为了得到附加分，你需要在以下三个规则中至少选取两个完成：

1. 乒乓球在球拍上反射的角度会因为球拍被击中的部位的不同而改变。

2. 桌面上存在障碍物（形状、位置、数量不限），碰到障碍物小球会反弹。

3. 编写一个AI代理控制一侧球拍。这个球拍的移动受到与玩家相同限制：它必须与玩家以相同的速度移动，不能穿过墙壁，也不能加速。这样一个人就可以和计算机进行对战了。AI并不必须完美 - 如果它能够大约50%的时间击中乒乓球，那就没问题了。既然这是宋庆龄学校，我们要求使用深度学习来实现AI代理。 

我在开玩笑。你不需要使用深度学习，使用条件判断就可以完成AI的设计。

评分规则（共500分）：

* 程序可运行：50分

* 满足基本规则：150分

* 游戏公平性、美观性与交互性：50分

* 报告：200分

* 附加分：50分

## 报告 ##

你需要提交一份报告来介绍你的游戏设计。报告至少包括如下几块内容：

1. 标题和姓名：标题自拟

2. 整体介绍：简要介绍游戏的形式和规则。

3. 引言：介绍PyGame，以及此次游戏中用到的PyGame的模块和方法。

4. 游戏设计：描述游戏中的各个环节是如何设计的，环节至少包括：
* 游戏场景
* 物体
* 操纵
* 运动
* 碰撞检测
* 记分
* 判定输赢

此部分需要包括代码。

5. 讨论：对游戏设计完成过程中出现的问题的讨论和反思。

6. 总结：总结此次作业的成果和收获。

## 提交 ##

提交链接：https://replit.com/team/SCLS-CS2022/Pong

将代码写在main.py中，将报告上传至文件夹里。上传可以点击左上角Files旁边的New File。

引用代码或者寻求他人帮助需要注明出处。另外你需要对你提交代码的每一部分都非常清楚，否则视为抄袭。

提交时间：5月31日晚上22点。截止时间之前可以反复提交。不要错过截止时间，否则没有分数。