Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2012, 19:44   #1
Svaa
 
Регистрация: 20.04.2012
Сообщений: 9
Вопрос Программа "Ход конём" на Pascal ABC.

Здравствуйте. Обращаюсь за помощью. Прошу помочь написать программу на Pascal ABC. Нужно обойти конём все клетки игрового поля, размером NxM клеток, побывав на каждой клетке ровно по одному разу. Для этого щелчком мыши выбрать любое поле в качестве начального положения коня. Затем также щелчком мыши выбрать один из возможных вариантов хода коня. Поле, где находится конь, отмечается буквой «К», а поля, на которые он может пойти, отмечаются кружками. Пройденные поля должны помечаться каким-либо знаком. Программа должна выдавать сообщение «Тупик!», если конь не имеет больше ходов, а остались не посещённые им поля, и сообщение «Победа!», если удалось решить поставленную задачу.
Размеры таблицы могут выбираться из вариантов с помощью меню, например, при выборе варианта «Новичок» размер таблицы равен 3х4 клетки, при выборе варианта «Любитель» 6х6, а при выборе варианта «Эксперт» 8х8 клеток. Все, что у меня получилось, так это составить небольшой набросок программы, форму, и то я не уверен, что все там правильно работает.
Ниже код на Pascal ABC. Помогите, пожалуйста.

Последний раз редактировалось Svaa; 20.04.2012 в 20:41.
Svaa вне форума Ответить с цитированием
Старый 20.04.2012, 19:49   #2
Svaa
 
Регистрация: 20.04.2012
Сообщений: 9
По умолчанию

Код:
uses vcl;
const
  N=3;
  M=4;
  fcol = clWhite;
  ncol=6;
  empty=0;
  normal=1;
  accent=2;
  traveled=3;

//$VCLDESIGN+
var
  Form1: Form;
  MainMenu1: MainMenu;
  PaintBox1: PaintBox;
//$VCLDESIGN-
Form2: Form;
  TextLabel1: TextLabel;
  Button1: Button;
dx, dy, xL, xR, yU, yD : integer;
//-----
type
  TCell=class
    ns, np, color, status : integer;
    constructor Create(_ns, _np : integer);
    procedure Draw;
  end;
//-----
  constructor TCell.Create(_ns, _np : integer);
  begin
    ns:=_ns;
    np:=_np;
    status:=empty;
end;
//-----
  procedure TCell.Draw;
  var x, y : integer;
  begin
    x:=xL+(np-1)*dx;
    y:=yU+(ns-1)*dy;
    case status of
      empty :
      begin
        PaintBox1.Pen.Color:=clBlack;
        PaintBox1.Brush.Color:=fcol;
        PaintBox1.Rectangle(x,y,x+dx+1,y+dy+1);
      end;
      normal :
      begin
        PaintBox1.Pen.Color:=clWhite;
        PaintBox1.Brush.Color:=clWhite;
        Sleep(200);
      end;
      accent :
      begin
        PaintBox1.Pen.Color:=clWhite;
        PaintBox1.Pen.Width:=3;
        PaintBox1.Line(x+dx div 3, y+dy div 3,
                       x+2*dx div 3, y+2*dy div 3);
        PaintBox1.Line(x+2*dx div 3, y+dy div 3,
                       x+dx div 3, y+2*dy div 3);
        PaintBox1.Pen.Width:=1;
      end;
    end;
  end;
//-----
type
  TBoard = class
    mcell : array [0..N+1, 0..N+1] of TCell;
    vs, vp, count, numfree : integer;
    IsSelect : boolean;
    constructor Create;
//    procedure Add;
//    procedure Delete(ns,np: integer);
//    procedure Reaction(ns, np: integer);
//    procedure Check(ns, np: integer);
    procedure NewGame;
  end;
//-----
  constructor TBoard.Create;
  var ns, np : integer;
  begin
    count:=0;
    numfree:=N*M;
    IsSelect:=false;
    for ns:=0 to N+1 do begin
      for np:=0 to M+1 do begin
        mcell[ns,np]:=TCell.Create(ns,np);
        if (ns>=1) and (np>=1) and (ns<=N) and (np<=M)
        then mcell[ns,np].Draw;
      end;
    end;
  end;
//-----
  procedure TBoard.NewGame;
  var ns, np : integer;
  begin
    count:=0;
    numfree:=N*M;
    IsSelect:=false;
    for ns:=0 to N+1 do begin
      for np:=0 to M+1 do begin
        mcell[ns,np].status:=0;
        if (ns>=1) and (np>=1) and (ns<=N) and (np<=M)
        then mcell[ns,np].Draw;
      end;
    end;
  end;
//-----
procedure Form1OnClick;
begin

end;

procedure MainMenu1_1_1OnClick;
begin

end;

procedure MainMenu1_1_2_1OnClick;
begin

end;

procedure MainMenu1_1_2_2OnClick;
begin

end;

procedure MainMenu1_1_2_3OnClick;
begin

end;

procedure MainMenu1_2OnClick;
//---------------
begin
  Form2.Show;
end;
procedure Button1OnClick;
begin
  Form2.close;
end;
//-------------------
procedure InitControls;
begin
  Form1:= Form.Create(0,0,456,409);
  Form1.InitControl(True,False,alNone,crDefault,clBtnFace,'Hod konem','');
  MainMenu1:= MainMenu.Create;
  Form1.Menu:= MainMenu1;
  PaintBox1:= PaintBox.Create(Form1,24,24,249,225);
  PaintBox1.InitControl(True,True,alNone,crDefault,0,'0','');
  MainMenu1.Add('Menu');
  MainMenu1.items[1].Add('Novaya igra',MainMenu1_1_1OnClick);
  MainMenu1.items[1].Add('Vibor polya');
  MainMenu1.items[1].items[2].Add('3õ4',MainMenu1_1_2_1OnClick);
  MainMenu1.items[1].items[2].Add('6õ6',MainMenu1_1_2_2OnClick);
  MainMenu1.items[1].items[2].Add('8õ8',MainMenu1_1_2_3OnClick);
  MainMenu1.Add('O programme',MainMenu1_2OnClick);
  Form1.OnClick:=Form1OnClick;
  Form1.Position:= poScreenCenter;
  Form1.Show;
end;

begin
  InitControls;
  //----- 2
  Form2:= Form.Create(0,0,514,257);
  Form2.InitControl(True,False,alNone,crDefault,clBtnFace,'O programme','');
  TextLabel1:= TextLabel.Create(Form2,168,16,140,21);
  TextLabel1.InitControl(True,True,alNone,crDefault,clBtnFace,'Programma "Hod Konem"','');
  Button1:= Button.Create(Form2,200,192,105,25);
  Button1.InitControl(True,True,alNone,crDefault,0,'Zakrit okno','');
  TextLabel1.Font.Name:= 'Times New Roman';
  TextLabel1.Font.Size:= 14;
  Button1.OnClick:=Button1OnClick;
  Form2.Position:= poScreenCenter;
//-----
end.
Svaa вне форума Ответить с цитированием
Старый 22.04.2012, 14:22   #3
Svaa
 
Регистрация: 20.04.2012
Сообщений: 9
По умолчанию

Все еще актуально.
Svaa вне форума Ответить с цитированием
Старый 22.04.2012, 14:36   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Что на данный момент делает ваша программа?
У меня только пустой белый квадратик на форме.

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

Последний раз редактировалось BDA; 22.04.2012 в 14:47.
BDA вне форума Ответить с цитированием
Старый 23.04.2012, 20:45   #5
Svaa
 
Регистрация: 20.04.2012
Сообщений: 9
По умолчанию

На данный момент программа не делает ничего. Я создал только форму.
Пробовал исправить и дополнить, изменил не много, получилось не лучше.
Запускается форма, остальное у меня не получается сделать.
Во вложении, если можно его так назвать, "измененный" файл.
И еще один файл, практически эта же программа, как в условии, но написаная на HTML. Надо так понимать, что данный алгоритм HTML в Pascal ABC не получится переписать.
Вложения
Тип файла: rar Program1.rar (1.8 Кб, 13 просмотров)
Тип файла: rar hodkonem.rar (4.7 Кб, 10 просмотров)
Svaa вне форума Ответить с цитированием
Старый 25.04.2012, 19:14   #6
Svaa
 
Регистрация: 20.04.2012
Сообщений: 9
По умолчанию

Program2.pas

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



Код:
uses vcl;
 const
  N=3;
  M=4;
  fcol = clWhite;
  ncol=2;
  empty=0;
  normal=1;
  accent=2;
  traveled=3;
  listColor : array [1..ncol] of integer
    = (clRed, clLtGray);
//$VCLDESIGN+
var
  Form1: Form;
  MainMenu1: MainMenu;
  PaintBox1: PaintBox;
//$VCLDESIGN-
  Form2: Form;
  TextLabel1: TextLabel;
  Button1: Button;
  dx, dy, xL, xR, yU, yD : integer;
//-----
type
  TCell=class
    ns, np, color, status : integer;
    constructor Create(_ns, _np : integer);
    procedure Draw;
end;
//-----
  constructor TCell.Create(_ns, _np : integer);
  begin
    ns:=_ns;
    np:=_np;
    status:=empty;
end;
//-----
  procedure TCell.Draw;
  var x, y : integer;
  begin
    x:=xL+(np-1)*dx;
    y:=yU+(ns-1)*dy;
    case status of
      empty :
      begin
        PaintBox1.Pen.Color:=clBlack;
        PaintBox1.Brush.Color:=fcol;
        PaintBox1.Rectangle(x,y,x+dx+1,y+dy+1);
      end;
      normal :
      begin
        PaintBox1.Pen.Color:=clWhite;
        PaintBox1.Brush.Color:=clWhite;
        Sleep(200);
      end;
      accent :
      begin
        PaintBox1.Pen.Color:=clWhite;
        PaintBox1.Pen.Width:=3;
        PaintBox1.Line(x+dx div 3, y+dy div 3,
                       x+2*dx div 3, y+2*dy div 3);
        PaintBox1.Line(x+2*dx div 3, y+dy div 3,
                       x+dx div 3, y+2*dy div 3);
        PaintBox1.Pen.Width:=1;
      end;
    end;
  end;
//-----
type
  TBoard = class
    mcell : array [0..N+1, 0..M+1] of TCell;
    vs, vp, count, numfree : integer;
    IsSelect : boolean;
    constructor Create;
//    procedure Add;
//    procedure Delete(ns,np: integer);
//    procedure Reaction(ns, np: integer);
//    procedure Check(ns, np: integer);
    procedure NewGame;
  end;
//-----
  constructor TBoard.Create;
  var ns, np : integer;
  begin
    count:=0;
    numfree:=N*M;
    IsSelect:=false;
    for ns:=0 to N+1 do begin
      for np:=0 to M+1 do begin
        mcell[ns,np]:=TCell.Create(ns,np);
        if (ns>=1) and (np>=1) and (ns<=N) and (np<=M)
        then mcell[ns,np].Draw;
      end;
    end;
  end;
//-----
  procedure TBoard.NewGame;
  var ns, np : integer;
  begin
    count:=0;
    numfree:=N*M;
    IsSelect:=false;
    for ns:=0 to N+1 do begin
      for np:=0 to M+1 do begin
        mcell[ns,np].status:=0;
        if (ns>=1) and (np>=1) and (ns<=N) and (np<=M)
        then mcell[ns,np].Draw;
      end;
    end;
  end;
//-----
var
  board : TBoard;
  
procedure Form1OnClick;
begin

end;

procedure MainMenu1_1_1OnClick;
begin

end;

procedure MainMenu1_1_2_1OnClick;
begin

end;

procedure MainMenu1_1_2_2OnClick;
begin

end;

procedure MainMenu1_1_2_3OnClick;
begin

end;

procedure MainMenu1_2OnClick;
//---------------
begin
  Form2.Show;
end;
procedure Button1OnClick;
begin
  Form2.close;
end;
//-------------------
procedure InitControls;
begin
  Form1:= Form.Create(0,0,456,409);
  Form1.InitControl(True,False,alNone,crDefault,clBtnFace,'Hod konem','');
  MainMenu1:= MainMenu.Create;
  Form1.Menu:= MainMenu1;
  PaintBox1:= PaintBox.Create(Form1,24,24,249,225);
  PaintBox1.InitControl(True,True,alNone,crDefault,0,'0','');
  MainMenu1.Add('Menu');
  MainMenu1.items[1].Add('Novaya igra',MainMenu1_1_1OnClick);
  MainMenu1.items[1].Add('Vibor polya');
  MainMenu1.items[1].items[2].Add('3x4',MainMenu1_1_2_1OnClick);
  MainMenu1.items[1].items[2].Add('6x6',MainMenu1_1_2_2OnClick);
  MainMenu1.items[1].items[2].Add('8x8',MainMenu1_1_2_3OnClick);
  MainMenu1.Add('O programme',MainMenu1_2OnClick);
  Form1.OnClick:=Form1OnClick;
  Form1.Position:= poScreenCenter;
  Form1.Show;
  Form2:= Form.Create(0,0,514,257);
  Form2.InitControl(True,False,alNone,crDefault,clBtnFace,'O programme','');
  TextLabel1:= TextLabel.Create(Form2,138,16,140,21);
  TextLabel1.InitControl(True,True,alNone,crDefault,clBtnFace,'Programma "Hod Konem"','');
  Button1:= Button.Create(Form2,200,132,105,25);
  Button1.InitControl(True,True,alNone,crDefault,0,'Zakrit okno','');
  TextLabel1.Font.Name:= 'Times New Roman';
  TextLabel1.Font.Size:= 14;
  Button1.OnClick:=Button1OnClick;
  Form2.Position:= poScreenCenter;
end;

var k : integer;
begin
  InitControls;
  with PaintBox1 do begin
    dx:=(Width-20) div M;
    dy:=(Height-20) div M;
    xL:=Left-10; xR:=xL+N*dx;
    yU:=Top-10;  yD:=yU+M*dy;
  end;
  board:=TBoard.Create;
end.

Последний раз редактировалось Svaa; 25.04.2012 в 19:16. Причина: Дополнение
Svaa вне форума Ответить с цитированием
Старый 28.04.2012, 16:47   #7
Svaa
 
Регистрация: 20.04.2012
Сообщений: 9
По умолчанию

Все еще актуально.
Svaa вне форума Ответить с цитированием
Старый 28.04.2012, 19:24   #8
WhiskasTM
Подтвердите свой е-майл
 
Регистрация: 11.04.2012
Сообщений: 85
По умолчанию

Я не понял, это же дэлфи?
сегодня попробовал, прорисовку сделал, дошел до алгоритма правильности ходов и понятия не имею как сделать, понапихал if then , затем вспомнил про другие поля с разным кол-вом клеток. Нема. Вот тут есть сорсы этой игрушки на делфях http://umnik.rikt.ru/projectgame/gam...rse/horse.html

--edit---

4x3 общая функция не слушается, но там не сложно. Для 6x6 и 8x8 вроде без казусов и читерства. и без алгоритмов вообще, есть вероятность пойти туда, проверь не ходимвши ли уже да и иди по формуле
Вложения
Тип файла: rar Kon.rar (675.1 Кб, 12 просмотров)

Последний раз редактировалось WhiskasTM; 28.04.2012 в 22:34.
WhiskasTM вне форума Ответить с цитированием
Старый 29.04.2012, 00:20   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от WhiskasTM
Я не понял, это же дэлфи?
нет - в заголовке темы явно указано. это Pascal ABC.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.05.2012, 11:45   #10
Svaa
 
Регистрация: 20.04.2012
Сообщений: 9
По умолчанию

Это действительно не Delphi, просто эти языки похожи, система Pascal ABC разрабатывалась в среде Delphi. Возможно, если написать программу на Delphi, то, скорее всего, её можно будет переписать на Pascal ABC.

По программе:
Цитата:
uses vcl;
const
N=3;
M=4;

fcol = clWhite;
ncol=2;
empty=0;
normal=1;
accent=2;
traveled=3;
listColor : array [1..ncol] of integer
= (clRed, clLtGray);
Объявлять размеры поля константами N*M, наверное, будет неправильно?
По условию размер поля должен выбираться из трех вариантов.
Значит N и M должны быть переменными?
Цитата:
var
Form1: Form;
MainMenu1: MainMenu;
PaintBox1: PaintBox;
//$VCLDESIGN-
Form2: Form;
TextLabel1: TextLabel;
Button1: Button;
dx, dy, xL, xR, yU, yD, N, M : integer;
type
TBoard = class
mcell : array [0..N+1, 0..M+1] of TCell;
Но тогда программа в строке 69, столбец 26, выдает ошибку:
Цитата:
Ошибка: ожидалось константное выражение
Svaa вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу разобраться как работает программа (Pascal ABC) Amid1990 Помощь студентам 1 04.07.2011 01:42
Программа на Pascal ABC. Lols Помощь студентам 1 04.05.2011 21:53
Линейная программа.Pascal ABC. Lols Помощь студентам 2 04.05.2011 21:26
Программа с циклом.Pascal ABC Lols Паскаль, Turbo Pascal, PascalABC.NET 5 04.05.2011 21:07
программа в Pascal ABC Графика с фором Veron_20 Паскаль, Turbo Pascal, PascalABC.NET 0 28.12.2010 22:38