JAVA学习之路-简单的城堡游戏(一)

简单的文字城堡游戏(一)

最近在学习后台的一些功能,发现自己的基础不是很牢固,所以想写点小程序,巩固一下以前学的知识,融合一下。

之前在慕课上学的课程中就有一个这样的小程序,写一个简单的文字城堡游戏。当时由于学得很匆忙,所以一直都没做,这次想起这个,于是就想用这个练手了。


首先先说下需求:
1、每个房间都几个出口,然后玩家可以通过go命令去到与这个房间相连的其他房间。
2、房间里有一些物品,玩家可以使用之类的。(此项功能后面再添加,现在先写好接口)
3、每个房间都有自己描述。


再说下思路吧:

设计房间:
因为需要创建很多房间,所以我们可以写一个抽象类,然后让这些所有的房间去继承这个抽象类,然后我们只需要在每个特定的房间中添加自己不同的属性就行了。

然后又考虑到在主程序中不能直接访问实体类,所以我便想写一个接口。

所以各种房间的结构如下:

房间结构体

既然结构出来了,我们就先从顶层开始编写:


首先是接口,我们知道一个房间肯定有出口,还要对当前场景进行叙述。另外我们前面还有个需求是房间里要有物体,虽然不是现在实现,但是我们可以先把功能加上。

所以接口的代码便是:

public interface scene {//设置出口public void setExit(String name,scene room);//获得出口public String getExit();//房间中的物体public void res();  //对当前场景的叙述public void narration();}

接下来是抽象类:
抽象类中肯定要把所有房间的所有共性全部写完,所以我们需要在这实现所有房间的基本特性:

对于接口中的四个方法,物体对场景的叙述是每个房间特有的,所以我们并不会对这两个方法进行细写。

那除此之外的四个方法,还有什么需要补充的么?

  1. 我们需要初始化房间的名字。
    先设定一个变量用来存放对本房间的名字,然后通过toString的方法进行对房间名字的输出。

  2. 需要对当前房间的转换
    我们对房间设定了出口,那么到底要怎么移动呢?
    可以设定一个hashMap用来存放当前房间紧挨着的其他房间,房间名作为key,而变量就作为value,至于初始化房间的出口我们可以交给实体类自己来进行设计,即方法setExit。
    而在对房间进行转换的时候,我们只需要通过传过来的key去寻找那个对应的value,然后将现在的房间替换成value就行了。即:

//取的房间的方向,并转移当前房间public Room getDirect(String direction){                   Room ret=(Room)roomList.get(direction);return ret;}

其他的功能基本上实现完了,现在来实现接口的方法:

  • setExit():
    这个方法我们主要交给子类去实现,我们只是在这里写上将数据传入hashMap的方法就行了。
    即HashMap.put(name,room)

  • getExit():
    这个方法基本上每个子类都一样,所以我们只需要在父类中编写即可。
    这个类的主要功能是将当前房间的的各个出口输出到屏幕上,所以我们只需要遍历一遍HashMap就行了。

  • res();

  • narration();
    这两个类我们就只是子类中进行实现,在抽象类中不实现此方法。

下面是具体的抽象类代码:

public abstract class Room implements scene{private String description;private HashMap<String, scene> roomList=new HashMap<>();//房间初始化,输入描述public Room(String description){                        this.description=description;}//单个初始化房间的出口public void setExit(String name,scene room){                    roomList.put(name, room);}//获得出口public String getExit(){                                StringBuffer s=new StringBuffer();for(String str:roomList.keySet()){s.append(str);s.append(roomList.get(str));s.append("   ");}if(roomList.isEmpty()){System.out.println("哈哈哈,这里没有出口,等死吧你!!!");}return s.toString();}//取的房间的方向,并转移当前房间public Room getDirect(String direction){                   Room ret=(Room)roomList.get(direction);return ret;}//输入房间描述@Overridepublic String toString(){return this.description;}}

而在子类进行实现的时候,我们便只需要实现所有的接口和将参数在构造的时候传递给父类就行了。
下面就是构造卧室的一个实现类:BedRoom

public class BedRoom extends Room{public BedRoom() {super("主卧");}@Overridepublic void res() {// TODO Auto-generated method stub}@Overridepublic void narration() {System.out.println("这是最大的卧室,有一张很大的床");}}

在正式开始之前,我们需要一个类去初始化所有的房间,所以我们可以创建一个类Initialization,去初始化所有房间和显示欢迎信息以及获取当前所在的房间。代码如下:

public class Initialization {//初始化当前房间scene currentRoom;//显示欢迎信息public void welcome(){System.out.println();System.out.println("欢迎来到城堡!");System.out.println("这是一个超级无聊的游戏。");System.out.println("你可以输入'go+方向'去你想去的方向,如go main_bedroom");System.out.println("你还可以输入'bye'结束游戏");System.out.println("如果需要帮助,请记住输入 'help'");}//设定所有房间public void setRoom(){//初始化所有的房间scene bedroom=new BedRoom();scene lobby=new Lobby();scene secBed=new secBedroom();scene secBal=new secBalcony();scene thBed=new thBedroom();scene balcony=new Balcony();scene bacground=new Background();//大堂初始化lobby.setExit("bacground", bacground);lobby.setExit("thr_bed", thBed);lobby.setExit("sec_bed", secBed);lobby.setExit("main_bed", bedroom);//主卧室初始化bedroom.setExit("lobby", lobby);bedroom.setExit("balcony", balcony);//次卧1初始化secBed.setExit("lobby", lobby);secBed.setExit("sec_Bal", secBal);//次卧2的初始化thBed.setExit("lobby", lobby);thBed.setExit("balcony", balcony);//大阳台的初始化balcony.setExit("main_bed", bedroom);balcony.setExit("thr_room", thBed);//次卧1的阳台初始化secBal.setExit("bacground", bacground);//设定起始房间currentRoom=bedroom;    }//获得当前房间public scene getCurrentRoom(){return currentRoom;}}

下面就可以写主类了,我们主要需要编写

  • 输出房间的出口
  • 转移房间
  • 游戏的初始化

首先,游戏的初始化,我们在构造函数里面编写,当此类被创建时就直接初始化游戏

Initialization init=new Initialization();init.setRoom();init.welcome();currentRoom=init.getCurrentRoom();

然后是输出房间的出口,这只需要调用类当中的getExit();方法就行了,这里就不再叙述。

最后是转移房间,在父类中,我们写了getDirect这个方法,去返回一个Room类型的变量,如果这个房间为空,就表示此房间不存在,所以我们直接输出不存在。而如果这个变量不为空,就表示这个房间存在,于是就将当前房间转变为下一个传递回来的房间变量。


最后一步,在Main函数中编写一个循环便可以开始游戏。

主类中的代码具体如下:

public class Game {//初始化当前房间private scene currentRoom;//游戏初始化public Game(){Initialization init=new Initialization();init.setRoom();init.welcome();currentRoom=init.getCurrentRoom();printRoom();}//输出当前房间的出口private void printRoom(){System.out.println("\n-----------------------------------------------");System.out.println("现在你在     "+currentRoom);System.out.println();currentRoom.narration();System.out.println("\n出口有:");System.out.println(currentRoom.getExit());}//输出帮助命令private void printHelp() {System.out.println("\n迷路了吗?你可以做的命令有:go bye help");System.out.println("如要去某个方向:\tgo main_bedroom\n");}//转移房间public void goRoom(String direction){Room nextRoom=((Room) currentRoom).getDirect(direction);if(nextRoom==null){System.out.println("这里没有这个房间!!!");printRoom();}else{currentRoom=nextRoom;}printRoom();}public static void main(String[] args) {Game game=new Game();Scanner in=new Scanner(System.in);//开始游戏while(true){String line=in.nextLine();String[] command=line.split(" ");if(command[0].equals("help")){game.printHelp();}else if(command[0].equals("go")){game.goRoom(command[1]);}else if(command[0].equals("bye")){System.out.println("感谢使用...");System.exit(0);}}}}

以上便是这个游戏所有的代码。因为本身也只是作为一个练习来进行制作的,所以在很多地方都有不足,例如:初始化房间。初始化太麻烦了,不是很方便。
再加上只是做个一个框架出来,需要修改的地方太多太多。如果有哪位同仁想提点意见或者是有其他见解,随时欢迎提出来,彼此学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/353114.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx的优化,安全与防盗链

目录 一、Nginx的页面优化 1&#xff09;Nginx的网页压缩 2&#xff09;配置Nginx的图片缓存 3&#xff09;Nginx的连接超时设置 4&#xff09;Nginx的并发设置 查看cpu的核心数&#xff0c;根据核心数来设置工作进程数 修改工作进程核心数 &#xff1a; 测试结果&…

java做RPG小游戏

题目 java课设&#xff0c;一个游戏中有多种角色(Character)&#xff0c;例如&#xff1a;国王&#xff08;King&#xff09;、皇后&#xff08;Queen&#xff09;、骑士&#xff08;Knight&#xff09;、老怪&#xff08;Troll&#xff09;。 角色之间可能要发生战斗(fight)&…

【Java游戏合集】手把手教你制作游戏

家人们&#xff0c;今天我们来看一下学Java必练的10款游戏项目&#xff01; 大家都知道学习编程必须要做的就是敲代码和做项目练手了&#xff0c;那项目有难有易&#xff0c;很多小伙伴不知道从哪里找项目来练习&#xff0c;今日我们来看一下初级项目中都有哪些能让我们来练手…

Java桌面游戏巡礼——国外Java游戏合集(第一回)

1、 Virus Effect 这是一个2D的Java横板射击游戏&#xff0c;作者在其中融入了很多FPS&#xff08;First Personal Shooting Game&#xff09;要素&#xff0c;角色能够进行换枪、调整射击角度、装弹拆弹等仿真操作&#xff0c;并于游戏内设置有教学关卡&#xff0c;即使是从未…

java保姆级教程—— 1.什么是游戏

引言&#xff1a; Java保姆级教程是笔者在暑假时&#xff0c;为学弟们准备的java游戏教程&#xff0c;今天整理了一下&#xff0c;共享给网友们&#xff0c;笔者也是学生&#xff0c;若有大神发现文中存在误区&#xff0c;还请私信笔者。注&#xff1a;java游戏保姆级教程&…

Java游戏开发——对对碰

游戏介绍&#xff1a; 对对碰游戏在n*n的游戏池中进行&#xff0c;每个格子中有一个图案。鼠标连续选中两个横排或竖排相邻的图案&#xff0c;它们的位置会互换&#xff0c;互换后如果横排或者竖排有3个以上相同的图像&#xff0c;则可以消去该图像&#xff0c;并得分。 游戏…

连连看游戏的设计与实现——基于JAVA语言的小游戏

说明&#xff1a;本篇博客主要讲述练练看游戏的设计与实现。前半部分为分析与类和属性的说明&#xff0c;后半部分为程序的实现与程序代码。第一次写小游戏&#xff0c;仍存在许多问题&#xff0c;也借鉴了CSDN前辈的代码想法&#xff0c;如有不妥&#xff0c;还望多批评指正。…

Java写的第一个小游戏(续)

优化代码(数据维护): 注:此为小游戏最终版本 代码做到最优最简 基于之前发表的文章详情可见 点击查看前文 回顾之前的代码我们可以看到很多的固定常量值或是属性我们都会大量的重复使用,这并不符合我们代码简洁易懂的特点 所以我们可以把重复出现的量或是属性或是方法使用面向…

java小游戏超级玛丽:06.第二关的设计

第二关预览图&#xff1a; 判断是否为第二关 if (sort 2) {} 砖块位置图&#xff1a; 砖块坐标&#xff1a; A(240,390) B(270,360) C(300,330) D(270,360) E(300,360) F(330,390) G(360,360) H(390,390) I(420,390) f1(240,300) 空1&#xff08;420&#xff0c;270&a…

java小游戏超级玛丽:07.第三关的设计

第三关预览图 砖块位置图&#xff1a; 砖块坐标&#xff1a; A(290,390) B(320,360) C(350,330) D(320,390) E(350,480) F(350,390) G(380,300) H(380,330) I(380,360) J(380,390) K(410,270) L(410,300) M(410,330) N(410,360) O(410,390) P(60,390) Q(90,360) R(90…

【Java十大热门游戏合集】Java经典游戏项目

家人们&#xff0c;今天我们来看一下学Java必练的10款游戏项目&#xff01; 大家都知道学习编程必须要做的就是敲代码和做项目练手了&#xff0c;那项目有难有易&#xff0c;很多小伙伴不知道从哪里找项目来练习&#xff0c;今日我们来看一下初级项目中都有哪些能让我们来练手…

Java游戏开发——开心农场

游戏介绍&#xff1a; “开心农场”是一款以种植为主的社交游戏。用户可以扮演一个农场的农场主&#xff0c;在自己的农场里开垦土地&#xff0c;种植各种水果蔬菜。本次开发了一个“开心农场”游戏&#xff0c;运行程序&#xff0c;效果如下图所示。鼠标先选定指定土地&#…

JAVA 实现《超级玛丽》游戏

前言 在你的童年记忆里&#xff0c;是否有一个蹦跳、顶蘑菇的小人&#xff1f; 如果你回忆起了它&#xff0c;你定然会觉得现在它幼稚、无聊&#xff0c;画面不漂亮&#xff0c;游戏不精彩……但请你记住&#xff1a;这才是真正的游戏&#xff0c;它给了你无限的欢乐&#xf…

Java游戏开发——连连看

游戏介绍&#xff1a; “连连看”是一款来源于我国台湾的桌面小游戏&#xff0c;主要考验的是玩家们的眼力&#xff0c;在有限的时间内&#xff0c;只要能把所有能连接的相同图案&#xff0c;两个两个的找出来&#xff0c;每找到一对&#xff0c;它们就会自动消失&#xff0c;只…

java小游戏超级玛丽:05.第一关的设计

第一关效果图&#xff1a; 目录 判断是否为第一关 绘制第一关的场景 绘制地面&#xff08;for循环&#xff09; 绘制砖块 绘制水管 生成Obstatic列表的getter方法 绘制障碍物 判断是否为第一关 if(sort 1){ } 在上面有定义变量sort 绘制第一关的场景 绘制地面&…

程序员从0到收获心仪offer,我靠训练营实现了180度逆袭!

我相信&#xff0c;在未来的职场中&#xff0c;我也能通过这段时间养成的学习习惯和生活习惯让自己一步步成为更好的自己&#xff0c;以自己为荣 我在大学里主修计算机科学与技术&#xff0c;一个普通的院校&#xff0c;一个算是常见的专业&#xff0c;我知道我的学历和一些其他…

10 【组件编码流程 组件自定义事件 全局事件总线】

1.组件编码流程 组件化编码流程&#xff1a; ​ (1).拆分静态组件&#xff1a;组件要按照功能点拆分&#xff0c;命名不要与html元素冲突。 ​ (2).实现动态组件&#xff1a;考虑好数据的存放位置&#xff0c;数据是一个组件在用&#xff0c;还是一些组件在用&#xff1a; ​ 1…

QQ互联地址 中注册的QQ开发者 在哪里提交审核?

QQ互联地址&#xff1a;https://connect.qq.com 废话不说&#xff0c;直接上图&#xff1a; 有时点击后没反应&#xff0c;耐心 多试几次&#xff01; 然后 就会看到 提交审核的表单了&#xff0c; 有没发现 这个提交审核的 链接藏的有点深&#xff01;&#xff01; 哈哈哈&am…

QQ小程序打开指定QQ群

官方提供了接口&#xff1a; <view class"footer"><button open-type "openGroupProfile" class"footer-tips" group-id"620033746">v1.0 by&#xff1a;IWH <text>加群玩&#xff01;</text></button&g…

打开图片链接直接打开QQ对话框

<a href"tencent://message/?uin7530****&SiteQQ交谈&Menuyes" target"blank"> <img border"0" src"http://wpa.qq.com/pa?p1:7530*****:7" alt"有事Q我吧" width"71" height"2…