簡體   English   中英

if / else語句寫為循環

[英]If/else statements written as loops

我聽說可以將if / else語句轉換成循環,它們有點等同。 有人可以給我一個例子,因為我很難理解轉換過程。

好的評論我想我沒有正確地提出這個問題。 我基本上正在完成一項任務,必須使用在所有if / else語句中編寫的某人代碼,並將其轉換為包含循環的代碼。

我不是要問這個問題的答案,但我想問一個如何做到這一點的例子。 我有很多方法可以做到這一點,下面是代碼。 它基本上是一個鬼屋迷宮式的“游戲”,只要你在經過房間后觸摸和探索物體就會結束,但沒有回溯。 使用循環我必須允許回溯,並允許用戶探索盡可能多的項目,並且只有在用戶決定結束時才結束游戲。

編輯:

好的,我已經開始將上面代碼的Living Room部分路徑轉換為while循環。 請告訴我它是否看起來不錯,如果我能以某種方式改進它,或者如果我犯了任何錯誤,它似乎運行正常。 我唯一的問題是,當我點擊決定去使用胸部時,它要求兩次然后結束,它應該只詢問一次,與燭台一樣。 也許我錯過了一些關於“休息”的聲明? 但我不知道,因為當我在食品室里,然后回去,我還有其他只包含休息; 它做了應該做的事情......但不是胸部和燭台。

但到目前為止我的代碼是:

public class LoopyHauntedHouse {

private String name; //Player name.
private String location0; //First location selected from door.
private String toFrontDoor = "";
private String atFrontDoor;

//Method asking for user's name, and welcoming the user as well as asking where they'd like to go for the first time.
public void intro()throws MalformedURLException
{
    //URL to image initialized from the original code as needed.
    URL frontDoor = new URL("http://i.imgur.com/2m3giQk.png");

    //Scanner for user input.
    Scanner scnr = new Scanner(System.in);

    //Asking for user's name and welcoming the user.
    name = JOptionPane.showInputDialog(null, "What is your name?");
    JOptionPane.showMessageDialog(null, "Welcome " + name + " to the Haunted House!");

    //Shows starting location.
    JOptionPane.showMessageDialog(null, name + " you're at the front door of the haunted house.", "Title",
    JOptionPane.PLAIN_MESSAGE, new ImageIcon(frontDoor));

    //Asks for first choice of room to start at.
    location0 = JOptionPane.showInputDialog(null, name + " where to next? 'Living Room', 'Dining Room' or 'Stairs'?");
}

//Method for the rest of the program allowing users to walk through the house, backtrack, and interact with objects.
public void startWalking()throws MalformedURLException
{   
    //URLs to images are initialized from the original code as needed.
    URL stairs = new URL("http://i.imgur.com/WuddJUc.png");
    URL bedroom1 = new URL("http://i.imgur.com/HZ6OSyZ.png");
    URL bedroom2 = new URL("http://i.imgur.com/JZORNpd.png");
    URL bathroom = new URL("http://i.imgur.com/onSEc1J.png");
    URL masterBedroom = new URL("http://i.imgur.com/bf4L0sH.png");
    URL masterBathroom = new URL("http://i.imgur.com/yp87dTX.png");
    URL livingRoom = new URL("http://i.imgur.com/7XQD5Pt.png");
    URL bathRoom = new URL("http://i.imgur.com/G0CxjSy.png");
    URL diningRoom = new URL("http://i.imgur.com/gyU9mep.png");
    URL kitchen = new URL("http://i.imgur.com/tTMRCID.png");
    URL pantry = new URL("http://i.imgur.com/zBxPJCs.png");

    while(location0.equalsIgnoreCase("Living Room")||(toFrontDoor.equalsIgnoreCase("Living Room")))
    {
        JOptionPane.showMessageDialog(null, name + " you are now in the Living Room");
        String move1 = JOptionPane.showInputDialog(null, name + " would you like to explore the 'Chest' walk to the 'Bathroom' or 'Go back' and go to another room?");

            if(move1.equalsIgnoreCase("Chest"))
            {
                JOptionPane.showMessageDialog(null, name + " a ghost escapes and scares you to death!");
                JOptionPane.showMessageDialog(null, "Game Over! You've died.", "Try Again.", 
                JOptionPane.WARNING_MESSAGE, new ImageIcon(livingRoom));
                break;
            }

            else if(move1.equalsIgnoreCase("Bathroom"))
            {
                while(move1.equalsIgnoreCase("Bathroom"))
                {
                JOptionPane.showMessageDialog(null, name + " you are now in the bathroom.");
                String move2 = JOptionPane.showInputDialog(null, name + " would you like to explore the 'Mirror', 'Shower', or 'Go back'?");
                    if(move2.equalsIgnoreCase("Shower"))
                    {
                        JOptionPane.showMessageDialog(null, name + " the room suddenly steams up and you feel fingers touching the back of your neck...");
                    }
                    else if(move2.equalsIgnoreCase("Mirror"))
                    {
                        JOptionPane.showMessageDialog(null, name + "you see a bloody face looking back at you!");
                    }
                    else if(move2.equalsIgnoreCase("Go back"))
                    {
                        JOptionPane.showMessageDialog(null, name + " you are now in the Living Room");
                        break;
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(null, "Please enter a valid option.");
                    }
                }
            }
            else if(move1.equalsIgnoreCase("Go back"))
            {
                toFrontDoor = move1;
                break;
            }
            else
            {
                JOptionPane.showMessageDialog(null, "Please enter a valid option.");
            }
    }

    while(location0.equalsIgnoreCase("Dining Room"))
    {
        JOptionPane.showMessageDialog(null, name + " you are now in the Dining Room");
        String move1 = JOptionPane.showInputDialog(null, name + " would you like to explore the 'Candelabra' or walk to the 'Kitchen'");

        if(move1.equalsIgnoreCase("Candelabra"))
            {
                JOptionPane.showMessageDialog(null, "The candelabra light up by themselves and " + name + " sees a death shadow!");
                JOptionPane.showMessageDialog(null, "Game Over! You've died.", "Try Again.", 
                JOptionPane.WARNING_MESSAGE, new ImageIcon(diningRoom));
                break;
            }

        else if(move1.equalsIgnoreCase("Kitchen"))
        {
            while(move1.equalsIgnoreCase("Kitchen"))
            {
                JOptionPane.showMessageDialog(null, name + " you are now in the 'Kitchen'.");
                String move2 = JOptionPane.showInputDialog(null, name + " would you like to explore either the 'Refrigerator' or 'Cabinet' walk to the 'Pantry', or 'Go back'");
                    if(move2.equalsIgnoreCase("Refrigerator"))
                    {
                        JOptionPane.showMessageDialog(null, name + " opens the refrigerator and finds some delicious soul food.");
                    }
                    else if(move2.equalsIgnoreCase("Cabiner"))
                    {
                        JOptionPane.showMessageDialog(null, "The dished and glasses start flying at you as soon as you open the door. " + name + " gets hit in the head and feels themselves moving towards a light.");
                        JOptionPane.showMessageDialog(null, "Game Over! You've died.", "Try Again.", 
                        JOptionPane.WARNING_MESSAGE, new ImageIcon(kitchen));
                        break;
                    }
                    else if(move2.equalsIgnoreCase("Pantry"))
                    {
                        while(move2.equalsIgnoreCase("Pantry"))
                        {
                            JOptionPane.showMessageDialog(null, name + " you are now in the Pantry.");
                            String move3 = JOptionPane.showInputDialog(null, name + " would like to explore the 'Dusty Recipe Box', the 'Broom', or 'Go back'?");
                                if(move3.equalsIgnoreCase("Dusty Recipe Box"))
                                {
                                    JOptionPane.showMessageDialog(null, name + "opens it up and a recipe for chocolate devils food cake appears out of no where.");
                                }
                                else if(move3.equalsIgnoreCase("Broom"))
                                {
                                    JOptionPane.showMessageDialog(null, "As soon as " + name + " touches the broom, it flies up in the air!");
                                }
                                else if(move3.equalsIgnoreCase("Go back"))
                                {
                                    break;
                                }
                                else
                                {
                                    JOptionPane.showMessageDialog(null, "Please enter a valid option.");
                                }
                        }
                    }
                    else if(move2.equalsIgnoreCase("Go back"))
                    {
                        toFrontDoor = move2;
                        break;
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(null, "Please enter a valid option.");
                    }
            }
        }
    }
}

public void toFrontDoor() throws MalformedURLException
{
    if(toFrontDoor.equalsIgnoreCase("Go back"))
    {
        atFrontDoor = JOptionPane.showInputDialog(null, name + " where to next? 'Living Room', 'Dining Room', 'Stairs', or 'Leave the house'?");
            if(atFrontDoor.equalsIgnoreCase("Leave the house"))
            {
                JOptionPane.showMessageDialog(null, "Game Over! Thanks for playing.");
            }
    }
    else
    {
        startWalking();
    }
}
}

測試CLass:

public class LoopyTest {

    public static void main(String[] args) throws MalformedURLException {
    LoopyHauntedHouse player = new LoopyHauntedHouse();
    player.intro();
    player.startWalking();
    player.toFrontDoor();
}
}

是的,在匯編語言中,循環使用condition語句和goto語句實現:

L1:  if ( <cond> )
  {
     <loop-body>   
     goto L1 ;
  }

您可以在C中使用此方法,但不能在Java中使用此方法,因為不允許使用goto。

當程序到達L1時,它會檢查條件。 如果條件滿足,程序將繼續循環體,之后它將跳轉(轉到)L1,標記程序中的行號。 在那里,一個循環。 如果不滿足條件,它將會中斷,程序將在大括號后的下一行繼續{

如果你仔細考慮如何設計它,你可以創建一個與if語句功能相同的循環。

如果:

if(myVal == 1) {
  //do something
}

功能上等同

for(int i = myVal; i == 1; ++i) {
  //Do something
}

其功能相當於同時

int i = myVal;
while(i == 1) {
 //Do something
 ++i;
}

請注意,在循環中我不直接將myVal與循環終止符進行比較。 這是因為您必須更改比較值才能退出循環,並且您可能不想更改實際變量。

但是,如果您的整個所需代碼在一段while(isPlaying) {}內運行while(isPlaying) {} ,則不需要一堆其他循環。 你只需添加else if(move#.equalsIgnoreCase("quit") {isPlaying = false; }為你檢查每一步的所有地方#。

我還要補充一點,您當前的代碼可以從使用類中受益。 對於用戶輸入的每個命令,沒有理由擁有新的move#變量。

由於不同的房間是一種“國家”。 你可以在使用狀態模式時解決它。 每個州由一個對象表示。 使用這些對象,每個對象可以根據它的狀態決定下一步做什么。 例如:

class Room {
    private String roomName;
    private URL icon;
    private List<String> nextRooms;

    public Room(String _roomName, URL _icon, String... _nextRooms) {
        roomName = _roomName;
        icon = _icon;
        nextRooms = new ArrayList<>();
        for (String string : _nextRooms) {
            nextRooms.add(string.toLowerCase());
        }
    }

    public void showInfo(String player) {
        JOptionPane.showMessageDialog(null, player + " you're in " + roomName, "Title",
                JOptionPane.PLAIN_MESSAGE, new ImageIcon(icon));
    }

    public String nextRoomName(String player) {
        StringBuilder sb = new StringBuilder();
        for (String string : nextRooms) {
            sb.append(string).append(", ");
        }
        String roomOptions = sb.toString();

        while(true) {
            String input = JOptionPane.showInputDialog(null, player + " where to next? Your options are: " + roomOptions);
            if(nextRooms.contains(input)) {
                return input;
            }
        }
    }
}

public void start() throws MalformedURLException {
    Map<String, Room> rooms = new HashMap<>();
    rooms.put("room a", new Room("Room A", new URL("http://i.imgur.com/7XQD5Pt.png"), "Room B", "Room C"));
    rooms.put("room b", new Room("Room B", new URL("http://i.imgur.com/7XQD5Pt.png"), "Room A"));
    rooms.put("room c", new Room("Room C", new URL("http://i.imgur.com/7XQD5Pt.png"), "Room A", "Win"));

    String player = JOptionPane.showInputDialog(null, "What is your name?");
    JOptionPane.showMessageDialog(null, "Welcome " + player + " to the Haunted House!");

    Room room = rooms.get("room a");
    while (true) {
        room.showInfo(player);
        String nextRoom = room.nextRoomName(player).toLowerCase();
        if ("win".equalsIgnoreCase(nextRoom)) {
            return;
        }

        if (rooms.containsKey(nextRoom)) {
            room = rooms.get(nextRoom);
        }
    }
}

這有點復雜,特別是如果你是Java或面向對象的新手,所以或者讓每個房間都成為一種方法。 根據用戶的決定,調用適當的方法等。

void start() {
    roomA();
}

void roomA() {
    String input = JOptionPane....
    if (input.equals("Room B")) {
        roomB();
    }
}

void roomB() {
    String input = JOptionPane....
    if (input.equals("Room A")) {
        roomA();
    } else if (input.equals("win")) {
        win();
    }
}

void win() {
    JOptionPane.showMessageDialog...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM