学完了基础班的内容(其实还差几天才学完),在这里用一个文字冒险的游戏来总结并练习一下所学到的内容,有不足之处还请指正~~ 由于个人比较喜欢玩游戏,而且对于老式的这种文字冒险也比较有兴趣(才不会说是因为没学到图形化),所以选择了制作一个简单的文字冒险,顺便作为整个基础班的技术总结~ 大致的效果↓ 主题:勇士的冒险 在一个冒险故事中,我们需要一个勇士,一个最终的BOSS,一个吸引人的剧情。
那么首先是勇士的部分,勇士作为玩家扮演的角色,一般来说应该有名字、等级、生命值这些属性。 在这里复习一下变量的内容: [AppleScript] 纯文本查看 复制代码 基本数据类型:
整型:byte、short、int、long (默认类型为int)
浮点型:float、double (默认类型为double)
字符型:char
布尔型:boolean
为了击败BOSS,勇士还需要装备,而装备又拥有名字、攻击力这样的属性。 那么首先创建这样的两个类,分别命名为Player和Equipment,然后分别给两个类各自的属性和初始值。并将它们私有~ 那么这里复习一下关于对象的内容: [AppleScript] 纯文本查看 复制代码 类:是一组相关的属性和行为的集合
对象:该类事物的具体体现
类的定义: 对象的创建:
class 类名{…} 类名 对象名 = new 类名();
相应的代码如下: [AppleScript] 纯文本查看 复制代码 class Player{ //勇士
private int lv = 1;
private int hp = 20;
private int maxhp = 20;
}
class Equipment{ //装备
private int lv = 1;
private int atk = 10;
}
勇士有了,武器也有了,现在来思考一下,勇士和武器都分别会发生怎样的事情? 勇士会升级,升级会增加最大生命值,武器也会升级,随之增加攻击力。那么我们再给玩家和装备这两个类增加一个升级的方法~
所以这里复习一下关于方法的内容
[AppleScript] 纯文本查看 复制代码 方法的概念:
完成特定功能的代码块
方法的调用:
类名.方法名(参数1,参数2…); //类中方法的调用可直接 方法名(参数1,参数2…);
方法的定义:
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2…) {
执行内容;
return 返回值;
}
相应代码如下: [AppleScript] 纯文本查看 复制代码 class Player{
private int lv = 1;
private int hp = 20;
private int maxhp = 20;
public void lvup(){
lv ++;
maxhp = maxhp +10;
hp = maxhp; //升级后完全恢复生命值,如不需要可去掉此行
}
}//勇士
class Equipment{
private int lv = 1;
private int atk = 10;
public void lvup(){
lv ++;
atk = atk + 5;
}
}//装备
升级的功能到这里就算是完成了(这里没有设置等级上限,需要的话可以加个判断)。 游戏中升级了应该是会有提示的,由于之后运行情况是在控制台中,所以这个提示最好把升级后的情况全部说明一下,而且剧情中我们也可能用到说明状态的情况,所以我们再给勇士和装备两个类加一个说明状态的方法,并在升级的方法中调用~
[AppleScript] 纯文本查看 复制代码 class Player{ //勇士
public void lvup(){
lv ++;
maxhp = maxhp +10;
hp = maxhp; //升级后完全恢复生命值,如不需要可去掉此行
viewme();
}
public void viewme(){ //查看勇士的状态
System.out.println("当前等级:"+ lv);
System.out.println("当前生命值:" + hp);
System.out.println("最大生命值:" + maxhp);
}
}
class Equipment{ //装备
public void lvup(){ //装备升级
System.out.println("武器等级提升!");
lv ++;
atk = atk + 5;
viewit();
}
public void viewit(){ //查看装备的状态
System.out.println("当前武器等级:" + lv);
System.out.println("当前武器攻击力:" + atk);
}
}
到这里,有关于勇士和装备的类都可以算是完成了,可以简单的进行一些剧情的发展了~
文字冒险游戏的话,主要在于与玩家之间的互动,最简单的剧情是这样的:
在这里就用一下刚刚写好的功能,完善一下我们的剧情:
为了方便文字输出,再创建一个旁白的类,让这个类来给我们输出语句。 思路是:建立一个字符串数组,索引相当于一本书的页码,对应的字符串就是剧情文本,再创建一个方法,给出“页码”就输出对应的剧情语句: 这个地方复习一下关于数组的内容: [AppleScript] 纯文本查看 复制代码 数组:存储同一种数据类型的多个元素的容器。
数组的定义:
A:数据类型[] 数组名;
B:数据类型 数组名[];
数组的初始化:
a:动态初始化 只指定长度,由系统给出初始化值
b:静态初始化 给出初始化值,由系统决定长度
对应的代码: [AppleScript] 纯文本查看 复制代码 public class Textsay {
String[] book = {"","","","","","","","","","","","","","","",""};
public void readyforbook(){
book[0] = "你拿起剑开始了冒险,你走进了森林,\n" +
"在你面前出现了两条岔路,左边的这条路布满荆棘,右边的较为开阔,\n" +
"对于穿着铠甲的你来说并没有什么不同,你要走哪一条路呢?";
book[1] = "你使用剑清除了道路上的荆棘,剑经过磨砺后变得更加锋利了";
book[2] = "你发现了一眼泉水,并在泉水边回复了生命";
book[3] = "你在森林中遇见了一头受伤的小鹿,\n" +
"它看起来很可怜,但是鹿肉是非常鲜美的,你要怎么做?";
book[4] = "你为小鹿包扎了伤口,\n" +
"小鹿蹦蹦跳跳地离开了";
book[5] = "你用剑杀死了小鹿,\n" +
"并享用了鹿肉,回复了生命";
book[6] = "你听见了狼嚎,\n" +
"狼群是被刚刚的鹿肉吸引过来的,\n" +
"你要怎么办?";
book[7] = "你来到了城堡,需要击退的魔王就在里面!\n" +
"城堡前站着一个牧师,\n" +
"“年轻人,需要我的帮助吗?”";
book[8] = "你用剑击退了狼群!\n" +
"但也因此而负伤,HP-10";
book[9] = "牧师念了几句咒语,你感觉充满了力量\n" +
"升1级!";
book[10] = "你无视了牧师走进了城堡";
book[11] = "你进入了城堡,\n" +
"魔王就站在城堡中央的王座上,\n" +
"你要怎么办?";
book[12] = "恭喜你成功击败了魔王,但是你通关了我也没什么奖励给你~~";
}
public void say(int i){
System.out.println(book[i]);
}
}
(PS:这里其实可以利用IO流实现TXT文档的互动从而省去大段的剧情代码~~)
由于要与玩家互动,我们导入Scanner的包~ [AppleScript] 纯文本查看 复制代码 import java.util.Scanner; 为了方便读取到玩家的选项,我们再创建一个方法,给玩家选项,由玩家输出并返回一个对应的选择: [AppleScript] 纯文本查看 复制代码 public static String getAnswer(String a,String b){
System.out.println("1."+ a +" " + "2." + b);
Scanner in = new Scanner(System.in);
return in.next();
}
接下来就是在主方法中编写我们的故事流程了~ 游戏开始的时候,我们的主角还没有名字,那就让玩家来给他起一个名字。
在这里创建一个方法,控制台给出提示再由玩家输入,将玩家输入的内容返回。 [AppleScript] 纯文本查看 复制代码 public static String welcome() {
System.out.println("欢迎~");
System.out.println("你的名字是?");
Scanner in = new Scanner(System.in);
return in.next();
}
这样的话我们就可以直接创建一个玩家的对象了: [AppleScript] 纯文本查看 复制代码 public static void main(String[] args) {
Player you = new Player();
you.setName(welcome());
同样的,创建装备以及旁白的对象: [AppleScript] 纯文本查看 复制代码 public static void main(String[] args) {
Player you = new Player();
Textsay pangbai = new Textsay();
pangbai.readyforbook();
Equipment dao = new Equipment();
you.setName(welcome());
接下来就是核心的剧情部分,主要还是逻辑判断与剧情文本的输出, 这里复习一下关于流程控制语句的内容: [AppleScript] 纯文本查看 复制代码 程序在执行时默认按照代码的先后顺序来执行,需要判断的地方用if或switch语句,
if语句:
格式: 1. if(判断条件){语句体} //判断条件为true时执行语句体
2. if(判断条件){语句体1}else{语句体2}
//判断条件为true时执行语句体1,为false时执行语句体2
3.if(判断条件1){语句体1}
else if(判断条件2){语句体2}
……
else if(判断条件n){语句体n}
else{语句体n+1}
//判断条件1为true时执行语句体1,为false时判断判断条件2,为true时执行语句体2,false时判断判断条件3……所有的判断条件都为false时,执行语句体n+1
switch语句:
格式:
switch(表达式){
case 条件1:
语句体1;
break;
case 条件2:
语句体2;
break;
……
default:
语句体n+1;
break;
}
//按顺序判断表达式的值,当其与条件x相等时,执行语句体x;若没有相等值,则执行语句体n+1
(PS.使用switch时不要漏掉break;否则会造成击穿的情况。我的理解是case作为一个选择的入口,当遇到符合的值时进入此行,然后就一直执行下去,所以不加break;跳出这个switch就会继续向下执行。)
需要循环的地方用for或while或do while结构:
for循环:
格式:
for(初始化条件;表达式;循环增量){语句体}
执行顺序:初始化条件→判断表达式,为false时跳出循环,否则→语句体→循环增量→继续判断表达式→……
while循环
格式:
while(表达式){语句体}
执行顺序:判断表达式,为false时跳出循环,否则→语句体→继续判断表达式→……
do while循环:
格式:
do{语句体}while(表达式)
执行顺序:语句体→判断表达式,为false时跳出循环,否则→语句体→继续判断表达式→……
三者的区别:
do…while循环至少会执行一次循环体再进行判断。
for循环和while循环先判断条件是否成立再决定是否执行循环体
for循环语句和while循环语句的区别:
控制条件语句所控制的那个变量,作用于只在for循环的大括号中,所以在for循环结束后,就不能再使用了,而while循环结束还可以继续使用。
具体部分就不多解释了,直接给出代码:
[AppleScript] 纯文本查看 复制代码 while (true){
switch (getAnswer("左边","右边")){
case "1":
pangbai.say(1);
dao.lvup();
break;
case "2":
pangbai.say(2);
you.recover();
break;
default:
System.out.println("请输入有效值!");
continue;
}
break;
}
pangbai.say(3);
while (true){
switch (getAnswer("救下小鹿","杀死小鹿")){
case "1":
pangbai.say(4);
break;
case "2":
pangbai.say(5);
you.recover();
pangbai.say(6);
while (true){
switch (getAnswer("战斗!","逃跑!")){
case "1":
if (dao.lv == 2){
System.out.println("你用剑击退了狼群!\n" +
"但也因此而负伤,HP-10");
you.hp = you.hp - 10;
break;
}else{
System.out.println("你被成群的狼包围,最终力竭身亡! \n" + "Game Over!");
return;
}
case "2":
System.out.println("你没能逃离狼群的追杀! \n" + "Game Over!");
return;
default:
System.out.println("请输入有效值!");
continue;
}
break;
}
break;
default:
System.out.println("请输入有效值!");
continue;
}
break;
}
pangbai.say(7);
while (true){
switch (getAnswer("需要","不需要")){
case "1":
pangbai.say(9);
you.lvup();
break;
case "2":
pangbai.say(10);
break;
default:
System.out.println("请输入有效值!");
continue;
}
break;
}
pangbai.say(11);
while (true){
switch (getAnswer("战斗!","投降~")){
case "1":
if (you.lv == 2 & dao.lv == 2){
System.out.println("你成功击败了魔王!");
break;
}else{
System.out.println("你没能击败魔王! \n" + "Game Over!");
return;
}
case "2":
System.out.println("魔王没等你举起手就将你击倒了!\n" + "Game Over!");
return;
default:
System.out.println("请输入有效值!");
continue;
}
break;
}
可以看出来,只有通关才会执行这个循环之后的语句,所以我们再最后再加上一句作为游戏通关的信息: [AppleScript] 纯文本查看 复制代码 pangbai.say(12); 一个简单的文字冒险就此完成~~ 希望后面的学习内容会更加有趣~~
|