首页 > 编程语言 >Battleship程序设计语言与技术

Battleship程序设计语言与技术

时间:2024-04-11 13:45:38浏览次数:28  
标签:返回 船只 语言 int Battleship 位置 海洋 程序设计 方法

程序设计语言与技术
课业10:战舰截止日期以画布为准)对于HW10,你可以作为一个小组(不超过2名学生)工作。请提及您的每个代码文件顶部的合作者姓名。这个家庭课业比以前的课业更详细,所以请尽早开始它涉及以下主题:
● 继承和覆盖
● 访问修饰符
● 抽象课程(我们将在下一堂课中了解这些内容)
● 二维阵列
介绍
我们将向您展示如何构建一个简单的(只是因为没有图形用户界面GUI)版本的经典游戏《战舰》。
战舰通常是一个双人游戏,每个玩家都有一支舰队和一片海洋(对其他玩家隐藏),并试图成为第一个击沉其他玩家舰队的人。我们将只做一个播放器与计算机的版本,其中计算机放置船只,以及人类试图击沉它们。我们将在10x10的“海洋”上玩这个游戏,并将使用以下船只(“舰队”):1.程序设计语言与技术如何玩战舰请看一下这些规则,即使你以前玩过《战舰》。
请记住,这是一个人类与计算机的版本。计算机将十艘船放置在海洋上,这样就不会立即有船只彼此相邻,水平地、垂直地或对角地。看看以下内容合法和非法安置示例图:人类玩家不知道飞船在哪里。打印的海洋的初始显示2.程序设计语言与技术因此控制台显示了一个10乘10的“.”数组(参见海洋级的描述print()方法获取有关后续海洋显示外观的更多信息喜欢人类玩家试图通过指示特定的行和列编号(r,c)来击中船只。计算机会用一个信息来回应,说“命中”或“未命中”。当一艘船被击中但没有沉没时,该程序不会提供任何关于什么类型的信息的一艘船被击中。然而,当一艘船被撞沉时,程序会打印出一条消息“你刚刚击沉了一艘船。”每次拍摄后,计算机都会重新显示海洋信息当一艘船的每一个方块都被击中时,它就被“击沉”了。因此,它需要四支安打(四支不同的地方)击沉战列舰,三个击沉巡洋舰,两个击沉驱逐舰,一个击沉潜艇目标是用尽可能少的射击击沉舰队;最好的分数是
20(分数越低越好。)当所有船只都被击沉时,程序会打印出一条消息比赛结束了,告诉需要多少次射门。
实施细节将你的项目命名为“战列舰”,并将你的包命名为“战舰”。你的程序应该有以下8个类:
● 类战舰游戏o这是“main”类,包含main方法,该方法从创建海洋的实例
● 海洋级
o它包含一个10x10的船只阵列,代表一个“海洋”,以及一些操作它的方法
● 抽象类船舶o这个抽象类描述了所有船只的共同特征
o它有子类:
3.
程序设计语言与技术级战列舰扩展舰
● 描述一艘长度为4的船级巡洋舰扩展船
● 描述一艘长度为3的船级驱逐舰扩展舰
● 描述长度为2的船级潜艇扩展舰
● 描述长度为1的船EmptySea扩展船
● 描述海洋中没有船的部分
缺少一艘船是一种类型的船,这似乎很愚蠢,但这是一种这个技巧简化了很多事情。这样海洋中有某种“船”。)抽象类船舶抽象的Ship类具有以下实例变量。注意:字段应声明为私有,除非有充分的理由不这样做称为“封装”,这是使类中的字段为私有的过程,并且通过公共方法(例如getter和setter)提供对字段的访问。● 私人int bowRow
o包含船头的那一排(船的前部)
● private int-bowColumn
o包含船头的立柱(船的前部)
● 私有int长度
o船的长度
● 私有布尔水平
o一个布尔值,表示船只是水平放置还是
4.
程序设计语言与技术
垂直地
● private boolean[]命中
o一系列布尔值,指示船只的该部分是否被击中或

Ship类的默认构造函数为:
● 公共船舶(整数长度)
o此构造函数设置特定船舶的长度属性并初始化
基于该长度的命中数组
Ship类中的方法如下:
吸气剂
● public int getLength()
o返回船长
● public int getBowRow()
o返回与船头位置相对应的行
● public int getBowColumn()o返回船头立柱位置
● public boolean[]getHit()o返回命中数组
● 公共布尔值isHorizontal()
o返回船舶是否水平
Setters
● 公共void setBowRow(int行)
o设置bowRow的值
● public void setBowColumn(int列)5.
程序设计语言与技术
o设置bowColumn的值
● public void setHorizontal(布尔水平)o将实例变量的值设置为水平
抽象方法
● 公共抽象字符串getShipType()
o以字符串形式返回船舶类型。每种特定类型的船舶(例如。战列舰、巡洋舰等)必须覆盖并实施此方法
返回相应的船舶类型。
其他方法
● boolean okToPlaceShipAt(int行,int列,布尔水平,海洋)
o根据给定的行、列和方向,如果可以放置
船头位于该位置的该长度的船舶;否则为false。船不得与另一艘船重叠,或接触另一艘船(垂直、水平或对角),并且它不能“突出”到阵列之外。实际上也不会改变
船还是海洋——它只是说这样做是否合法。
● void placeShipAt(int行,int列,布尔水平,海洋大海
o将船“放入”大海。这涉及到给bowRow赋值,
bowColumn和船中的水平实例变量,并且它还涉及在船上的1个或多个位置(最多4个)中的每个位置放置对船的参考“海洋”对象中的数组。(注意:这将多达四个相同的
参考文献;你不能指一艘船的“一部分”,只能指整艘船。)o为了位置的一致性(尽管这并不会真正影响你的比赛方式游戏),让我们同意水平的船面向东方(船头在右端)和垂直的船朝南(船头在下端)。
这意味着,如果在中的位置(9,8)放置一艘水平战列舰海洋,船头在位置(9,8),船的其余部分占据
位置:(9,7),(9,6),(9,5)。
6.
程序设计语言与技术
如果你在海洋中的位置(4,0)放置一艘垂直巡洋舰,船头位于位置(4,0),船的其余部分占据位置:(3,0)、(2,0)。● boolean shootAt(int行,int列)o如果船的一部分占据了给定的行和列,而船还没有
击沉,将船的那一部分标记为“命中”(在命中数组中,索引0表示bow)并返回true;否则返回false。
● 布尔值isSunk()
o如果船的每个部分都被击中,则返回true,否则返回false● @以(权力)否决
public String到String()
o返回一个单字符字符串,用于Ocean的打印方法。这种方法如果船只已沉没,则应返回“s”,如果尚未沉没,则返回“x”。这该方法可以用于打印出海洋中被拍摄的位置;它
不应用于打印未被拍摄的位置。由于toString
所有船舶类型的行为完全相同,它被放置在船舶类中。
类别装运测试
这是Ship类的JUnit测试类。我们提供的ShipTest.java文件包含此课业的一些单元测试。将会有更多针对Ship类的测试我们将运行您的程序。将ShipTest.java导入java项目,然后在程序中的方法中实现足够的代码以通过所有测试。
生成额外的场景,并将测试用例添加到每个测试方法中。你应该有一个总数每个方法(包括所提供的)至少有3个不同的场景和有效的测试用例。例如,一种情况可能是,您在中的特定位置创建并放置一艘战列舰通过调用它的placeShipAt方法来识别海洋。然后你创建一个毁灭者,看看它是否可以通过调用其okToPlaceShipAt方法放置在特定位置。如果是,你就把它放好。然后你创建了一艘巡洋舰,并通过调用其
okToPlaceShipAt方法。如果是,请放置它。测试Ship类中的每个非私有方法。(不幸的是,您无法测试是私有的,因为它们在类之外无法访问。)
还要测试Ship的每个子类中的方法。您可以测试
船舶方法及其
同一文件中的子类。
7.
程序设计语言与技术
您必须包括注释来解释您的不同测试场景。
阶级战斗游戏
BattleshipGame类是“main”类,也就是说,它包含一个main方法。在这个课堂上你将设置游戏;接受用户的“射击”;显示结果;并打印最终版本分数。所有输入/输出都在这里完成(尽管其中一些是通过调用print()方法完成的在海洋课上。)所有计算将在海洋级和各种船舶中进行
类。
为了帮助用户,行数应该沿着数组的左边缘显示,列
数字应沿顶部显示。数字应该是0到9,代 写Battleship程序设计语言与技术而不是1到10。顶部左角正方形应为0,0。使用不同的字符指示包含的位置命中、包含未命中的位置以及从未被射击的位置。
例如,这是程序首次启动时的海洋显示,没有镜头
被解雇。
使用各种合理的方法。不要把所有的东西都塞进一两种方法中,但要试着把工作分成合理的部分,名字合理。
扩展抽象类Ship
使用抽象的船舶类作为每种船舶类型的父类。创建以下内容类,并将每个类保存在一个单独的文件中。
8.
程序设计语言与技术
● 级战列舰扩展舰
● 级巡洋舰扩展船
● 级驱逐舰扩展舰
● 级潜艇扩展舰
这些类中的每一个都有一个零参数的公共构造函数,其目的是设置长度变量设置为正确的值。从每个构造函数中,调用中的构造函数超级舱,每艘船都有适当的硬编码长度值。注意:您可以存储静态最终变量中的硬编码int值。
除了构造函数之外,您还必须重写此方法:
● @以(权力)否决
公共字符串getShipType()
o返回字符串“战列舰”、“巡洋舰”、“驱逐舰”之一,或“潜艇”,视情况而定。同样,这些类型的硬编码字符串值是静态最终变量的好候选者。
o此方法可用于识别您正在处理的船舶类型,
在任何给定的时间点,并消除了使用instanceof的需要EmptySea扩展船
你可能想知道为什么“EmptySea”是一种船。答案是海洋包含一个Ship数组,其每个位置都是(或可以是)某个Ship的引用。如果特定的位置是空的,显而易见的做法是在该位置放置一个null。但是这个显而易见的方法存在的问题是,每次我们查看阵列中的某个位置时必须检查它是否为空。通过将非null值放在空位置,表示如果没有船,我们可以省去所有的空检查。
EmptySea类的构造函数是:
● 公共EmptySea()
o这个零参数构造函数通过调用
超类中的构造函数
9
程序设计语言与技术
EmptySea类中的方法如下:
● @以(权力)否决
boolean shootAt(int行,int列)o此方法覆盖继承的shootAt(int行,int列)来自Ship,并且总是返回false表示没有命中任何东西● @以(权力)否决
布尔值isSunk()
o此方法覆盖从Ship继承的isSunk(),并且始终返回false表示您没有沉没任何东西
● @以(权力)否决
public String到String()
o返回要在Ocean的打印方法中使用的单个字符“-”字符串。(注意,这是在开枪但什么都没有的情况下要显示的角色已被击中。)
● @以(权力)否决
公共字符串getShipType()
o此方法只返回字符串“empty”
Class Ocean
实例变量
● 私人船舶[][]ships=新船舶[10][10]o用于快速确定哪艘船在任何给定位置
● 私人内部快照已点燃
o用户开枪的总次数
● private int hitCount
o一枪击中船只的次数。如果用户拍摄船只的同一部分
不止一次,每一次点击都会被计算在内,即使额外的“点击”不会起到作用用户任何好。
● 私人内部运输Unk
10
程序设计语言与技术
o沉没船只数量(共10艘)
建造师
● 公共海洋()
o创建一个“空”海洋(并用EmptySea对象填充船只阵列)。您可以创建一个私有的助手方法来完成此操作。
o还初始化任何游戏变量,例如已经发射了多少枪。
方法
● void placeAllShipsRandomly()o将所有十艘船随机放置在(最初是空的)海洋上。放置较大的船只在较小的船只之前,否则你可能最终没有合法的地方放置一艘大船。您将希望在java.util包中使用Random类,因此在Java API中。
o要帮助您编写此方法的代码,请参考printWithShips()方法如下。它将使您能够看到船只实际放置在
海洋,而你正在编写和调试你的程序。
● boolean isOccupated(int行,int列)o如果给定位置包含船只,则返回true;如果没有,则返回false● boolean shootAt(int行,int列)o如果给定位置包含一艘仍在漂浮的“真实”船只(而不是EmptySea),否则为false。此外,此方法还会更新的数量已经发射的子弹和命中次数。
o注意:如果一个位置包含一艘“真实”船只,shootAt每次都应返回true用户在相同的位置拍摄。一旦船只被“击沉”
在其位置的射击应该返回假。
● int getShotsFired()
o返回射击次数(在游戏中)
● int getHitCount()
o返回(在游戏中)记录的命中次数。所有点击都会被计算在内,而不仅仅是11
程序设计语言与技术
第一次击中给定的方块。
● int getShipsSunk()
o返回沉没的船只数量(在游戏中)
● 布尔值isGameOver()
o如果所有船只都已沉没,则返回true,否则返回false● Ship[][]getShipArray()
o返回10x10的舰船阵列。Ship类中接受的方法海洋参数需要能够看到这个数组的内容;这个
placeShipAt()方法甚至需要对其进行修改允许一个类中的方法直接访问另一类中的实例变量,
有时没有好的选择。
● 无效打印()
o打印海洋。为了帮助用户,应沿
数组的左边缘,列编号应沿顶部显示。
数字应该是0到9,而不是1到10。
o左上角的正方形应为0,0。
o'x':用'x'表示你向(真实)船只开火并击中的位置。(参考Ship类中toString的描述)
o“-”:使用“-”表示您开火但一无所获的位置
那里(参考EmptySea类中toString的描述)o's':使用's'表示沉船所在的位置。(参考
Ship类中toString的描述)
o'.':并使用“。”(句号)表示你从未向其开火的地点o这是Ocean类中唯一一个进行任何输入/输出的方法从未从海洋级中调用,只从战舰游戏中调用

例如,这里展示了两次射击失误后的海洋。
12
程序设计语言与技术
这是两枪未中,一枪击中(真实)船只后的海洋展示。
为了进一步帮助您了解如何编写此方法的代码,以下是
打印海洋的(高级)逻辑:
对于10乘10阵列中的每个位置(“海洋”)
● 如果该地点包含一艘沉没的船只,或者该地点曾遭到枪击并被击中或者什么也没找到
○ 打印船舶本身——这将调用船舶类或任何船舶中的toString已定义toString的子类(即EmptySea)● 否则打印“。”
● 无效打印WithShips()
o仅用于调试目的。
o与print()方法一样,该方法使用行号打印海洋沿阵列的左边缘显示,列编号沿
顶部。数字应该是0到9,而不是1到10。左上角正方形13
程序设计语言与技术
应为0,0。
o与print()方法不同,该方法显示船只的位置。此方法可以在开发和调试期间使用,以查看船只实际上被安置在海洋中。(TA也可以使用运行程序和评分时使用的方法。)它可以从调用战舰游戏类,在创建海洋并在其中放置船只之后。
o在实际播放之前,一定要注释掉对该方法的任何调用游戏和提交Java项目之前。
o'b':用'b'表示战列舰。
o'c':用'c'表示巡洋舰。
o'd':用'd'表示驱逐舰。
o's':用's'表示潜艇。
o“”:使用“”(单个空格)表示EmptySea。例如,以下是创建海洋后的海洋显示,调用
随机放置所有发货,然后调用printWithShips。欢迎您编写自己的其他方法。其他方法应具有
默认访问权限(可在包中的任何位置访问)并进行测试,如果您认为他们有一些在这个类之外的有用性。如果你认为它们在这个类之外没有任何用处,请标记他们是私人的。Class OceanTest14程序设计语言与技术这是Ocean类的JUnit测试类。我们提供的OceanTest.java文件包含此课业的一些单元测试。将有更多的海洋测试
我们将运行您的程序所针对的类。将OceanTest.java导入java项目并在程序中的方法中实现足够的代码以通过所有测试。生成附加场景并将测试用例添加到每个测试中

标签:返回,船只,语言,int,Battleship,位置,海洋,程序设计,方法
From: https://www.cnblogs.com/quanwang/p/18128916

相关文章

  • Java程序设计教程(第九版)1.4Java编程语言
    目录1.4Java编程语言Java程序注释标识符和保留字空白符1.4Java编程语言ava是第一种能够将编写的程序在Web浏览器中执行的语言Java程序基本结构:注释类(class)的定义方法注释注释应当揭示程序的初衷或意图,注释将被计算机忽略,并不影响程序执行两种注释形式://……(被......
  • Java程序设计教程(第九版)1.3网络
    目录1.3网络网络连接局域网和广域网因特网万维网统一资源定位器1.3网络网络就是将两台或多台计算机连接在一起,以便实现信息交换简单的计算机网络中,有一台用作文件服务器的计算机,用于保存网络用户需要用到的程序和数据网络连接网络连接方式近距离:点对点连接缺点......
  • Java程序设计教程(第九版)第一章计算机系统概述
    目录本章目标1.1计算机处理过程硬件软件数字计算机模拟技术数字技术二进制数1.2硬件组件计算机结构输入/输出设备主存储器和辅助存储器中央处理器本章目标软硬件关系软件类型及用法核心硬件及作用硬件如何协同执行程序、管理数据如何共享信息初解Java程序编......
  • 从零开始学习C语言 第一篇如何学习C语言
    想必大家和我一样,都是在B站上大学,或者报一些网课,我自己学习下来发现“鹏哥C语言”(B站上搜鹏哥C语言)是一个很不错的网课,里面有专属于你的问答群,四五个老师服务你一个人,并且有问必答,除了编程方面的,学习、生活方面的问题都可以和他们沟通,他们会像长者一样毫无保留地为你传道授业解......
  • 数据结构之顺序表(java语言版)
    顺序表是最简单的线性表,也就是数组。很多语言都把把它当做内置的基本数据类型,这里的数组没有对应数据结构的操作。数组是顺序存储的结构,连续分配一段内存用于存储数据。在逻辑结构和物理结构上都是连续的。顺序表建立在java内置的数组上建立顺序表。publicclassArray{ pri......
  • 数据结构之栈(java语言版)
    栈(stack):在逻辑上是一种线性存储结构,它有以下几个特点:1、栈中数据是按照"后进先出(LIFO,LastInFirstOut)"方式进出栈的。2、向栈中添加/删除数据时,只能从栈顶进行操作。栈通常包括的三种操作:push、peek、pop。push--向栈中添加元素。peek--返回栈顶元素。pop--返......
  • 数据结构之队列(java语言版)
    队列(Queue):在逻辑上是一种线性存储结构。它有以下几个特点:1、队列中数据是按照"先进先出(FIFO,First-In-First-Out)"方式进出队列的。2、队列只允许在"队首"进行删除操作,而在"队尾"进行插入操作。队列通常包括的两种操作:入队列和出队列。队列的种类也很多,单向队列,双向队列,循......
  • 数据结构之二叉树(java语言版)
    之前的都是线性结构,而树结构在计算机应用中的应用更加广泛。linux中的目录结构,某些数据库的底层存储等,都是采用树结构进行构架的。树的概念线性表是一对一的关系,而树是一对多的关系。树的结点:包含一个数据元素及若干指向子树的分支;孩子结点:结点的子树的根称为该结点的孩子;双......
  • 数据结构之图(java语言版)
    图是比树更复杂的结构,树是一对多的关系,图是多对多的关系。一、基本概念1、定义:图(graph)是由一些点(vertex)和这些点之间的连线(edge)所组成的;其中,点通常被成为"顶点(vertex)",而点与点之间的连线则被成为"边或弧"(edege)。通常记为,G=(V,E)。2、根据边是否有方向,将图可以划分......
  • 数据结构之Hash(java语言版)
    Hash表Hash也叫散列、哈希,是一种根据key-value对进行存储的数据结构。每个value对应一个key,这样查找的时候就无需遍历。Hash表使用数组作为底层结构,数组中每个区域都存储着Hash,这就是Hash表。列表、数组、树这些数据结构在查询数据时的时间复杂度通常为O(n),而Hash的时间复杂......