如何保存后如何将国际象棋棋盘加载到程序中?

时间:2015-05-31 12:55:37

标签: delphi

我有一个将棋盘保存到文本文件中的程序。我试图在保存后重新阅读该程序。当我调用此过程时,我收到此错误。

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;

2 个答案:

答案 0 :(得分: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;

如果你想测试加载一个保存程序,你可以这样做:

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 :(得分:1)

您收到了访问冲突异常,因为Board数组中的字符串成员为空(长度为零),因此没有可访问的字符位置。

要修复现有代码,在将内容分配给字符位置之前,应在每个字符串成员上使用SetLength()。您尚未显示字符串包含的内容,因此只有您知道设置的长度应该是什么。

另一方面,在之前的问题回答中,您已经提出了其他一些方法来保存您的棋盘。你应该检查那些,并可能选择其中之一。回答这些答案也许是礼貌的,也许可以说明为什么你没有选择它们。也许我们无法解释其中的好处。