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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2012, 22:55   #1
Van-89
Пользователь
 
Регистрация: 06.12.2011
Сообщений: 23
Стрелка Символьная игра

Вечер добрый)...

Не могу дописать программу...
В общем в будущем будет типа игры...

Описание...
Загружается файл=карта из 0 и 1... 1=препятствие а 0=свободный путь...
Управление стрелками...

В общем то что сделал... Y=персонаж перемещается по загружаемой карте... Но я не могу нормально реализовать остановку перед препятствием...

Карта ничего не должна содержать кроме 0 и 1...
Потом еще сделаю перемещение по вертикали...

-------------

В общем подскажите как реализовать остановку перед препятствием...

Цитата:
Uses CRT;

VAR x, y, h, numb, box_x, user: integer;
i: char;
box: String;
f1: text;

LABEL m1;

Begin

x:=1;
box_x:=0;

assign(f1, 'c:\start.txt');

Repeat
Clrscr;
reset(f1);

Repeat
read(f1, h);
box_x:=box_x+1;

if (box_x=x) then begin
box:='Y';
user:=h;
end else

if (h=1) then box:='X' else
if (h=0) then box:='0';
write(box);

Until box_x=10;
close(f1);
box_x:=0;

i:=ReadKey;
if (i=#77) and (x<10) then x:=x+1 else
if (i=#75) and (x>1) then x:=x-1;

Until 2>3;

writeln('exit');
readln;
end.
Файл start.txt содержит...

Цитата:
0 0 0 0 0 0 1 1 1 1
Вложения
Тип файла: rar GAME.rar (506 байт, 6 просмотров)
Van-89 вне форума Ответить с цитированием
Старый 27.01.2012, 06:27   #2
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Твоя ошибка в том, что ты всякий раз при выводе поля читаешь файл. Во-первых, это очень дорого, но дело даже не в этом. При премещении Y тебе надо не только проверять выход за края (т.е. x<10 и x>1), но еще и содержимое той клетки, на которую идешь. Как это сделать? снова считывать файл, что ли? Конечно, нет. Надо один раз считать карту из файла и запомнить ее в массиве. И не надо перерисвывать все каждый раз с очисткой экрана. Иди в нужную позицию и сталвь нужный символ. Ну и остальное (используй case, делай сдвиги, задавай числа через константы..)

Короче, лови код. Я его довольно сильно переделал, разбирайся. Задавай вопросы..
Код:
Uses CRT;

const
  m= 10;

VAR
  i, x, y, h, d, user: integer;
  c: char;
  f1: text;
  board: array[1..m] of integer;

Begin
  assign(f1, 'start.txt');
  reset(f1);
  for i:=1 to m do Read(f1,board[i]);
  ClrScr;
  for i:=1 to m do if board[i]=1 then Write('X') else Write('0');
  x:=1;
  Repeat
    GotoXY(x,1);
    Write('Y');
    repeat
      d:= 0;
      c:=ReadKey;
      case c of
        #0: begin
          c:= ReadKey;
          case c of
            #77: d:= 1;
            #75: d:= -1;
          end
        end;
        #27: begin
          GoToXY(1,2);
          WriteLn('EXIT, hit ENTER :-)');
          readln;
          Halt
        end
      end;
      if (d<>0) and ((x+d=0) or (x+d>m) or (board[x+d]=1)) then d:= 0
    until d<>0;
    GoToXY(x,1);
    Write('0');
    x:= x+d
  Until false;
end.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 27.01.2012, 07:06   #3
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Да простят меня модераторы за мультипостинг, но, поскольку предыдущий свой мессадж я вижу вполне законченным, то считаю для себя возможным запостить еще один как продолжение и развитие темы (буде таковое кому-то интересно)).

Просто мне показалось странным и скучным то, что любое единичное препятствие в одномерном варианте является концом Вселенной, непроходимым ни при каких условиях. Так что я чуток дополнил прожку, распространив ее на два измерения. Не знаю, нужно ли сие ТС, но мне оно кагбэ не хватало )).
Код:
Uses CRT;

const
  xx= 80;
  xy= 25;
  clear= ' ';
  wall=  'X';
  man=   'Y';

VAR
  i, j, x, y, h, dx, dy, m, n, user: integer;
  c: char;
  f1: text;
  board: array[1..xx,1..xy] of integer;

Begin
  assign(f1, 'start.txt');
  reset(f1);
  readln(f1,m,n);
  for j:=1 to n do begin
    for i:=1 to m do Read(f1,board[i,j]);
    readln(f1)
  end;
  Close(f1);
  ClrScr;
  for j:=1 to n do begin
    for i:=1 to m do if board[i,j]=1 then Write(wall) else Write(clear);
    WriteLn
  end;
  x:= 1;
  y:= 1;
  Repeat
    GotoXY(x,y);
    Write(man);
    repeat
      dx:= 0;
      dy:= 0;
      c:=ReadKey;
      case c of
        #0: begin
          c:= ReadKey;
          case c of
            #77: dx:= 1;
            #75: dx:= -1;
            #72: dy:= -1;
            #80: dy:= 1;
          end
        end;
        #27: begin
          GoToXY(1,n+1);
          WriteLn('EXIT, hit ENTER :-)');
          readln;
          Halt
        end
      end;
      if (x+dx<=0) or (x+dx>m) or (y+dy<=0) or (y+dy>n) or (board[x+dx,y+dy]=1) then begin
        dx:= 0;
        dy:= 0
      end
    until dx+dy<>0;
    GoToXY(x,y);
    Write(clear);
    x:= x+dx;
    y:= y+dy
  Until false;
end.
Да, забыл сказать, входной файл примерно такой:
Код:
10 5   // размер по X, размер по Y
0 0 0 0 0 0 1 1 1 1
0 0 1 1 0 0 0 1 0 0
1 0 0 1 0 1 0 1 1 0
1 0 0 1 0 1 0 0 0 0
0 0 1 1 1 0 1 1 1 0
Предпочитаю на "ты".

Последний раз редактировалось TinMan; 27.01.2012 в 07:18.
TinMan вне форума Ответить с цитированием
Старый 28.01.2012, 17:48   #4
Van-89
Пользователь
 
Регистрация: 06.12.2011
Сообщений: 23
По умолчанию

Спасиб всё работает!...
Van-89 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
символьная матрица as1212 Помощь студентам 0 27.11.2011 15:39
символьная матрица as1212 Помощь студентам 3 12.11.2011 20:39
символьная матрица as1212 Помощь студентам 0 12.11.2011 17:33
Символьная на С Max3 Помощь студентам 1 16.05.2010 20:47
символьная информ. С++ MoonDancer Помощь студентам 2 23.12.2009 04:12