Постановка задачи. В проекте «Судоку» предлагается несколько вариантов числовых таблиц, которые заранее создаются с помощью текстового редактора и записываются в файлы. Можно хранить все таблицы в одном файле. Цель данной задачи – скопировать таблицу из файла в двумерный массив и показать ее на форме. На рис. 48 приведен пример файла чисел для игры в «Судоку» без повторений по горизонталям и вертикалям.
Рис. 48. Файл для «Судоку»
Реализация. Для вывода таблицы чисел на форму сначала нарисуем поле с помощью процедуры DrawPole, которая была написана ранее (раздел 2.1.2). Перепишем числа из файла в двумерный массив mas, а затем из массива скопируем на форму.
Описание глобальных данных:
const n = 6;
x0 = 10;
y0 = 10;
dx = 30;
dy = 30;
var st : string[6];
f : textfile;
mas : array[1..n,1..n] of integer;
Копирование чисел из файла в таблицу и из таблицы на форму реализовано в процедуре zapolnenie().
procedure zapolnenie(nf:string); // nf – имя файла
var k, c, i, j, x, y : integer;
st : string;
begin
AssignFile(f, nf);
Reset(f);
k := 1;
while not Eof(f) and (k <= n) do
begin
Readln(f, st);
j := 1;
for i:=1 to Length(st) do
begin
if st[i] <> ' ' then // Не равно пробелу
begin
c := ord(st[i])-ord('0');
mas[k, j] := c;
j := j + 1;
end;
end;
k := k + 1;
end;
CloseFile(f);
Form1.Canvas.Font.Color:=clblue;
Form1.Canvas.Font.Size:=16;
for i:=1 to n do
for j:=1 to n do
begin
x := x0 + (j-1)*dx;
y := y0 + (i-1)*dy;
Form1.Canvas.TextOut(x + 5, y + 5, IntToStr(mas[i, j]));
end;
end;
Код обработчика «Заполнить» приведен ниже:
procedure TForm1.Button1Click(Sender: TObject);
begin
DrawPole(n, dx, x0, y0);
zapolnenie('chisla.txt');
end;
Результат работы показан на рис. 49.
Рис. 49. Заполнение таблицы из файла
Задание 1. Сделайте так, чтобы таблица стала пригодной для игры, т. е. вместо некоторых чисел надо вывести пустые строки, а в массиве – нули. Какие числа закрыть – выбирайте случайным образом или задайте некий алгоритм.