Pascal project 2 (rebirth)

 

DiSok

втянувшийся
И так ,как я уже писал,Я готовлю проект "пятнашки" .весь проект в краткости... Начало игри, расставляет в array[1..4,1..4] of integer, 15 целых чисел,а 16 число пустое , т.е. ноль. Все эти числа я расставляю в разбросаном порядке. Игрок видит перед собои таблицу,как пятнашки, внутри таблицы есть 15 цифр разбросаных,теперь игрок двигает клавиатурой курсор на нужную ему клетку (цифру) которуу он хочет передвинуть с пустои клеткои (ну простой принцип игры пятнашки) помечает ентером и идет на пустую клетку и нажимает ентер снова (етим самим передвигая цифру которую он пометил раньше... но есть условие,что пустая клетка должна находится только на следуушей клетке , то есть сверху на одну клетку,снизу,слева и справа). Так игрок переставляет цифри ПОКА.. пустая клетка не доидет до правого нижнего угла,тогда компютер проверяет,если таблица (array[1..4,1..4] ) упорядочена по порядку , т.е. слевого верхнего угла у нас стоит число один,потом два и так до 15... Все конец игры...
Ну и кому после этого кажется легко? Биллу Геитсу.... :) ) вот так :)
таперь возникает вопрос, как мне рассунуть числа в таблицу array [1..4,1..4] предварительнее положив все числа в другой
var
Nice array[1..4*4]of integer;
4to v nice[1] будет 1б nice[15] будет 15, ф в nice[16] будет 0. Тем самым,я раскладываю ети variables в таблицу . Всем спасибо. :bangdesk:
 
За такой интерфейс убивают ;) . Из рогатки.

Использовать надо 4 кнопки управления курсором. Никаких Энтеров.
Поскольку "курсор" у нас уже есть - пустое место, стрелка вверх - передвинуть плашку снизу на пустое место, вниз - ту, что сверху, и т.п.
 

DiSok

втянувшийся
о'к , но как я буду помечать клетку,которую я хочу переменять местами с пустой? и еше вопрос,как я сделаю так чтобы он прыгал с одной цифры на другую? стрелками? или ты хочешь сказать,что мой курсор всегда будет пустая клетка и при нажатии вверх он поменяется с той клеткой куда я нажму?
 
Ничего помечать не надо!!
Вот поле
  
( 1)( 2)( 3)( 4)
( 5)(  )( 6)( 7)
( 8)( 9)(10)(11)
(12)(13)(14)(15)

Стрелка вверх- девятка вверх. стрелка влево - шестерка влево. И так далее.
В 15 же плашку можно двигать только на соседнюю ячейку, и только по прямой - так зачем заморачиваться?
 

DiSok

втянувшийся
Da ti prav,eto horoshaya ideya :) no vopros v tom kak ti eto budesh delat'? cherez case? ili cherez proceduri?
 
Можно и через if :D главное, чтобы работало.
Я Паскаль уже подзабыл.

Так... Я не учитель программирования...

Накорябаю всё же псевдокод.

Procedure PaintField;
Function GameNotEnded:boolean;
Procedure InitField;
Function GetKey:integer;
Procedure ProcessKey(Key:integer);
Function ValidMoveFrom(x,y:integer):boolean;


begin
InitField;
PaintField;
While (GameNotEnded)
begin
ProcessKey(Getkey);
end;
end;

Дальше сам.
Удачи.
 

DiSok

втянувшийся
o'k vale :) normal'no a chto ti podrazumeval pod
Procedure PaintField;
Function GameNotEnded:boolean;
Procedure InitField;
Function GetKey:integer;
Procedure ProcessKey(Key:integer);
Function ValidMoveFrom(x,y:integer):boolean;
hotyabi kratkoe ob'yasnenie napishi pojaluista :)
 

DiSok

втянувшийся
и еше,а если я захочу виити в любой момент? ну к примеру esc в играх,ето тоже надо учесть... :)
 
Это заголовки функций. Что они делают,ясно из названий.
Esc, разумеется, ловит GetKey, а обрабатывает процедура ProcessKey.

Function Getkey;
key:integer;
begin
Case (GetBiosKey(?))
$011B: GetKey:=kbEsc; return;
$????: GetKey:=kbArrowUp; return;
else GetKey:=kbNoValidKeyHit;
end;
Все. Теперь я точно замолчал. Хватит халявы.
:D А Паскаль я, оказывается, действительно уже не помню... :eek:
 

DiSok

втянувшийся
Ну ладно,все равно я ничего не понял из того 4то ты написал...
:) но как я должен знать 4то лево и право это оказывается #75 это лево а #77 это право (на клавиатуре, при функции readkey)
ESC я знаю это #27 ,а как будет вверх и вниз? И вообше,readkey сканирует то что нaходится в variable ? к примеру
Ch:=ReadKey;
case ch of
#77 : writeln ...
.
.
.
В этом примере variable ch он char, и получает #77 ? (если допустим я нажму право )... ? Спасибо :) :Bangdesk:
 
+
-
edit
 

varban

администратор
★★★
DiSok> :) но как я должен знать 4то лево и право это оказывается #75 это лево а #77 это право (на клавиатуре, при функции readkey)
DiSok>ESC я знаю это #27 ,а как будет вверх и вниз?

Слушай, я не писал никогда на паскале и не знаю, какую компилялку юзаешь, но ставлю три унции золота против две зубочистки, что сканкоды, ASCII коды и прочие есть в хелпе к компилятору.
Даже в инете рыться не надо :cool:

> И вообше,readkey сканирует то что нaходится в variable ?

Аналогично.
Пишешь readkey в редакторе интегрированной среды, вызываешь хелп и если он не выведет описание readkey и пример употребления, то идешь бить морду тому, кто тебе всучил этот ублюдочный компилятор.
 
+
-
edit
 

varban

администратор
★★★
А пятнашки я писал в вурде, в 1994 году. Тогда Word Basic учил, если кто помнит такое - до WinWord7 продержался.

Только у меня интерфейс был дефольный - хоть мышью, хоть клавишами.

Коллеги на заводе до сих пор юзают :)
 

DiSok

втянувшийся
хех, мда, я использую free Pascal :) А использую его потому что в Windows'e идет,а доса у меня нету... Ну так вот,весь хелп перерыл,а они там только влево и вправо используут,но я уже в инете нашел,4то вверх это #72, вниз то #80 :) ентер #13. :) такие вот дела,спасибо за ответ :)
 

DiSok

втянувшийся
А #0 это все клавиши или что? я это так и не понял...
 
+
-
edit
 

varban

администратор
★★★
DiSok>хех, мда, я использую free Pascal :) А использую его потому что в Windows'e идет,а доса у меня нету...

Только что запустил досовский Борланд Си 3.1 под XP.
Следовательно и Борландовский паскаль заведется.
 

Zeus

Динамик

Йе, а что, комп сам играть не будет? Ну, это не интересно :cool:

По уже обсужденному пара замечаний:

1. readkey (вообще, Варбан прав, ну да ладно :) ) Читаем раз, если #27, выходим, если #0, читаем еще раз, и вот тогда уже пойдут расширенные коды для стрелок всяких (влево 75, вправо 77, вверх 72, вниз 80). Вообще, чтобы больше вопросов по кодам не было, набиваешь маааленькую программку и играешься:
uses crt;
var c:char;
begin
   repeat
      c:=readkey;
      writeln(ord©);
   until c=#27;
end.

2. Если первоначальная комбинация составляется случайно, учти, что не каждая из них приводит к выигрышу. Ситуация, когда все числа стоят по порядку, кроме последней пары (...13,15,14) - неразрешима и, в принципе, коли уж она допустима, может считаться выигрышем (окончанием). При случайном раскладе шанс прийти к такому варианту - 1/2.
И животноводство!  

Vit

новичок
varban>Только что запустил досовский Борланд Си 3.1 под XP.
varban>Следовательно и Борландовский паскаль заведется.

На мощных машинах (больше Celeron 566) проги на Турбо паскале (и борланд паскале) выпадают с ошибкой "Деление на ноль". Ошибка в модуле Crt, в процедуре Delay().

Если надо могу кинуть патч...
 

Vit

новичок
Виноват, повтор... (первый раз на авиабазу пишу :rolleyes: )
 

Zeus

Динамик

DiSok>все нормуль Зеус,а по4ему это такая ситуация неразрешима?
DiSok>Ну допустим меня есть уже готовая програма ,и играу я себе на здоровье :) все комбинации разрешены,только помучатся нужно :)
DiSok>и эта (13)(14)(15)(..) тоже

Нет. Любая первоначальная комбинация сводится либо к упорядоченной, либо к упорядоченной за исключением последней пары. Одна к другой никак не сводится. Доказательства не помню, но оно вполне строгое. Читал, кажется, у Перельмана ("Живая математика" наверное).

DiSok>И вообще,что такое #0?

Как обычно, просто символ с кодом 0. Нажатие на "расширенные" клавиши (стрелки, Home/End/Ins/Del, F1..F10, Alt+что-нибудь etc.) загоняет в буфер сразу два символа - 0 и расширенный код.
И животноводство!  

DiSok

втянувшийся
приведи к примеру таблицу, у которой нету решения... всегда можно подвинуть плашку на другое место, на ето и игра "Пятнашки" А c #0
понятно :)
 

Zeus

Динамик

DiSok>приведи к примеру таблицу, у которой нету решения... всегда можно подвинуть плашку на другое место, на ето и игра "Пятнашки"

Вот елки. Сколько повторять можно. Ну, на, передвигай:
( 1)( 2)( 3)( 4)
( 5)( 6)( 7)( 8)
( 9)(10)(11)(12)
(13)(15)(14)(  )

И животноводство!  

DiSok

втянувшийся
все нормуль Зеус,а по4ему это такая ситуация неразрешима?
Ну допустим меня есть уже готовая програма ,и играу я себе на здоровье :) все комбинации разрешены,только помучатся нужно :)
и эта (13)(14)(15)(..) тоже
 

DiSok

втянувшийся
И вообще,что такое #0 ? :bangdesk:
 

DiSok

втянувшийся
ну сам представь,купил пятнашки,а у тебя такая комбинация вишла, что делать будеш? вибрасивать? Ну а если уй так,то мойно сделать проверку, что если так випало,то сделаи раскладку еше раз,и так пока раскладка небудет красивои :)
 
+
-
edit
 

varban

администратор
★★★
Здорово, конечно. Но не придумал - правда жизни. В эпоху кубиков Рубика очень популярно было :D
 

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru