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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2010, 16:09   #1
Alexsey1991
Пользователь
 
Регистрация: 14.12.2009
Сообщений: 32
По умолчанию Библиотека CRT

Код:
uses crt;
var
x,y,i:integer;
kl:char;
begin
CRTWindowSize(100,100);
hidecursor;
textsize(20);
TextColor(4);
i:=0;
repeat
  kl:=readkey;
  write(kl);
  i:=i+1;
until false;
end.
При нажатии любого символа программа печатает его в случайном незанятом месте окна.Если всё окно заполнено ,вод символов прекращается.
Помогите доделать код.Как сделать чтобы печатала в случайном порядке?
И как сделать чтобы программа проверила что окно заполнено?
Alexsey1991 вне форума Ответить с цитированием
Старый 23.04.2010, 20:30   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1)
Цитата:
Код:
CRTWindowSize
что это за процедура? в стандартном CRT такой функции НЕТ!

2)
Цитата:
При нажатии любого символа программа печатает его в случайном незанятом месте окна.
есть много способов решить подобную задачу.

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

б) завести массив, размером равным размеру экрана.
и отмечать там занятые ячейки. Для удобства завести счётчик свободных мест

с) и, на мой взгляд, лучший способ из всех предложенных тут:
заводим массив, размером равным размеру экрана.
заполняем его последовательно всеми возможными координатами, где можно вывести символ. Потом случайным образом перемешиваем эти координаты.
Дальше просто - при каждом нажатии на клавишу берём следующие координаты.
Всё.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.04.2010, 19:20   #3
Alexsey1991
Пользователь
 
Регистрация: 14.12.2009
Сообщений: 32
По умолчанию

покажите примерно как это делать??
Alexsey1991 вне форума Ответить с цитированием
Старый 26.04.2010, 10:00   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
крайне неэффективно.
Развенчаю этот бессмысленный миф:
Код:
uses crt;
var c,x,y:integer;
begin
 clrscr;
 repeat
  x:=random(20);y:=random(20);
  c:=mem[$b800:$0000+(y*160+(x)*2)];
  while not (c in [0,32])and(not keypressed) do begin
   x:=random(20);y:=random(20);
   c:=mem[$b800:$0000+(y*160+(x)*2)];
  end;
  mem[$b800:$0000+(y*160+(x)*2)]:=ord('0');
until keypressed;
end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.04.2010, 20:12   #5
Alexsey1991
Пользователь
 
Регистрация: 14.12.2009
Сообщений: 32
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
c:=mem[$b800:$0000+(y*160+(x)*2)];
Скажите что это такое а то у меня паскаль ABC не знает его!!
Alexsey1991 вне форума Ответить с цитированием
Старый 27.04.2010, 08:37   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

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

2) Вас спасает быстродействие - ну действительно, даже 15 лет назад, а не говоря уж о современных компьютерах, что стоит сгенерировать несколько тысяч (а точнее, думаю, десятков) тысяч случайных координат, пока не найдётся пустая ячейка?...
(простой счётчик, подсчитывающий сколько раз сгенерили координаты, попадающие на уже занятое поле, легко покажет это. вначале, естественно, каждая пара координат будет генерится по разу, но потом, по мере заполнения поля, это число будет расти, и весьма сильно расти...

3) Кроме того, Вы совершенно забыли обеспечить завершение работы программы, после того, как не останется свободных ячеек: "Если всё окно заполнено ,вод символов прекращается."


___________________________________ _
Цитата:
Сообщение от Alexsey1991
Код:
c:=mem[$b800:$0000+(y*160+(x)*2)];
Скажите что это такое а то у меня паскаль ABC не знает его!!
это прямое обращение к видеопамяти.
Это прокатит только исключительно под DOS TurboPascal! Боюсь, что Ваш PascalABC Вас туда не пустит!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.04.2010, 16:40   #7
Alexsey1991
Пользователь
 
Регистрация: 14.12.2009
Сообщений: 32
Печаль

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Боюсь, что Ваш PascalABC Вас туда не пустит!
А как сделать на паскале ABC???
Alexsey1991 вне форума Ответить с цитированием
Старый 28.04.2010, 10:41   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
А как сделать на паскале ABC???
пользуетесь моей добротой...
причём, бесплатно!

Код:
uses crt;
const 
  MaxX = 10;
  MaxY = 5;

type 
  Point = record
    x, y : integer;
  end;

var
  i, j, k  : integer;
  kl   : char;
  PointArray : array[1..MaxX*MaxY] of Point;
  Tmp : Point;
begin
  {заполним массив всеми координатами}
  for i:=1 to MaxY do
    for j:=1 to MaxX do begin
      PointArray[(i-1)*MaxX + j].x := j;
      PointArray[(i-1)*MaxX + j].y := i;
    end;

  Randomize;
  {перемешиваем координаты 
     (тысяча случайных перемешиваний)
     1) можно брать любое достаточно большое число
     2) можно перемешивать чуть по другому - в двойном цикле,
          чтобы каждый элемент гарантированно перешёл на другое место...
  }
  for i:=1 to 1000 do begin
     j := Random(MaxX*MaxY) + 1;
     k := Random(MaxX*MaxY) + 1;
     if j<>k then begin
       Tmp := PointArray[j];
       PointArray[j] := PointArray[k];
       PointArray[k] := Tmp;
     end;
  end;

(* {выдать координаты на экран - для визуальной проверки}}
  for i:=1 to MaxX*MaxY do
  begin
    Write('(',PointArray[i].x, ',',PointArray[i].y,')');
    if (i mod 10) = 0 then WriteLn;
  end;
  Halt; {прервать выполнение программы}
*)

  CRTWindowSize(MaxX, MaxY);
  hidecursor;
  textsize(20);
  TextColor(4);
  i:=1;
  repeat
    kl:=readkey;
    gotoxy(PointArray[i].x,PointArray[i].y);
    write(kl);
    i:=i+1;
  until (i>MaxX*MaxY);
end.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Uses CRT; sir.andrey Помощь студентам 9 18.03.2010 14:43
Модуль CRT Sikey Фриланс 9 04.02.2010 20:41
модуль crt ksu25 Паскаль, Turbo Pascal, PascalABC.NET 2 24.10.2009 23:10
модуль crt BBagi Паскаль, Turbo Pascal, PascalABC.NET 1 27.12.2007 14:10