![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте.
Не могу осилить проверку в игре-головоломке "Черное и белое". Собственно, ее правила: В каждой ячейке (клетке) игрового поля надо нарисовать один кружок - черный или белый. Черный кружок - это цифра 1, белый - 0. Правильно заполненный квадрат должен содержать одну цепочку белых и одну цепочку черных кружков. Цепочки могут иметь ответвления, но не должны иметь разрывов. Ячейки цепочки должны соединяться между собой по горизонтали или по вертикали (соединение только углами недопустимо). Кружки одного цвета не должны образовывать квадраты. Можете помочь, пожалуйста? Код:
var Form1: TForm1; ACol, ARow, i, j: integer; TXT: TextFile; flag, flag2, flag3: boolean; procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char); //Ограничение на ввод всех чисел и символов кроме 0 и 1 begin if not (Key in ['0'..'1', #8]) then Key:=#0; end; procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String); //Ограничение на ввод, чтобы можно было ввести лишь одно число (0 или 1) в клетку begin if Length(Value)>0 then StringGrid1.Cells[ACol, ARow]:=Value[1]; end; procedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName); //Загрузка поля из файла var iTmp: integer; strTemp: string; begin AssignFile(TXT,FileName); Reset(TXT); with StringGrid do begin Readln(TXT, iTmp); ColCount:=iTmp; Readln(TXT, iTmp); RowCount :=iTmp; for ACol:=0 to ColCount - 1 do for ARow:=0 to RowCount - 1 do begin Readln(TXT, strTemp); Cells[ACol, ARow]:=strTemp; end; end; CloseFile(TXT); end; procedure TForm1.N3Click(Sender: TObject); //Загрузить поле из файла begin with OpenDialog1 do if Execute then LoadStringGrid(StringGrid1, OpenDialog1.FileName); end; procedure TForm1.N2Click(Sender: TObject); //Новая игра begin StringGrid1.Visible:=false; BitBtn1.Visible:=true; BitBtn2.Visible:=true; BitBtn3.Visible:=true; end; procedure TForm1.BitBtn1Click(Sender: TObject); //Поле 6х6 begin for i:=0 to 5 do for j:=0 to 5 do if (StringGrid1.Cells [i, j] <> '') then StringGrid1.Cells [i, j]:=''; StringGrid1.Visible:=true; BitBtn1.Visible:=false; BitBtn2.Visible:=false; BitBtn3.Visible:=false; N3.Enabled:=true; N6.Enabled:=true; StringGrid1.RowCount:=6; StringGrid1.ColCount:=6; StringGrid1.Height:=(6*39)-2; StringGrid1.Width:=(6*39)-2; end; procedure TForm1.BitBtn2Click(Sender: TObject); //Поле 8х8 begin for i:=0 to 7 do for j:=0 to 7 do if (StringGrid1.Cells [i, j] <> '') then StringGrid1.Cells [i, j]:=''; StringGrid1.Visible:=true; BitBtn1.Visible:=false; BitBtn2.Visible:=false; BitBtn3.Visible:=false; N3.Enabled:=true; N6.Enabled:=true; StringGrid1.RowCount:=8; StringGrid1.ColCount:=8; StringGrid1.Height:=(8*39)-4; StringGrid1.Width:=(8*39)-4; end; procedure TForm1.BitBtn3Click(Sender: TObject); //Поле 10х10 begin for i:=0 to 9 do for j:=0 to 9 do if (StringGrid1.Cells [i, j] <> '') then StringGrid1.Cells [i, j]:=''; StringGrid1.Visible:=true; BitBtn1.Visible:=false; BitBtn2.Visible:=false; BitBtn3.Visible:=false; N3.Enabled:=true; N6.Enabled:=true; StringGrid1.RowCount:=10; StringGrid1.ColCount:=10; StringGrid1.Height:=(10*38)+3; StringGrid1.Width:=(10*38)+3; end; procedure TForm1.N7Click(Sender: TObject); //Выход begin Close; end; procedure TForm1.N6Click(Sender: TObject); //Проверить решение var ii, m: integer; begin { for ACol:=0 to StringGrid1.ColCount do //проверка на 3 макс соседних for ARow:=0 to StringGrid1.RowCount do begin with StringGrid1 do begin if (Cells[ACol,ARow]<>' ') and (Cells[ACol,ARow]<>'') then begin if ACol<ColCount then begin if Cells[ACol,ARow]=Cells[ACol+1,ARow] then inc(ii); end; if ACol>0 then begin if Cells[ACol,ARow]=Cells[ACol-1,ARow] then inc(ii); end; if ARow<RowCount then begin if Cells[ACol,ARow]=Cells[ACol,ARow+1] then inc(ii); end; if ARow>0 then begin if Cells[ACol,ARow]=Cells[ACol,ARow-1] then inc(ii); end; end; end; if ii>3 then flag:=false; end;} for ACol:=0 to StringGrid1.ColCount do //проверка на квадраты for ARow:=0 to StringGrid1.RowCount do begin for m:=(-1) to 1 do begin if (ACol>0) and (ACol<StringGrid1.ColCount) and (ARow>0) and (ARow<StringGrid1.RowCount) then begin if (StringGrid1.Cells[ACol,ARow]=StringGrid1.Cells[ACol+m,ARow]) and (StringGrid1.Cells[ACol,ARow]=StringGrid1.Cells[ACol,ARow+m]) and (StringGrid1.Cells[ACol,ARow]=StringGrid1.Cells[ACol+m,ARow+m]) and (StringGrid1.Cells[ACol,ARow]=StringGrid1.Cells[ACol-m,ARow-m]) then begin flag2:=False; end; end; end; end; //проаерка на изоляцию for ACol:=0 to StringGrid1.ColCount do for ARow:=0 to StringGrid1.RowCount do begin for m:=(-1) to 1 do begin if (ACol>0) and (ACol<StringGrid1.ColCount) and (ARow>0) and (ARow<StringGrid1.RowCount) then begin if (StringGrid1.Cells[ACol,ARow]<>StringGrid1.Cells[ACol+m,ARow]) and (StringGrid1.Cells[ACol,ARow]<>StringGrid1.Cells[ACol,ARow+m]) and (StringGrid1.Cells[ACol,ARow]<>StringGrid1.Cells[ACol+m,ARow+m]) and (StringGrid1.Cells[ACol,ARow]<>StringGrid1.Cells[ACol-m,ARow-m]) then begin flag3:=False; end; end; end; end; if (flag2=false) or (flag3=false) then ShowMessage('Не верно'); if (flag2=true) and (flag3=true) then ShowMessage('Верно'); Edit1.Text:=IntToStr(ii); end; end. |
#2
|
||||
|
||||
![]() Неа, так и не понятно что за алгоритм такой у игры - что за "правильно заполненный квадрат" или "цепочки", картинки экзерсисной явно не хватает
З.Ы. Вот пример вставки рисунка c кружками в ячейки "игрового поля" Я не понял Вашего вопроса, но всё же Вам на него отвечу! |