Zuul_Bad hra, příkaz 'back' – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Zuul_Bad hra, příkaz 'back' – Java – Fórum – Programujte.comZuul_Bad hra, příkaz 'back' – Java – Fórum – Programujte.com

 

Lukáš
~ Anonymní uživatel
301 příspěvků
12. 4. 2016   #1
-
0
-

Dobrý den, 

chtěl bych Vás poprosit, jestli by mi někdo nemohl pomoc vymyslet jak, aby fungovalo stále dokola příkaz 'back'. Pro vysvětlení, hráč se pohybuje světem, vždy začíná v oblasti 'outside' poté může chodit možnými směry (south, north, up, down,....) příkazem 'go' a posouvá se do dalších místností, já jsem do toho vložil příkaz 'back' s tím, že se vrátí do té předchozí místnosti, ale funguje mi to pouze vždy jednou a poté zůstává v té jedné vracené místnosti. Já bych chtěl, aby se vracel cestou, kterou chtěl, třeba až na začátek. Děkuji za odpověď. Doufám, že jste to trochu pochopili.  

package zuul_bad_zeman;

import zuul_bad_zeman.Parser;
import zuul_bad_zeman.Command;

public class Game {

    private Parser parser;
    private Room currentRoom;
    private Room previousRoom;

    public Game() {
        createRooms();
        parser = new Parser();
    }

    private void createRooms() {
        Room outside, theater, pub, lab, office, shop, hotel, shopSecondFloor, library, underground, pubRoof;

        outside = new Room("outside", "outside the main entrance of the university");
        theater = new Room("theater", "in a lecture theater");
        pub = new Room("pub", "in the campus pub");
        lab = new Room("lab", "in a computing lab");
        office = new Room("office", "in the computing admin office");
        shop = new Room("shop", "in a shop, we have a good CocaCola");
        hotel = new Room("hotel", "in a hotel, WELCOME!");
        shopSecondFloor = new Room("shopSecondFloor", "in second floor in the shop");
        library = new Room("library", "in library there are awesome books");
        underground = new Room("underground","in the underground campus ground");
        pubRoof = new Room("pubRoof", "in the pub roof");
        
        outside.setExit("north", shop);
        outside.setExit("east", theater);
        outside.setExit("south", lab);
        outside.setExit("west", pub);
        theater.setExit("east", library);
        theater.setExit("west", outside);
        pub.setExit("east", outside);
        pub.setExit("west", hotel);
        lab.setExit("north", outside);
        lab.setExit("east", office);
        office.setExit("west", lab);
        shop.setExit("south", outside);
        shop.setExit("up", shopSecondFloor);
        hotel.setExit("east", pub);
        shopSecondFloor.setExit("down", shop);
        library.setExit("west", theater);
        pub.setExit("up", pubRoof);
        outside.setExit("down", underground);
        underground.setExit("up", outside);
        pubRoof.setExit("down", pub);
        
        currentRoom = outside; //začátek hry
    }

    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.");
    }

    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(currentRoom.whereYouAre());
    }

    private boolean processCommand(Command command) {
        boolean wantToQuit = false;

        if (command.isUnknown()) {
            System.out.println("I don't know what you mean...");
            System.out.println("Please, be careful.");
            System.out.println(currentRoom.whereYouAre());
            return false;
        }

        String commandWord = command.getCommandWord();
        if (commandWord.equals("help")) {
            printHelp();
        }
        else if (commandWord.equals("go")) {
            goRoom(command);
        }
        else if (commandWord.equals("back")) {
            back(command);
        }
        else if (commandWord.equals("look")) {
            doLook();
        }
        else if (commandWord.equals("quit")) {
            wantToQuit = quit(command);
        }
        return wantToQuit;
    }

    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:");
        System.out.println("go back look help quit");
        System.out.println(currentRoom.whereYouAre());        
    }

    private void goRoom(Command command) {

        if (!command.hasSecondWord()) {
            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!");
            System.out.println("Please, be careful.");
            System.out.println(currentRoom.whereYouAre());
            
        } else {
            previousRoom = currentRoom;
            currentRoom = nextRoom;
            System.out.println(currentRoom.whereYouAre());
        }
    }
    
    private void doLook(){
	   System.out.println(currentRoom.lookYouAre());
	}
    
    private boolean quit(Command command) {
        if (command.hasSecondWord()) {
            System.out.println("Quit what?");
            return false;
        } else {
            return true;
        }
    }

    private void back(Command command) {
        
        if (command.hasSecondWord()) {
            System.out.print("I don't know what you mean...\n");
            System.out.println("Try it again");
            System.out.println(currentRoom.whereYouAre());
            return;
        }
        
        if (previousRoom == null) {
            System.out.print("Sorry you can't go back\n");
            System.out.println(currentRoom.whereYouAre());
            return;
        }
        currentRoom = previousRoom;

        System.out.println(currentRoom.whereYouAre());
    }
}
Nahlásit jako SPAM
IP: 188.120.199.–
Naemos0
Newbie
12. 4. 2016   #2
-
+1
-
Zajímavé

Ahoj, při vejití do místnosti si vždy pamatuješ pouze tu předchozí a ta předchozí se přepíše vždy v další místnosti. Neboli si to pamatuje vždy jen 1 předchozí místnost. Místo toho musíš použít pro historii místností pole. Například Stack https://docs.oracle.com/javase/7/docs/api/java/util/Stack.html

Pro tebe pak budou klíčové metody pop (vrací poslední prvek ze stacku a smaže ho z něj) a push (vloží prvek na konec pole).

Nahlásit jako SPAM
IP: 46.183.64.–
Lukáš
~ Anonymní uživatel
301 příspěvků
12. 4. 2016   #3
-
0
-

#2 Naemos čau, asi chápu, jak to myslíš. ale nevím jak to mám zapsat, ze zásobníkem, jsem zatím ještě nepracoval, nemohl bys mi trochu více poradit? 

Nahlásit jako SPAM
IP: 188.120.199.–
Lukáš
~ Anonymní uživatel
301 příspěvků
12. 4. 2016   #4
-
0
-

#2 Naemos
Mělo by to vypadat, nějak takto? 

package zuul_bad_zeman;

import java.util.Stack;
/**
 *
 * @author Martin Zeman
 */
public class Zasobnik {
    private Prvek vrchol;
	
    private class Prvek {
      int klic;
      Prvek dalsi;

      Prvek (int klic, Prvek dalsi) {
        this.klic = klic;
        this.dalsi = dalsi;
      }
    }

    Zasobnik() {
      vrchol = null;
    }

    boolean jePrazdny() { 
      return (vrchol == null);
    }
  
    void push(int klic) {
      vrchol = new Prvek(klic, vrchol);
    }

    int pop() {
      int v = vrchol.klic;
      vrchol = vrchol.dalsi;
      return v;
    }
  }

Vložil jsem to do té hra jako třídu, ale nevím co mám vložit za vrchol, klic, dalsi. Jestli vůbec je to dobře, děkuji za radu.

Nahlásit jako SPAM
IP: 188.120.199.–
q
~ Anonymní uživatel
219 příspěvků
12. 4. 2016   #5
-
+1
-
Zajímavé

Mohlo by to fungovat, ale na co ti bude zásobník na inty a proč nepoužiješ ten odkazovaný hotový?!

Stack<Room> path = new Stack<Room>();

goRoom:

	path.push(currentRoom);
	currentRoom = nextRoom;

goBack:

	if (!path.empty()) {
		currentRoom = path.pop();
	}
Nahlásit jako SPAM
IP: 213.211.51.–
Lukáš
~ Anonymní uživatel
301 příspěvků
13. 4. 2016   #6
-
0
-

#5 q
Omlouvám se, ale prostě furt nevím kam to vložit, aby to fungovalo ať to zkouším jak to zkouším, tak to nejde. Mohl by někdo poradit? Děkuji. 

Nahlásit jako SPAM
IP: 188.120.199.–
Lukáš
~ Anonymní uživatel
301 příspěvků
13. 4. 2016   #7
-
0
-

Aha, už nic chápu, ale mám jeden problém nechce mi to vzít ten 'path'? 

Nahlásit jako SPAM
IP: 188.120.199.–
Lukáš
~ Anonymní uživatel
301 příspěvků
13. 4. 2016   #8
-
0
-


Co jsem udělal špatně, že mi teď nechce příkaz 'back' fungovat vůbec? 

package zuul_bad_zeman;

import java.util.Stack;
import zuul_bad_zeman.Parser;
import zuul_bad_zeman.Command;

public class Game {

    private Parser parser;
    private Room currentRoom;
    private Room nextRoom;
    private Room previousRoom;
    Stack<Room> path = new Stack<Room>();

    public Game() {
        createRooms();
        parser = new Parser();
    }

    private void createRooms() {
        Room outside, theater, pub, lab, office, shop, hotel, shopSecondFloor, library, underground, pubRoof;

        outside = new Room("outside", "outside the main entrance of the university");
        theater = new Room("theater", "in a lecture theater");
        pub = new Room("pub", "in the campus pub");
        lab = new Room("lab", "in a computing lab");
        office = new Room("office", "in the computing admin office");
        shop = new Room("shop", "in a shop, we have a good CocaCola");
        hotel = new Room("hotel", "in a hotel, WELCOME!");
        shopSecondFloor = new Room("shopSecondFloor", "in second floor in the shop");
        library = new Room("library", "in library there are awesome books");
        underground = new Room("underground","in the underground campus ground");
        pubRoof = new Room("pubRoof", "in the pub roof");
        
        outside.setExit("north", shop);
        outside.setExit("east", theater);
        outside.setExit("south", lab);
        outside.setExit("west", pub);
        theater.setExit("east", library);
        theater.setExit("west", outside);
        pub.setExit("east", outside);
        pub.setExit("west", hotel);
        lab.setExit("north", outside);
        lab.setExit("east", office);
        office.setExit("west", lab);
        shop.setExit("south", outside);
        shop.setExit("up", shopSecondFloor);
        hotel.setExit("east", pub);
        shopSecondFloor.setExit("down", shop);
        library.setExit("west", theater);
        pub.setExit("up", pubRoof);
        outside.setExit("down", underground);
        underground.setExit("up", outside);
        pubRoof.setExit("down", pub);
        
        currentRoom = outside; //začátek hry
    }

    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.");
    }

    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(currentRoom.whereYouAre());
    }

    private boolean processCommand(Command command) {
        boolean wantToQuit = false;

        if (command.isUnknown()) {
            System.out.println("I don't know what you mean...");
            System.out.println("Please, be careful.");
            System.out.println(currentRoom.whereYouAre());
            return false;
        }

        String commandWord = command.getCommandWord();
        if (commandWord.equals("help")) {
            printHelp();
        }
        else if (commandWord.equals("go")) {
            goRoom(command);
        }
        else if (commandWord.equals("back")) {
            back(command);
        }
        else if (commandWord.equals("look")) {
            doLook();
        }
        else if (commandWord.equals("quit")) {
            wantToQuit = quit(command);
        }
        return wantToQuit;
    }

    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:");
        System.out.println("go back look help quit");
        System.out.println(currentRoom.whereYouAre());        
    }

    private void goRoom(Command command) {

        if (!command.hasSecondWord()) {
            System.out.println("Go where?");
            return;
        }

        String direction = command.getSecondWord();
        
        Room nextRoom = currentRoom.getExit(direction);
        
        path.push(currentRoom);
	currentRoom = nextRoom;

        if (nextRoom == null) {
            System.out.println("There is no door!");
            System.out.println("Please, be careful.");
            System.out.println(currentRoom.whereYouAre());
            
        } else {
            previousRoom = currentRoom;
            currentRoom = nextRoom;
            System.out.println(currentRoom.whereYouAre());
        }
    }
    
    private void doLook(){
	   System.out.println(currentRoom.lookYouAre());
	}
    
    private boolean quit(Command command) {
        if (command.hasSecondWord()) {
            System.out.println("Quit what?");
            return false;
        } else {
            return true;
        }
    }
    
    
    private void back(Command command) {
        
        
        if (command.hasSecondWord()) {
            System.out.print("I don't know what you mean...\n");
            System.out.println("Try it again");
            System.out.println(currentRoom.whereYouAre());
            return;
        }
         if (previousRoom == null) {
            System.out.print("Sorry you can't go back\n");
            System.out.println(currentRoom.whereYouAre());
            return;  
        }
        if (!path.empty()) {
           currentRoom = path.pop();
	}
        
         currentRoom = previousRoom;
                System.out.println(currentRoom.whereYouAre());
         
        }
      }
Nahlásit jako SPAM
IP: 188.120.199.–
q
~ Anonymní uživatel
219 příspěvků
13. 4. 2016   #9
-
+1
-
Zajímavé

To jsi tam neměl vložit, ale přepsat na podobnou logiku.

private void goRoom(Command command) {

	if (!command.hasSecondWord()) {
		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!");
		System.out.println("Please, be careful.");
		System.out.println(currentRoom.whereYouAre());
	} else {
		path.push(currentRoom);
		currentRoom = nextRoom;
		System.out.println(currentRoom.whereYouAre());
	}
}
    
    
private void back(Command command) {
        
	if (command.hasSecondWord()) {
		System.out.print("I don't know what you mean...\n");
		System.out.println("Try it again");
		System.out.println(currentRoom.whereYouAre());
		return;
	}

	if (path.empty()) {
		System.out.print("Sorry you can't go back\n");
		System.out.println(currentRoom.whereYouAre());
		return;  
	}

	currentRoom = path.pop();
	System.out.println(currentRoom.whereYouAre());
}
Nahlásit jako SPAM
IP: 213.211.51.–
Zemi440
Duch
13. 4. 2016   #10
-
0
-

Díky, moc q. :-) Uzavřete téma. Děkuji. 

Nahlásit jako SPAM
IP: 109.107.214.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 12 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý