当前位置: 首页 > news >正文

5.编写程序 超强力方法

5.1 创建战舰游戏

创建一个类似战舰的游戏:攻击网站

有一种棋盘类的战舰游戏,目标是要猜测对方战舰的坐标,然后轮流开炮攻击,命中数发就可以打沉对方的战舰。不过我们不喜欢战争,只要打垮这些达康公司就好(因为与商业行为有关,如此一来本书就可以归类在经营企管的费用上)。

游戏目标:以最少的猜测次数打掉计算机所安排的达康公司(Dot Com)网站。计算机会根据你的表现来评分。

初始设置:程序启动后,计算机会在虚拟的7×7方格上安排3个达康网站。安排完成后,游戏会要求你开始猜坐标。

进行游戏:因为我们还没有学到图形接口的程序设计,所以这一版会在命令栏上进行。计算机会提示你输入所猜测的位(格子),你会输入“A3”或“C5”等。计算机会反馈给你命中“Hit”没中“Miss”或击沉“Sunk”等回应。当你清光所有的达康时,游戏会列出你的分数并结束。

首先进行高层设计 

游戏流程:

1.玩家启动游戏

A.计算机创建3个达康网站

B.将此3个达康网站停在虚拟机战场上

2.游戏开始

重复下面的操作直到所有达康网站被歼灭为止

A.提示玩家输入坐标

B.检查是否击中、没中或击沉。若命中就删除格子,击沉就删除达康网站

3.游戏结束

根据猜测次数给分

5.2 简单版

攻击网站游戏 简单的开始

1.游戏启动 创建单一的DotCom并指定3个各自在共7格的横列中的位置。相对于使用“A2"的表示法,现在的为止只需要数字就可以。

2.开始游戏 提示玩家猜测,然后检查是否名中国DotCom的格子。若是,则递增numOfHits变量的值。

3.游戏结束 3格都命中时游戏结束(当numOfHits的值递增到3),并告诉玩家他们花了多少次才干掉这个DotCom 

看起来我们至少需要两个类;Game类和DotCom类。但在我们着手开发完整功能版之前,先从一个简单版本开始。简单版称为“Simple Dot Com Game”。这一章会创建出此版本,下一章会进行豪华版的开发工作。该版本的东西都比较简单。相对于二维方阵,我们只使用横列,并且只设定一家达康公司。然而游戏的目标仍然相同,因此游戏还是会需要做出DotCom的实例,将它指派在横列上,取得玩家的输入,并在所有的DotCom格子被命中时结束游戏。这个简单版能够作为豪华版的踏脚石。

在这个简单版中,Game这个类没有实例变量,且所有的程序代码都在main()中。也就是说程序启动执行main()只会做出一个DotCom的实例,挑出一个位置来放3个连续的格子,要 求玩家猜测,检查是否命中,重复这些步骤直到3格都被命中为止。 

要知道虚拟的横列是虚拟的。换言之,它并没有出现在程序中,只要玩家与计算机都知道有3个连续的格子会出现在7格的横列中就好,横列并不一定要表现在程序代码中。你也许会想要用有7个int的数组来代表横列,并用其中3个元素代表达康出现的位置,但其实不需这么做。我们只需要3个元素的数组来代表DotCom占据的位置。

开发类

身为一个程序员,你或许会有编写程序的方法论(methodology)/过程(process)/步骤(approach)。我们的顺序设计是先通过编写程序来帮助你了解和学习我们的想法,并不需要遵循我们实际上怎样写程序的方式。当然啦,实际工作时,你会遵循个人、项目或客户的规范。但我们完全是依照我们自己的想法去做的。当我们在创建Java的类以当作“学习经验”时,程序会像下面这样:
口 找出类应该做的事情。
口 列出实例变量和方法。
口 编写方法的伪码(稍后说明)。
口编写方法的测试用程序。
口 实现类。
口 测试方法。
口 除错或重新设计。
口 邀请辣妹参加庆功派对(没有成功过)

我们会让每个类写出下列的事物:

伪码:能帮助你专注于逻辑而不需要顾虑到程序语法

测试码:测试用的程序代码

真实码:实际设计出的真正Java程序代码

5.3 编写伪码

伪码是介于真正的Java程序与正常英语之间的语言,大致上包括3部分:实例变量的声明、方法的声明和方法的逻辑。其中最重要的是方法的逻辑,因为它会定义出会发生“什么事”

编写方法的实现部分
开始编写真正可用的方法程序代码

在我们开始编写方法之前,让我们先退回一步来写出测试方法用的程序代码。没错,我们会在有东西可以测试前就先写出测试用的部分!
先编写测试用程序代码的概念来自于极限编程(XP)方法论,这样做会让你能够更容易与更快地写出程序代码。我们并不强制采用极限编程XP,但觉得这个概念真的很不错,并且极限编程XP听起来也很酷。 

5.4 测试

为SimpleDotCom编写测试码

我们需要写出能够创建SimpleDotCom对象并加以测试的程序代码。对SimpleDotCom这个类来说,我们真正在意的只有checkYourselft()方法,然而我们还要实现出setLocationCells()方法以便让checkYourself()方法能够正确地执行。
先来看下面checkYourself()方法这个方法的伪码(setLocationCells()是个用手肘想也知道的setter,所以我们不用花太多时间去关心,但真正的应用程序会需要更稳固的setter,此时就会需要加以测试)。
然后自问:如果checkYourself()方法已经写好的话,我要用什么样的测试码才能证明这个方法能够正确地运行?

应该要测试的部分:
(1) SimpleDotCom对象的初始化。
(2)赋值位置(带有3个int的数组,像是{2,3,4})。
(3)创建代表玩家猜设的字符串(“2”或“0”等)
(4)传入伪造的玩家猜测来叫用checkYourself()方法。
(5)列出结果以观察是否正确。

5.5 编写程序

SimpleDotCom的测试码

public class SimpleDotComTestDrive {public static void main(String[] args) {SimpleDotCom dot = new SimpleDotCom();int[] locations = {2, 3, 4};dot.setLocationCells(locations);String userGuess = "2";String result = dot.checkYourself(userGuess);String testResult = "failed";if (result.euquals("hit")) {testResult = "psssed";}System.out.println(testResult);}
}

checkYourself()方法

    public String checkYourself(String stringGuess) {int guess = Integer.parseInt(stringGuess);String result = "miss";for (int cell : locationCells) {if (guess == cell) {result = "hit";numOfHits++;break;}}if (numOfHits == locationCells.length) {result = "kill";}System.out.println(result);return result;}

5.6 完成版

SimpleDotCom与SimpleDotComTester的最终版本

public class SimpleDotComTestDrive {public static void main(String[] args) {SimpleDotCom dot = new SimpleDotCom();int[] locations = {2, 3, 4};dot.setLocationCells(locations);String userGuess = "2";String result = dot.checkYourself(userGuess);}
}

SimpleDotComGame类的伪码

游戏的main()方法

    public static void main(String[] args) {int numOfGuesses = 0;GameHelper helper = new GameHelper();SimpleDotCom theDotCom = new SimpleDotCom();int randomNum = (int) (Math.random() * 5);int[] locations = {randomNum, randomNum+1, randomNum+2};theDotCom.setLocationCells(locations);boolean isAlive = true;while (isAlive == true) {String guess = helper.getUserInput("enter a number");String result = theDotCom.checkYourself(guess);numOfGuesses++;if (result.equals("kill")) {isAlive = false;System.out.println("You took " + numOfGuesses + " guesses");}}}
}

5.7 用Math.random()产生随机数

radom()与getUserInput()

1.产生随机数

2.取得玩家输入

5.8 预先输入好的程序

最后一个类:GameHelper

public class GameHelper {public String getUserInput(String prompt) {String inputLine = null;System.out.println(prompt + "  ");try {BufferedReader is = new BufferedReader(new InputStreamReader(System.in));inputLine = is.readLine();if (inputLine.length() == 0) return null;} catch (IOException e) {System.out.println("IOException:" + e);}return inputLine;}
}

5.9 循环

关于for循环

基本(非加强版)的for循环

第一段:初始化

第二段:boolean测试(true或false)

第三段:重复表达式 

基本同C语言

循环之旅

前置与后置的递增/递减操作符:++ -- 同C语言

while循环:同C语言

加强版的for循环

从Java 5.0(Tiger)开始,Java语言就有称为加强版的for循环,它能够很容易地逐个
运行数组或其他集合(collection)的元素。(下一章会讨论其他类型的集合)。这
是个很好的强化功能,因为这是for循环很常见的用途。我们会在讨论非数组的集合
时再次看到加强版的for循环。

上面这行程序以中文来说就是:“对nameArray中的每个元素执行一次”而编译器会这么认为:
(1)创建名称为name的String变量。
(2)将nameArray的第一个元素值赋给name。
(3)执行重复的内容。
(4)赋值给下一个元素name。
(5)重复执行至所有元素都被运行为止。

第一段:声明循环变量

使用这个部分来声明与初始化用在循环内容的变量。循环过程中此变量所携带的值会有所不同。此变量的类型必须要与数组元素匹配。

第二段:要运行的集合

这必须是对数组或其他集合的引用

5.10 类型转换

转换primitive主数据类型

我们在第3章讨论过各种primitive主数据类型的大小,以及小杯子无法装载大杯子的内容物的内容:
long y = 42;
int x = y; // 不能通过编译

long比int大,且编译器无法确定long的内容是否可以截掉。若要强制编译器装,你可以使用cast运算符。
long y = 42;
int x = (int) y;
前置的类型转换会告诉编译器要将y的值裁剪成int的大小来赋值给x,但这个值可能会很诡异(见附录B):
long y = 40002;
short x=(short) y;// x的值会是-25534!

重点是这样可以通过编译程序。假如说你要取浮点数的整数值:
float f = 3.14f;
int x = (int) f; // x的值会是3 
 

5.11 用Integer.parseInt()转换字符串

若要解决这类问题,我们必须要把String的“2”转换成int的2。Java内置有Integer这个类,它有一个方法能够将String所表示的数字转换成实际的数目

相关文章:

5.编写程序 超强力方法

5.1 创建战舰游戏 创建一个类似战舰的游戏:攻击网站 有一种棋盘类的战舰游戏,目标是要猜测对方战舰的坐标,然后轮流开炮攻击,命中数发就可以打沉对方的战舰。不过我们不喜欢战争,只要打垮这些达康公司就好(因为与商业…...

超详细DeepLabv3 介绍与使用指南 – 使用 PyTorch 推理

DeepLab 模型首次在 ICLR 14 中首次亮相,是一系列旨在解决语义分割问题的深度学习架构。经过多年的迭代改进,谷歌研究人员的同一个团队在 17 年底发布了广受欢迎的“DeepLabv3”。当时,DeepLabv3 在 Pascal VOC 2012 测试集上实现了最先进的 (SOTA) 性能,在著名的 Cityscap…...

移动应用-Android-开发指南

Android-UI开发指南 Android Studio调试UI设计UI框架布局Layout文本框 android的活动Activity基本概念Activity的生命周期Activity栈创建Activity管理ActivityActivity间传递数据 FragmentAdapterRecyclerViewRecyclerView Adapter(适配器)事件setOnItem…...

免费开源的非标项目型制造BOM一键导入方案介绍

非标项目型制造,每一个订单都会引入很多新料号、新BoM、新工艺路线。实施ERP/MES系统,实现生产管理数字化,第一步就是要导入这些料号、BoM和工艺。项目型制造,大多数订单只生产一次。但在ERP/MES系统中,订单的料号、Bo…...

用合成数据训练车辆姿态估计神经网络

我们的客户希望开发一款应用程序,引导用户通过 AR 指南和自动照片拍摄来拍摄更高质量的汽车照片。 本文重点介绍构建汽车姿态估计组件的技术。 在应用程序中,用户被引导站在与汽车一定的角度和距离,以标准化的方式捕捉最好的照片。 当用户处于…...

【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.5 键盘事件

本章要实现的整体效果如下: QEvent::KeyPress ​ 键盘按下时,触发该事件,它对应的子类是 QKeyEvent QEvent::KeyRelease ​ 键盘抬起时,触发该事件,它对应的子类是 QKeyEvent 本节通过两个案例来讲解这 2 个事件&…...

爬取微博热榜并将其存储为csv文件

🙌秋名山码民的主页 😂oi退役选手,Java、大数据、单片机、IoT均有所涉猎,热爱技术,技术无罪 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 获取源码,添加WX 目录 前言1.…...

国庆中秋特辑(八)Spring Boot项目如何使用JPA

国庆中秋特辑系列文章: 国庆中秋特辑(八)Spring Boot项目如何使用JPA 国庆中秋特辑(七)Java软件工程师常见20道编程面试题 国庆中秋特辑(六)大学生常见30道宝藏编程面试题 国庆中秋特辑&…...

用jad反编译工具查看java接口相关的默认修饰符

接口抽象类复习 -> 默认修饰符是啥 -> jad反编译证明 https://www.cnblogs.com/changrunwei/p/6618117.html 文章目录 背景操作过程反编译前后对比操作截图结论 背景 今天刷到这篇文章,想起之前笔试题总是记不清,所以想证明下。 之前一直不清楚要…...

axios的get请求时数组参数没有下标

开发新项目过程中 发现get请求时 数组参数没有下标 这样肯定是不行的 后端接口需要数组[0]: 7 数组[1]:4这样的数据 原因是因为在请求拦截器没有处理需要的参数 解决方法 在请求拦截器 处理一下参数 import axios, { AxiosError, AxiosInstance, AxiosRequestHeaders } fro…...

bochs 对 Linux0.11 进行调试 (TODO: 后面可以考虑集成 vscode+gdb+qemu)

我在阅读 Linux0.11 源码时,对一个指令 LDS 感到困惑。 看了下 intel 指令集手册,能猜到 LDS 的功能,但不确定。 于是决定搭建调试环境,看看 LDS 的功能是否真如自己猜测。 首先 make debug 运行 qemu-Linux0.11,命…...

一文告知HTTP GET是否可以有请求体

HTTP GET是否可以有请求体 先说结论: HTTP协议没有规定GET请求不能携带请求体,但是部分浏览器会不支持,因此不建议GET请求携带请求体。 HTTP 协议没有为 GET 请求的 body 赋予语义,也就是即不要求也不禁止 GET 请求带 body。大多数…...

防止SQL注入攻击的综合解决方案

文章目录 摘要背景和危害性防御措施示例代码(Java)示例代码(PHP)示例MySQL命令示例代码(Python)示例代码(C#,使用Entity Framework) 进一步防御SQL注入攻击的措施使用ORM…...

MapReduce(林子雨慕课课程)

文章目录 7. MapReduce7.1 MapReduce简介7.1.1 分布式并行编程7.1.2 MapReduce模型简介 7.2 MapReduce体系结构7.3 MapReduce工作流程概述7.4 Shuffle过程原理7.5 MapReduce应用程序的执行过程7.6 WordCount实例分析7.7 MapReduce的具体应用7.8 MaReduce编程实践 7. MapReduce …...

PHP聊天系统源码 在线聊天系统网站源码 后台自适应PC与移动端

程序前台与后台自适应PC与移动端,支持一对多交流,可以自由创建新的房间与解散创建的房间,集成签到功能,等级功能,房间创建者可以对用户进行禁言、拉黑处理,房间可以由房间创建者自由设置进入密码&#xff0…...

算法题:买卖股票的最佳时机 II (贪心算法解决股票问题)

这道题是贪心算法的中级难度练习题,由于题目设定,整个价格都是透明的,这里并不涉及需要预测股票涨势的问题。解决思路不难,就是一旦股票价格开始下降了就买入,一旦上升了,就赶紧卖出。(完整题目…...

Redis-持久化机制

持久化机制介绍 RDBAOFRDB和AOF对比 RDB rdb的话是利用了写时复制技术,他是看时间间隔内key值的变化量,就比如20秒内如果有5个key改变过的话他就会创建一个fork子进程(bgsave),通过这个子进程,将数据快照进…...

【LeetCode热题100】--155.最小栈

155.最小栈 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元…...

Allegro 17.2如何直接更新元件封装?

想必很多从事电子设计的小伙伴,都有这样的经历:有些时候原理图和PCB设计是由不同的工程师负责,然后偶尔需要在没有原理图的情况下直接对PCB作品进行操作,如更新元件封装等操作,这种环节不仅费时费力,效率贼…...

高效数据管理:Java助力实现Excel数据验证

摘要:本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 在Java中,开发者可以使用一些开源的库(如Apache POI&#xff09…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

32单片机——基本定时器

STM32F103有众多的定时器&#xff0c;其中包括2个基本定时器&#xff08;TIM6和TIM7&#xff09;、4个通用定时器&#xff08;TIM2~TIM5&#xff09;、2个高级控制定时器&#xff08;TIM1和TIM8&#xff09;&#xff0c;这些定时器彼此完全独立&#xff0c;不共享任何资源 1、定…...