2015-05-31 28 views
-2

我有一個將棋盤保存到文本文件的過程。我試圖在保存後重新讀入該程序。當我調用這個過程時,我得到這個錯誤。如何在保存後將棋盤加載到程序中?

enter image description here

代碼,我必須在裝船。

Procedure LoadBoard(Var Board : Tboard); 
var 
    fptr:text; 
    i,j,x:integer; 
    line:string; 
    load:char; 

begin 
    Write('Do you want a load a game? (Enter Y for yes)'); 
    Readln(load); 
    If (Ord(load) >= 97) and (Ord(load) <= 122) 
    Then load := Chr(Ord(load) - 32); 

    if load='Y' then 
    begin 
     assignfile(fptr,'SBoard.txt'); 
     reset(fptr); 
     i:=1; 
     repeat 
     readln(fptr,line); 
     j:=1; 
     x:=1; 
     repeat 
      begin 
      if (line[x]<>',') and (line[x+1]<>',') 
      then 
       begin 
       Board[i,j][1]:=line[x]; 
       Board[i,j][2]:=line[x+1]; 
       end; 
      if line[x]=',' 
      then 
       j:=j+1; 
       x:=x+1; 
      end; 
     until j=9; 
     i:=i+1; 
     until i=9; 
     close(fptr); 
    end; 
end; 
+1

與您的訪問違規無關:谷歌「FEN」通常存儲方式職位。它還包含50個移動規則信息,en passent square,誰要移動......以及所有這些都在一行短文中。 (http://en.wikipedia.org/wiki/Forsyth%E2%80%93Edwards_Notation) – BitTickler

+5

當你學習如何調試你的程序時,你會節省大量的時間,而不是爲你面對的每一個問題提出一個問題。 – TLama

+0

第一個問題:如果你使用'writeln(fptr,Board [i,j])將你的棋盤狀態保存爲一個文本文件中的多個字符串'爲什麼你要將它們加載到你的2D字符串數組中,而不是直接作爲字符字符串?例如'Board [i,j]:= line;' – SilverWarior

回答

1

通過使用文本文件並逐行保存電路板,您已經過於複雜化了。

我認爲你應該使用一個TStringList保存和加載:

Const 
    BoardDimension = 8; 
    BoardFileName = 'SBoard.txt'; 

Type 
    TBoard = Array [1 .. BoardDimension, 1 .. BoardDimension] Of String; 

procedure SaveBoard(Board: TBoard); 
var 
    i, j: Integer; 
    Line, BoardFile: TStringList; 
begin 
    BoardFile := TStringList.Create; 
    Line := TStringList.Create; 

    for i := 1 to BoardDimension do 
    begin 
    Line.Clear; 
    for j := 1 to BoardDimension do 
     Line.Add(Board[i, j]); 
    BoardFile.Add(Line.CommaText); 
    end; 

    Line.Free; 
    BoardFile.SaveToFile(BoardFileName); 
    BoardFile.Free; 
end; 

procedure LoadBoard(Board: TBoard); 
var 
    i, j: Integer; 
    Line, BoardFile: TStringList; 
begin 
    if not FileExists(BoardFileName) then 
    exit; // Show error message 

    BoardFile := TStringList.Create; 
    BoardFile.LoadFromFile(BoardFileName); 

    Line := TStringList.Create; 

    for i := 1 to BoardDimension do 
    begin 
    Line.CommaText := BoardFile[i]; 
    for j := 1 to BoardDimension do 
     Board[i, j] := Line[j]; 
    end; 

    Line.Free; 
    BoardFile.Free; 
end; 

如果你想測試負載的拯救proceudre你可以做這樣的:

procedure Test; 
var 
    Board: TBoard; 
    BoardA: TBoard; 
    i, j: Integer; 
begin 
    randomize; 
    for i := 1 to BoardDimension do 
    for j := 1 to BoardDimension do 
     Board[i, j] := Random(500).ToString; 

    SaveBoard(Board); //Save Board 
    LoadBoard(BoardA); //Load the file into a NEW board 

    for i := 1 to BoardDimension do //Comapre the two boards 
    for j := 1 to BoardDimension do 
     if Board[i,j] <> BoardA[i,j] then 
     raise Exception.Create('Wrong file format'); 
end; 
1

你得到訪問衝突異常,因爲Board數組中的字符串成員是空的(長度爲零),因此沒有可訪問的字符位置。

要解決你現在的代碼,你應該每個串部件上使用SetLength()分配內容的字符位置之前。你沒有顯示字符串包含什麼,所以只有你知道設置長度應該是什麼。

在另一方面,在前面的回答你的問題,你一直在勸其他幾種方法來保存你的國際象棋棋盤。你應該檢查這些,並可能選擇其中之一。對這些答案作出迴應也可能是禮貌的,也可能會說出爲什麼你沒有選擇它們。也許我們無法解釋好處。

相關問題