MacFiss
@MacFiss
человек

Как сделать управляемый интерфейс?

Доброго вечера. Столкнулся с проблемой под названием "курсовая работа". Тема гласит: "написать игру 'Балда'". Собственно приступил к написанию интерфейса, разработал класс который рисует при помощи модуля GraphABC шахматную сетку 5x5.

Суть игры: есть два игрока, изначально дается рандомное слово, в нем необходимо найти другое слово или слово + символ в пустой клетке.

Собственно проблема: Ячейки отрисовываю, но контролировать их не могу. Например что бы игрок мог воспользоваться клавишами (UP,DOWN,LEFT,RIGHT) и перемещать курсор(просто квадратик другого цвета) по сетке и если ячейка пуста, была возможность прописать букву. А после как-то записать полученное новое слово (что бы произвести поиск по словарю)

76996088e33b481da85735d489424516.png

Project:
uses GraphABC, ABCButtons, System, UserFriendly, Canvas;

 
var
  gameBtn: ButtonABC;
  
{Сгенерировать игровой экран}
procedure initGamePage();
begin
  SetWindowSize(500,400); 
  gameBtn.Destroy;
  Window.Clear();
  
  var number := 5;
  var canvas := new RowRectanglesStamp(30,30,50,50,number);
  
  canvas.Stamp;
  for var i:=1 to number-1 do
  begin
    canvas.y += canvas.height - 1;
    canvas.Stamp;
  end;
end; {initGamePage}
{Сгенерировать стартовый экран}
procedure initStartPage();
begin
  SetWindowSize(250,200);
  SetWindowIsFixedSize(true);
  SetWindowCaption('Игра: Балда (вер. 1)');

  gameBtn := generateButton('СТАРТ', 20, clwhite, true, true, 0, 20);
  gameBtn.OnClick := initGamePage;
  
  addText('Игра Балда', 20, clred, false, true, 0, 50);
end; {initStartPage}

begin
  initStartPage;
end.


UserFriendly.pas:
unit UserFriendly;

interface
  uses GraphABC, ABCButtons;
  function generateButton(name: string; fontSize: integer; color: System.Drawing.Color; hCenter: boolean := false; vCenter: boolean := false; x: integer := 0; y: integer := 0): ButtonABC;
  procedure addText(str: string; fontSize: integer; color: System.Drawing.Color; hCenter: boolean := false; vCenter: boolean := false; x: integer := 0; y: integer := 0);
implementation
{Добавление кнопки на полотно}
function generateButton: ButtonABC;
begin
  Font.Size := fontSize;
  var textWidth := TextWidth(name);
  var textHeight := TextHeight(name);
  
  if vCenter=true then
    x += (Window.Width - textWidth) div 2;
  
  if hCenter=true then
    y += (Window.Height - textHeight) div 2;
    
  Result := new ButtonABC(x,y,textWidth,textHeight,name,color);
end; {generateButton}
{Добавление текста на полотно}
procedure addText;
begin
  Font.Size := fontSize;
  Font.Color := color;

  var textWidth := TextWidth(str);
  var textHeight := TextHeight(str);
  
  if vCenter=true then
    x += (Window.Width - textWidth) div 2;
  
  if hCenter=true then
    y += (Window.Height - textHeight) div 2;
  
  TextOut(x, y, str);
end; {addText}

end.


Canvas.pas:
unit Canvas;

interface
  uses GraphABC;
  type 
    RectangleStamp = class
      x,y,w,h: integer;
      constructor (xx,yy,ww,hh: integer);
      begin
        x := xx; y := yy;
        w := ww; h := hh;
      end;
      procedure Stamp;
      begin
        Rectangle(x,y,x+w,y+h);
      end;
    end;
  
  type
    RowRectanglesStamp = class
      x,
      y,
      width,
      height,
      number: integer;
      constructor (_x,_y,_width,_height,_number: integer);
      begin
        x := _x;
        y := _y;
        width := _width;
        height := _height;
        number := _number;
      end;
      procedure Stamp;
      begin
        var _result := new RectangleStamp(x,y,width,height);
        _result.Stamp;
        for var i:=1 to number-1 do
        begin
          _result.x += _result.w - 1;
          _result.Stamp;
        end;
      end;
    end;
  implementation
end.
  • Вопрос задан
  • 423 просмотра
Пригласить эксперта
Ответы на вопрос 3
ThePyzhov
@ThePyzhov
iOS Ninja
Слишком уж заморочисто делать Балду через словарь. Проще сделать проверку другим игроком: игрок А ввел слово и когда нажал кнопку "ОК", у игрока Б высвечивается текст бокс с выбором, применять ли введенное слово или нет (т.е. существует ли такое слово или нет).

Ни разу не видел чтобы кто-то пользовался UP, DOWN - стрелками. Юзайте мышь. Отслеживайте просто координаты попадания курсора в клетку ячейку, и если она пуста, подсвечивайте каретку для того чтобы пользователь мог ввести букву. А далее запускайте выбор слова поочередным кликом по соседним буквам до тех пор, пока не будет нажата кнопка "ОК", ну или применить.
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
Дело тут вот в чём. Оконные ОС работают в событийном режиме: пришло событие «перерисовать», мы рисуем; пришло событие «щёлкнуть», мы щёлкаем. Но поскольку учебным программам надо быть предельно простыми, куда удобнее написать: нарисовать, дождаться нажатия клавиши — как во времена ДОС, когда процессорное время было полностью вашим от точки входа до передачи управления, когда был прямой доступ к видеопамяти… Для консольных программ всю эту событийщину скрыли, хитрым образом на уровне ОС засинхронизировав два потока: один отвечает за поддержание консольного окна, второй — собственно программа. А Pascal.ABC пришлось наладить простейшую эмуляцию, сделав «видеопамять» в виде внутреннего буфера.

Так что придётся подключать события — см. pascalabc.net/downloads/pabcnethelp/scr/PABCUnits/... — и смотреть, какие в этой абстракции найдутся дыры. А они, по Спольскому, будут обязательно: TCP — это протокол гарантированной доставки, но кто её гарантирует, когда физически выдернули провод…
Ответ написан
@MarkusD
все время мелю чепуху :)
Макар Герасимов , такс, для начала отключись от рисования и восприятия процесса глазами.

Первое, что тебе надо - это модель игрового поля. Модель - от слова "данных". В первую очередь тебе надо представить игру в виде модели данных, а не визуального представления. Вот давай пробуем...

Тетрадный лист в клетку напоминает что? - правильно, двухмерный массив. Стало быть, игровое поле удобно представить в виде двухмерного массива. А какой тип ячейки массива? - раз у нас игра про слова, которые по буквам пишутся в клетках, то, пожалуй, в ячейках надо хранить символы.

Крутяк, придумали игровое поле, в котором хранятся символы! Только заметь, символа в ячейке может и не быть.

Хорошо, идем дальше. У нас есть два игрока, которые могут писать слова.
Ага... Если писать, то надо знать - куда. Пользователю нужно указание, куда он сейчас будет писать - указать ячейку, в которую он сейчас поставит символ. А ячейки у нас в двухмерном массиве. Удобнее всего будет хранить координаты текущей ячейки пользователя!

Стало быть, пользователь у нас, как минимум, определяется координатами выбранной им ячейки на поле.

Каждому пользователю отведен ход, за время хода пользователь может менять позицию его выбранной ячейки и пробовать ввести слово. Стало быть, по событиям от клавиш можно управлять только выделенной ячейкой текущего пользователя. При этом надо не забывать ограничивать управление размерами игрового поля.

Когда пользователь вводит слово, нужно ограничивать движение его выделения только соседними клетками. Поставил пользователь первый символ, все, он вводит слово.

И заметь, это все полностью отвязано от графического представления. Сперва всегда надо продумывать именно модель данных.
На данном этапе описания у нас есть поле, пользователи с их выделениями и введенные слова. Модель данных дает полное представление как ее представлять пользователю.

Ну разве проблема отрисовать двухмерный массив символов? А по координатам закрасить другим цветом выделенную пользователем ячейку?

Как позволить пользователю выделять слова? После того как пользователь ввел свою букву, ему можно позволить перемещаться в ячейки с уже введенными буквами и маркировать их как слово. Введенное слово можно или по словарю проверить, или попросить подтвердить правильность слова всеми пользователями.

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

Войдите, чтобы написать ответ

Похожие вопросы