从文件中读取数组的外部边界

时间:2017-11-10 17:50:24

标签: c# multidimensional-array

我是C#的新手 - 我在这里有一个'寻宝'游戏 - 它在一个盒子里隐藏't',然后用户输入坐标 - 如果他们得到't'它说他们赢了如果没有,则显示“m”。

我正在尝试设置与用户输入的名称相关联的保存游戏。它将保存游戏写入txt文件并存储它 - 这很有效。但是当我尝试加载游戏时,我不断收到错误“索引超出了数组的范围”。

  static string username = "";
    static string saveGame = "";
    public const int BoardSize = 10;
    static void Main(string[] args)
    {
        char[,] Board = new char[10, 10];
        Console.WriteLine("Would you like to:");
        Console.WriteLine("1. Start New Game");
        Console.WriteLine("2. Load Game");
        Console.WriteLine("9 Quit.");
        int mainMenuChoice = 0;
        mainMenuChoice = int.Parse(Console.ReadLine());
        if (mainMenuChoice == 1)
        {
            Console.WriteLine("What is your name?");
            username = Console.ReadLine();
        }
        else if (mainMenuChoice == 2)
        {
            Console.WriteLine("What was your username?");
            username = Console.ReadLine();
            saveGame = username + ".txt";
            LoadGame(saveGame, ref Board);
        }
        else if (mainMenuChoice == 9)
        {
            Console.WriteLine("Closing in 3 seconds.");
            Thread.Sleep(3000);
            Environment.Exit(0);
        }
        Random randomOneX = new Random();
        randomOneX = new Random(randomOneX.Next(0, 10));
        int randomX = randomOneX.Next(0, BoardSize);
        randomOneX = new Random(randomOneX.Next(0, 10));
        int randomY = randomOneX.Next(0, BoardSize);
        //Console.Write(randomX);
        //Console.Write(randomY);
        for (int i = 0; i < Board.GetUpperBound(0); i++)
        {
            for (int j = 0; j < Board.GetUpperBound(1); j++)
            {
                Board[i, j] = ' ';
            }
        }
        Board[randomX, randomY] = 'x';
            PrintBoard(Board);
            int Row = 0;
            int Column = 0;
            bool wonGame = false;

            Console.WriteLine();
            Console.WriteLine("I've hidden a 't' in a map - you're job is to find the coordinates that have the 't' in.");
            Console.WriteLine();
            do
            {
                Console.Write("Please enter a Row: ");
                bool validRow = false;
                do
                {
                    try
                    {
                        Row = int.Parse(Console.ReadLine());
                        validRow = true;
                        if (Row >= 10 || Row < 0)
                        {
                            Console.WriteLine("Please pick a number between 0-9: ");
                            validRow = false;
                        }
                    }
                    catch (Exception)
                    {
                        Console.WriteLine("Ooops, you've entered something that simply cannot be, please retry.");
                    }
                } while (validRow == false);

                Console.Write("Now enter a column: ");
                bool validColumn = false;
                do
                {
                    try
                    {
                        Column = int.Parse(Console.ReadLine());
                        validColumn = true;
                        if (Column >= 10 || Column < 0)
                        {
                            Console.WriteLine("Please pick a number between 0-9: ");
                            validColumn = false;
                        }
                    }
                    catch (Exception)
                    {
                        Console.WriteLine("Ooops, you've entered something that simply cannot be, please retry.");
                    }
                } while (validColumn == false);

                if (Board[Row, Column] != 'x')
                {
                    Board[Row, Column] = 'm';
                Console.ForegroundColor = ConsoleColor.DarkRed;
                Console.Clear();
                    Console.WriteLine("You've missed the target! Feel free to retry.");
                Console.ForegroundColor = ConsoleColor.Gray;
                    wonGame = false;
                    PrintBoard(Board);
                SaveGame(username, ref Board);
                }
                else
                {
                    Board[Row, Column] = 't';
                Console.Clear();
                Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.WriteLine("You've won!");
                Console.ForegroundColor = ConsoleColor.Gray;

                wonGame = true;
                }
            } while (wonGame == false);
        PrintBoard(Board);
            Console.ReadLine();
    }

    private static void PrintBoard(char[,] Board)
    {

        Console.WriteLine();
        Console.WriteLine("The map looks like this: ");
        Console.WriteLine();
        Console.Write(" ");
        for (int Column = 0; Column < BoardSize; Column++)
        {
            Console.Write(" " + Column + "  ");
        }
        Console.WriteLine();
        for (int Row = 0; Row < BoardSize; Row++)
        {
            Console.Write(Row + " ");
            for (int Column = 0; Column < BoardSize; Column++)
            {
                if (Board[Row, Column] == '-')
                {
                    Console.Write(" ");
                }
                else if (Board[Row, Column] == 'x')
                {
                    Console.Write(" ");
                }
                else
                {
                    Console.Write(Board[Row, Column]);
                }
                if (Column != BoardSize)
                {
                    Console.Write(" | ");
                }
            }
            Console.WriteLine();
        }
    }

    private static void SaveGame(string username, ref char [,] inBoard)
    {
        StreamWriter sGame = null;
        string saveFilePath = username + ".txt";
        try
        {
            sGame = new StreamWriter(saveFilePath);
        }
        catch (Exception)
        {
            Console.WriteLine("Ooops there seems to be an error with saving your game. Check the log for details.");
        }

        for (int i = 0; i < inBoard.GetUpperBound(0); i++)
        {
            for (int j = 0; j < inBoard.GetUpperBound(1); j++)
            {
                sGame.Write(inBoard[i, j]);
            }
            sGame.WriteLine("");
        }
        sGame.Close();
    }

    private static void LoadGame(string GameFile, ref char[,] Board)
    {
        StreamReader saveGameReader = null;
        string Line = "";
        try
        {
            saveGameReader = new StreamReader(GameFile);
        }
        catch (Exception e)
        {
            StreamWriter errorMessage = new StreamWriter("ErrorLog.txt", true);
            errorMessage.WriteLine(DateTime.Now + "Error: " + e.ToString());
            errorMessage.Close();
            Debug.WriteLine(e.ToString());
            Console.WriteLine("There was an error loading game, check log for info. (Press Enter to exit.)");
            Console.ReadLine();
            Environment.Exit(0);
        }
        char[,] loadedBoard = Board;

        for (int Row = 0; Row < BoardSize; Row++)
        {
            Line = saveGameReader.ReadLine();
            for (int Column = 0; Column < BoardSize; Column++)
            {
                loadedBoard[Row, Column] = Line[Column];
            }
        }
        Board = loadedBoard;
        saveGameReader.Close();
    }
}

}

记事本屏幕截图的链接是:https://imgur.com/a/hobuv

3 个答案:

答案 0 :(得分:0)

如果文件中的值如下所示

   m m m m m m m m m m

      m m m m X m m X m m m

      m m m m m m m m X m m

然后你可以尝试这种方法

int i = 0;  
// Read the file and work it line by line.  
string[] lines = File.ReadAllLines(gameFile); 
foreach(string line in lines) 
    {  
    string[] columns = line.Split(' '); 
    for(int j = 0; j < columns.Length; j++)
        {
         loadedBoarder[i, j] = columns[j];
        }
        i++;  
    }  

@captainjamie:感谢您更正我的代码。

答案 1 :(得分:0)

您的保存有9行,但您的电路板尺寸定义为10

答案 2 :(得分:0)

GetUpperBound返回,正如MSDN所说

  

获取指定维度的最后一个元素的索引   阵列。

所以,无论你在哪里使用这种方法,你都会得到9。要修复代码,您需要在保存和初始化Board数组时更改循环,并使用&lt; =作为循环退出条件

import numpy as np
from skimage import transform as tf
from sklearn.metrics import mean_squared_error
from skimage.transform import PiecewiseAffineTransform
src = np.array([0,0 , 1,0 , 1,1 , 0,1]).reshape((4, 2))
dst = np.array([3,1 , 3,2 , 2,2 , 2,1]).reshape((4, 2))
tform = tf.estimate_transform('piecewise-affine', src, dst)
print(src)
print(dst)
print(tform.affines[0].params)
print(tform.affines[1].params)
mt = tf.matrix_transform(src, tform.affines[0].params)
print(mt)



>>> dir(tform)
['__add__', '__call__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_inverse_tesselation', '_tesselation', 'affines', 'estimate', 'inverse', 'inverse_affines', 'residuals']