1. Game 클래스
- "World of Zuul" 어플리케이션의 main 클래스
- 이 게임을 플레이하려면 이 클래스의 인스턴스를 만들고 "플레이" 호출
- 다른 모든 클래스를 만들고 초기화
- 모든 room과 parser을 만들고 게임 시작
또한 parser가 반환하는 명령을 평가하고 실행
package WorldOfZull;
public class Game
{
private Parser parser;
private Room currentRoom;
//게임을 창조하고 internal map을 초기화
public Game()
{
parser= new Parser();
createRooms();
}
//모든 Room을 창조하고 그들의 exit을 연결
private void createRooms()
{
Room outside,theater,pub,lab,office;
//Room 생성
outside = new Room("outside the main entrance of the university");
theater = new Room("in a lecture theater");
pub = new Room("in the campus pub");
lab = new Room("in a computing lab");
office = new Room("in the computing admin office");
//Room exit 초기화
outside.setExit("east", theater);
outside.setExit("south", lab);
outside.setExit("west", pub);
theater.setExit("west", outside);
pub.setExit("east", outside);
lab.setExit("north", outside);
lab.setExit("east", office);
office.setExit("west", lab);
//Room에 item 추가
lab.addItem(new Item("computer", 5001));
theater.addItem(new Item("notebook", 20));
theater.addItem(new Item("chair", 1000));
pub.addItem(new Item("beer", 15));
office.addItem(new Item("paper", 1));
//Room에 player 생성
currentRoom = outside;
}
//메인 플레이 루틴, 게임 끝날떄 까지 반복
public void play()
{
printWelcome();
//주요 명령 루프에 들어가라, 여기서 우리는 게임이 끝날떄까지 명령을 읽고 실행함
boolean finished = false;
while(! finished) {
Command command = parser.getCommand();
finished = processCommand(command);
}
System.out.println("Thank you for playing. Good bye.");
}
//player의 오픈 메시지 출력
private void printWelcome()
{
System.out.println();
System.out.println("Welcome to the World of Zuul!");
System.out.println("World of Zuul is a new, incredibly boring adventure game.");
System.out.println("Type 'help' if you need help.");
System.out.println();
System.out.println(currentRoom.getLongDescription());
}
//주어진 명령에 따라 명령 실행
//파라미터 : 명령
//리턴 : 만약에 명령이 게임을 끝낸다면 true 아니면 false
private boolean processCommand(Command command)
{
boolean wantToQuit = false;
if(command.isUnknown()) {
System.out.println("I don't know what you mean...");
return false;
}
String commandWord = command.getCommandWord();
if(commandWord.equals("help")) {
printHelp();
}
else if(commandWord.equals("go")) {
goRoom(command);
}
else if(commandWord.equals("quit")) {
wantToQuit = quit(command);
}
//else command not recognised.
return wantToQuit;
}
//help 정보 출력
private void printHelp()
{
System.out.println("You are lost. You are alone. You wander");
System.out.println("around at the university.");
System.out.println();
System.out.println("Your command words are:");
parser.showCommands();
}
//한 방향으로 가도록 하세요. 나가는 곳이 있으면 새 룸에 들어가고, 그렇지 않으면 오류 메시지를 출력
private void goRoom(Command command)
{
if(!command.hasSecondWord()) {
//만약에 second word가 없다면, 우리는 어디로 갈지 모름
System.out.println("Go where?");
return;
}
String direction = command.getSecondWord();
//현재 방을 떠나기를 시도
Room nextRoom = currentRoom.getExit(direction);
if(nextRoom == null) {
System.out.println("There is no door")
}
else {
currentRoom = nextRoom;
System.out.println(currentRoom.getLongDescription());
}
}
private boolean quit(Command command)
{
if(command.hasSecondWord()) {
System.out.println("Quit what?");
return false;
}
else {
return true;
}
}
}
2.Room 클래스
- 게임의 풍경의 위치를 대표
- exit를 통해 다른방들을 연결
- 각 exit를 통해 각 Room은 이웃 Room의 참조(위치)를 저장
package WorldOfZull;
import java.util.Set;
import java.util.HashMap;
import java.util.ArrayList;
public class Room {
private String description;
//이 방의 출구 필드
private HashMap<String,Room> exits;
//이 방의 item 정의
private ArrayList<Item>items;
public Room(String description)
{
this.description = description;
exits = new HashMap<>();
items = new ArrayList<>();
}
//Room의 출구 정의 메서드
public void setExit(String direction, Room neighbor)
{
exits.put(direction, neighbor);
}
//Room에 item 추가
public void addItem(Item item)
{
items.add(item);
}
//Room에 짧은 묘사
public String getShortDescription()
{
return description;
}
//Room에 긴 묘사
public String getLongDescription()
{
return "You are " + description + ".\n" + getExitString() + ".\n" + getItemString() + "\n";
}
//Room의 출구 묘사를 리턴 -"Exits: north west"
private String getExitString()
{
String returnString = "Exits:";
Set<String>keys = exits.keySet();
for(String exit : keys) {
returnString +=" "+exit;
}
return returnString;
}
//Room의 Item 묘사
private String getItemString()
{
String returnString ="Items:";
if(items.isEmpty()) {
return returnString;
}
int i;
for(i=0; i <items.size()-1; i++) {
returnString +=items.get(i).getName()+",";
}
returnString +=items.get(i).getName()+".";
return returnString;
}
// 만약 "direction" 지시에 원래 방으로부터 나간다면 도달한 방 리턴
public Room getExit(String direction)
{
//direction key 가져오기
return exits.get(direction);
}
}
3. Item 클래스
- Item은 게임의 Item을 대표
- Item은 이름과 무게를 가짐
package WorldOfZull;
public class Item {
private String name;
private int weight;
public Item(String name)
{
//초기화
this(name,0);
}
//Item의 name과 weight 생성
public Item(String name, int weight)
{
this.name = name;
this.weight = weight;
}
//Item의 이름 가져오기
public String getName()
{
return name;
}
//Item의 무게 가져오기
public int getWeight()
{
return weight;
}
}
4. parser 클래스
- 유저의 입력을 읽고 "Adventure"로써 해석시도
- terminal로 부터 라인을 읽는것을 요청 받고 두개의 단어 명령으로써 라인 해석을 시도
- class 명령의 객체로써 명령을 리턴
- parser는 command words로 알려진 set을 가짐
- command words는 command를 대신하여 사용자의 입력을 확인하고 입력이 commands 중 하나가 아니라면
unknown 명령 리턴
package WorldOfZull;
import java.util.Scanner;
public class Parser {
//모든 유효한 command words 잡기
private CommandWords commands;
//유저
private Scanner reader;
public Parser()
{
commands = new CommandsWords();
reader = new Scanner(System.in);
}
//user로 부터 다음 명령 리턴
public Command getCommand()
{
String inputLine;
String word1 = null;
String word2 = null;
System.out.print(">"); //print prompt
inputLine = reader.nextLine();
//line에서 두 단어 찾기
Scanner tokenizer = new Scanner(inputLine);
if(tokenizer.hasNext()) {
word1 = tokenizer.next(); //get first word
if(tokenizer.hasNext()) {
word2=tokenizer.next(); //get second word
}
}
//이 단어가 있는지 없는지 체크. 만약에 있다면 명령 생성
//없다면 null
//isCommand(CommandsWords) -주어진 String이 유효한 command word인지
if(commands.isCommand(word1)) {
return new Command(word1,word2);
}
else {
return new Command(null,word2);
}
}
//유효한 commands words 리스트 출력
public void showCommands()
{
//showAll(CommandsWords) -print all vaild commands to System.out
commands.showAll();
}
}
5.commandsWords 클래스
- 게임에 알려진 모든 명령어 열거
- 그들이 타이핑 쳐진대로 알아들음
- Constant Array[]
package WorldOfZull;
public class CommandsWords {
// a constant array that holds all valild command words
private static final String[] vaildCommands = {
"go","quit","help"
};
public CommandsWords()
{
}
//String이 유효한 command word인지 확인
public boolean isCommand(String aString)
{
for(int i=0; i<vaildCommands.length; i++) {
if(vaildCommands[i].equals(aString))
return true;
}
return false;
}
//모든 유효한 명령 출력
public void showAll()
{
for(String command : vaildCommands) {
System.out.print(command+" ");
}
System.out.println();
}
}
6. Command 클래스
- user로 부터 발행된 명령들의 정보
- 명령은 두개의 String으로 구성 : command word, second word
- user가 잘못된 명령을 입력한 경우 명령어 <null>
- user가 한 단어만 가지고 있다면 second word는 <null>
package WorldOfZull;
public class Command {
private String commandWord;
private String secondWord;
public Command(String firstWord, String secondWord)
{
commandWord = firstWord;
this.secondWord= secondWord;
}
//이 명령의 commandWord(first word)리턴
public String getCommandWord()
{
return commandWord;
}
//이 명령의 second word 리턴
public String getSecondWord()
{
return secondWord;
}
//이 명령이 이해 불가능하면 true 리턴
public boolean isUnknown()
{
return (commandWord == null);
}
//Second word 명령을 가진다면 true 리턴
public boolean hasSecondWord()
{
return (secondWord!=null);
}
}
/**
* doDrop:
* 1. checks if user specified a thing to be dropped
* 2. checks that it's there in inventory
* 3. deletes that item from inventory, and adds to currentRoom
* 4. prints a message about it.
*/
public void doDrop(Command c) {
if (! c.hasSecondWord()) { // "DROP",but no object named
System.out.println("Drop what?");
return;
}
String s = c.getSecondWord();
Item i = findByName(s, inventory);
if (i == null) {
System.out.println("You don't have a " + s);
return;
}
inventory.remove(i);
currentRoom.addItem(i);
System.out.println("You have dropped the " + s);
}
/**
* doTake: doesn't do anything yet
*/
public void doTake(Command c) {
System.out.println("Doesn't do anything yet.");
}
}
import java.util.ArrayList;
/**
*
* @author ChoiJiWoo
* @version 2023-06-19
*/
public class Plyaer
{
private Room playerRoom; //Plyaer의 현재 룸
private ArrayList<Item> playerItem; //Player의 지니고 있는 Item
private int itemweight;
final int MAX_CARRY_WEIGHT = 5000; //운반 가능한 최대 무게
public Plyaer()
{ this.playerRoom = playerRoom;
playerItem = new ArrayList<Item>();
}
public String takeItem(Item name) {
System.out.println("take" + name);
if(name.getWeight() <MAX_CARRY_WEIGHT)
{
playerItem.add(name);
return "You are carrying now the" + name;
}
return " ";
}
public String dropItem(Item name) {
System.out.println("drop" + name);
playerItem.remove(name);
return "You have dropped the" + name;
}
}
'기타' 카테고리의 다른 글
자료구조 homework 6 (0) | 2023.10.02 |
---|---|
online -shop (0) | 2023.06.20 |