【问题标题】:Trying to create a maze in C# using a linked list. Can't figure out how to start the game尝试使用链表在 C# 中创建迷宫。不知道如何开始游戏
【发布时间】:2016-12-08 07:13:52
【问题描述】:

我已经创建了列表和“房间”类。我已将房间添加到列表中。现在我坚持编码游戏本身。基本上我想从房间 A 开始,只能通过按 (S)outh 按钮到达房间 E 和 (W)est 按钮到达房间 B 等从房间 A 迭代到房间 E 和房间 B,依此类推。 另外我正在考虑为游戏调用一个不同的类,以便代码可读。因此, main 将只有几行代码。 这是我的代码。随意指出如何优化它。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
class Program
{
    static void Main(string[] args)
    {
        roomsList theRooms = new roomsList();
        theRooms.allRoomsList();
        theRooms.addRoomToEnd("A");
        theRooms.addRoomToEnd("B");
        theRooms.addRoomToEnd("C");
        theRooms.addRoomToEnd("D");
        theRooms.addRoomToEnd("E");
        theRooms.addRoomToEnd("F");
        theRooms.addRoomToEnd("G");
        theRooms.addRoomToEnd("H");
        theRooms.addRoomToEnd("I");
        theRooms.addRoomToEnd("J");
        theRooms.addRoomToEnd("K");
        theRooms.addRoomToEnd("L");
        Console.WriteLine("What is your name?");
        string playerName = Console.ReadLine();
               Console.WriteLine("================================================================");
        Console.WriteLine(playerName + " You have been Chosen, Enter if you dare!!");
          Console.WriteLine("================================================================");
        Console.WriteLine("(Y)es/(N)o");
        string decision = Console.ReadLine();

        if (decision == "y")
        {
            Console.WriteLine("You need to make you way to Room L, so you may live!!");

        }
        else
        {
            Console.WriteLine("Goodbye");
        }

    }
}
class rooms //create class rooms
{
    private string roomname;
    private rooms next;

    public rooms(string rname) //constructor
    {
        roomname = rname;
        next = null;
    }
    public void setRoom (rooms nxtRoom)
    {
        next = nxtRoom;
    }
    public rooms ftchNext()
    {
        return next;
    }
    public string ftchName()
    { 
        return roomname;
    }
}//done creating class rooms
class roomsList //create linked list
{
    public rooms start, end;
    public roomsList()
    {
        start = null;
        end = null;
    }
    public void addRoomToEnd(string rname)
    {
        rooms current = new rooms(rname);
        if (end == null)
        {
            start = current;
            end = current;
        }
        else
        {
            end.setRoom(current);
            end = current;
        }
    }
    public void allRoomsList()
    {
        rooms current;
        if (start != null)
        {
            current = start;
            while (current != null)
            {
                current = current.ftchNext();
            }
        }
        else { }
    }
}//class list ends

}

【问题讨论】:

  • 您只保留列表中的下一个房间。在输入“w、a、s、d”按钮时,这不足以做出决定,因为有四种方法可以走。您需要保持“前、左、后、右”房间相互链接,而不是下一个。
  • 我不明白你的意思?能否进一步解释一下?
  • Eran Gat 的回答实际上就是我想说的 :) @GidiBloke
  • 是的,它帮助很大,但我不明白其中的某些部分。可以试一下吗?

标签: c# maze


【解决方案1】:

总体而言,您似乎走在了正确的轨道上,但缺少一些关键功能。您可以使用以下几点来完成您的实施

首先,问题陈述,正如我从您的问题中理解的那样:您的迷宫是房间的集合。您可以通过向北、向南、向东或向西在房间之间移动。当你到达某个被定义为出口的房间时,你就完成了迷宫。

Room Class:您的房间应该保持这种概念,即它可以连接到不同的房间。我建议如下:

class Room 
{
   public string Name;
   public Room NorthRoom;
   public Room SouthRoom;
   public Room EastRoom;
   public Room WestRoom;
   pulic bool isExit;

   public ConnectTo(Room room, Direction direction)
   {
       // Add room connection logic here...
   }
}

迷宫班:迷宫班有一个起始房间,仅此而已。要创建迷宫,您将创建房间并在它们之间进行适当的连接。

class Maze
{
   public Room StartingRoom;
}

那么我们怎样才能创建一个迷宫呢?我将展示一种幼稚的方法,但在这里您可以编写一些帮助函数以使其更容易。

//Lets say we want to have the following maze:
//
// start - room 1 - room 2
//           |        |
//         room 3   room 4 (exit) 

var maze = new Maze();
var startingRoom = new Room();
maze.StartingRoom = startingRoom;
var room1 = new Room();
var room2 = new Room();
var room3 = new Room();
var room4 = new Room();
room4.IsExit = true;
startingRoom.ConnectTo(room1, "East");
room1.ConnectTo(room2, "East");
room1.ConnectTo(room3, "South");
room2.ConnectTo(room4, "South");

要实现连接,请检查您输入的方向并设置适当的房间(北、南等)。

玩游戏:在你的主类中,用户同意开始后,有一个 while 循环,当用户进入 IsExit = true 的房间时,该循环将停止。您跟踪用户所在的当前房间。他们从迷宫的起点开始。用户选择是否要走 N、S、E、W。根据他们的选择,您将当前房间分别移动到北、南、东、西房间。您需要处理一些房间可能为空的情况。

希望这能给你足够的思考点来完成你的游戏!

【讨论】:

  • 这是否意味着我需要创建另一个类'Direction'。另外连接逻辑是如何工作的?我猜这就是如何设置迷宫的路线,一个特定的房间如何只能通向另一组房间而无处可去。原谅我的天真,我对这门语言很陌生。
  • 方向不是必须的类,可以传递一个字符串值如“w”代表当前房间的“北侧房间”进行连接。一个类的对象可以通向其他房间。假设您有一个“房间”对象,它还有 4 个其他房间对象,即“西、东、北、南”,每个方向的房间都有自己的房间,就像这样。你有一个起始房间,你必须将其他人连接到它。因此,在完成连接操作后,您将拥有一个带有起始空间的迷宫。是清楚还是另一个问题? @GidiBloke
  • @GidiBloke - 添加了更多细节。
  • 感谢您迄今为止的帮助。我已经设法让它工作了,但是我仍然想在游戏中添加一些功能,所以如果可以的话,请帮忙。 1. 我希望用户能够在游戏中的任何时候键入“退出”和“重新开始”来退出控制台应用程序或重新开始。
  • 听起来不错的功能!此时,您的程序中应该有一些点可以处理用户的输入,例如 N,S,E,W。如果您将此输入作为字符获取,请首先将其更改为字符串,以便您可以处理诸如退出或重新开始之类的字符串。要处理退出,只需关闭您的控制台应用程序(您只需返回)。要重新开始,您需要保留迷宫中当前位置的变量。如果用户选择重新开始,只需将当前位置设置为 maze.StartingRoom。祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
相关资源
最近更新 更多