A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

学完了基础班的内容(其实还差几天才学完),在这里用一个文字冒险的游戏来总结并练习一下所学到的内容,有不足之处还请指正~~
由于个人比较喜欢玩游戏,而且对于老式的这种文字冒险也比较有兴趣(才不会说是因为没学到图形化),所以选择了制作一个简单的文字冒险,顺便作为整个基础班的技术总结~
大致的效果
主题:勇士的冒险
在一个冒险故事中,我们需要一个勇士,一个最终的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);
一个简单的文字冒险就此完成~~
希望后面的学习内容会更加有趣~~


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马