Страница 2 из 3

Re: [pascal] Японские кроссворды

Добавлено: 17 апр 2007, 13:05
somewhere
&quot писал(а):А потом, после того, как пользователь решит кроссворд, прочитать данные из файла и сравнить с тем, что получилось у пользователя.
Из математической модели японских кроссвордов следует то, что при одной и той же раскладке (наборе цифр по вертикали/горизонтали) может быть более одного решения. Хотя на первых порах сойдет и твой вариант. Можно и через Boolean оформить. Помимо самого поля, нужны будут данные о числах вверху и внизу. Все это объединить в один тип и сделать как

Код: Выделить всё

TRowColData = Array[1..15] of byte; // Массив чисел конкретной строки или столбца

TJСData = record
    Width : Byte;
    Height : Byte;
    Field : Array[1..120, 1..120] of Boolean;  // данные игрового поля
    RowData : Array[1..120] of TRowColData; // данные для каждой строки
    ColData : Array[1..120] of TRowColData; // данные для каждого столбца
    end;
Тип TRowColData можно заменить на String в котором числа пойдут через запятую, но тогда при обработке придется разбивать каждую строку на массив чисел.

Re: [pascal] Японские кроссворды

Добавлено: 18 апр 2007, 15:54
Alex_Burn
Somewere! У меня есть к тебе просьба. Если ты мне поможешь - буду очени рад. Изображение

К этому сообщению я прикрепляю картинку японского кроссворда(самого маленького, который у меня есть).

Дело в том, что я у меня мало что получается Изображение

Ты не мог бы показать мне полностью как обрабатывать этот кроссворд. А потом я мог бы,ориентируясь по твоему примеру, обрабатывать остальные.

Мне просто больше не у кого просить помощи Изображение У меня даже учитель по практике ничего вразумительного не говорит.

У меня есть процедура заливки клеток

Код: Выделить всё


procedure zapolnenie(x,y:integer; c:char);
   begin
    x:=15; y:=15;
    repeat
     c:=readkey; if c=#0 then c:=readkey;
     case c of
      #72 : begin
             setcolor(0); circle(x,y,1); y:=y-10; setcolor(15); circle(x,y,1);
            end;

      #80 : begin
             setcolor(0); circle(x,y,1); y:=y+10; setcolor(15); circle(x,y,1);
            end;

      #75 : begin
             setcolor(0); circle(x,y,1); x:=x-10; setcolor(15); circle(x,y,1);
            end;

      #77 : begin
             setcolor(0); circle(x,y,1); x:=x+10; setcolor(15); circle(x,y,1);
            end;

      #13 : begin
             setfillstyle(1,1); bar(x-4,y-4,x+4,y+4);
             a[(x-5) div 10,(y-5) div 10]:=1;
             b[(x-5) div 10,(y-5) div 10]:=1;
             setfillstyle(1,1);
            end;

      #32 : begin
             setfillstyle(1,15); bar(x-4,y-4,x+4,y+4);
             a[(x-5) div 10,(y-5) div 10]:=0;
             b[(x-5) div 10,(y-5) div 10]:=0;
             setfillstyle(1,15);
            end;

      #48 : begin
             setfillstyle(1,3);
             bar(x-4,y-4,x+4,y+4);
             setfillstyle(1,3);
            end;
     end; {case}
    until c=#27;
    setcolor(0); circle(x,y,1);
   end;


Заранее благодарю

P.S. Все забываю упомянуть, что программа должна быть на TP 7.0

Re: [pascal] Японские кроссворды

Добавлено: 19 апр 2007, 13:22
somewhere
Что-ж, помогу с отрисовкой и заполнением, дальше сам...

Re: [pascal] Японские кроссворды

Добавлено: 19 апр 2007, 17:14
somewhere
Числа кроссворда заполняются произвольно, вообщем я думаю, разберешься. Если что, спрашивай...

Re: [pascal] Японские кроссворды

Добавлено: 19 апр 2007, 23:40
Alex_Burn
somewhere,

Спасибо, somewhere. Когда увидел результаты тестирования, чуть со стула не упал (очень хорошо ты сделал).

В коде разобраться довольно сложно, поэтому не мог бы ты кое-что прояснить?

1. Объясни пожалуйста раздел type (что для чего ты используешь)

2. Не мог бы ты в 2-х словах объяснить назначение функций и процедур.
Например, функция getitemscount делает то-то, функция getmaxitemscount делает то-то.
Подробностей не нужно, только суть.

3. Не пойму где в коде ты проставляешь числа слева и сверху от кроссворда
Числа кроссворда заполняются произвольно...
Не совсем понятно, что это значит.

4. При нажатии пробела клетка, на которой стоит указатель, закрашивается. В принципе, при решении кроссворда необходимо каким-то образом отмечать клетки, которые абсолютно точно не закрашены (лично я при решении на бумаге отмечаю такие клетки х (крестиком)). В предоставленном тобой коде такой возможности нет?

5. Есть ли в предоставленном тобой коде кодирование состояния клеток взависимости от того закрашена клетка или нет (я не нашел)?

Возможно(скорее всего) я туплю, но ты профессионал, а я только учусь, если это можно назвать учебой:
по лекции у меня учитель вроде неплохой, но лекции очень редко (например, по графике лекций еще не было), да и особо на лекциях не спросишь. Учусь только по книжкам. Практика тоже редко, но там спрашивать не у кого: учительница по практике сама учится и если у нее что-нибудь серьезное спросить она не ответит, потому-что сама толком не знает
(хотя чего это я здесь разболтался, это никому не интересно).

Сроки поджимают...

Извини за назойливость, somewhere, но больше не к кому обращаться.

Заранее спасибо.

Re: [pascal] Японские кроссворды

Добавлено: 20 апр 2007, 11:39
somewhere
&quot писал(а):Не совсем понятно, что это значит.
Для проверки отрисовки числа заполнялись от балды, вовсе не факт, что такой кроссворд существует.
&quot писал(а):4. При нажатии пробела клетка, на которой стоит указатель, закрашивается. В принципе, при решении кроссворда необходимо каким-то образом отмечать клетки, которые абсолютно точно не закрашены (лично я при решении на бумаге отмечаю такие клетки х (крестиком)). В предоставленном тобой коде такой возможности нет?
Это еще раз доказывает, что типа Boolean недостаточно. Сделал тип - байт.
&quot писал(а):5. Есть ли в предоставленном тобой коде кодирование состояния клеток взависимости от того закрашена клетка или нет (я не нашел)?
Конечно есть, иначе как они рисуются. TJapanCwd.Fields[x,y] - указывает на конкретное поле.

Re: [pascal] Японские кроссворды

Добавлено: 23 апр 2007, 10:49
somewhere
Добавлено: загрузка и выгрузка в файл.

Re: [pascal] Японские кроссворды

Добавлено: 23 апр 2007, 21:26
Alex_Burn
Спасибо за код, Somewhere!

Позволь задать пару вопросов:

1. Что делают последние 2 процедуры (ClearCrossword и CreateItemsByFields)?

2. В принципе, если пользователь при решении кроссворда допустил ошибку, то у него не получится полностью решить его правильно и картинка не получится. Но что если неопытный (или просто хитрый) юзер решит заполнить клеточки от балды. Как лучше произвести проверку правильности решения (наверное, это нужно сделать после окончания решения)?

Re: [pascal] Японские кроссворды

Добавлено: 24 апр 2007, 08:39
somewhere
&quot писал(а):1. Что делают последние 2 процедуры (ClearCrossword и CreateItemsByFields)?
Суть их ясна из названия
ClearCrossword - очищает весь кроссворд. Поля и определения.
CreateItemsByFields - создает элементы(цифры вверху и слева) по полям кроссворда.
Применяется при редактировании кроссворда, хотя возможно применять в других целях.
&quot писал(а):2. В принципе, если пользователь при решении кроссворда допустил ошибку, то у него не получится полностью решить его правильно и картинка не получится. Но что если неопытный (или просто хитрый) юзер решит заполнить клеточки от балды. Как лучше произвести проверку правильности решения (наверное, это нужно сделать после окончания решения)?
Я думаю, что проверка может быть в любое время. Если он в каком-то месте допустил ошибку, то числа сверху или слева будут окрашиваться, например, красным цветом. Если нет, то как обычно.

Re: [pascal] Японские кроссворды

Добавлено: 24 апр 2007, 11:38
Alex_Burn
Somewhere, подскажи пожалуйста где и как это лучше оформить. :rolleyes:

P.S. Извини за беспокойство и мою тупость. Наверняка я у тебя уже жутко достал