MzSpider
Новичок
|
Cпс большое =))) Работает чучуть неправельно , попробую подрехтовать =)))
|
Всего сообщений: 19 | Присоединился: июль 2009 | Отправлено: 27 сен. 2009 8:15 | IP
|
|
MzSpider
Новичок
|
Терь над чтоб назад не хадил , тип если вперед сходил то рандом на назад , Я сделал так ток не работает var l : byte .... function getXY:integer; var b:integer; begin while not IsMovPosible(b) do b:=random(4)+1; if l <> b then getXY:=b; l := b; end;
|
Всего сообщений: 19 | Присоединился: июль 2009 | Отправлено: 27 сен. 2009 11:11 | IP
|
|
KrisRu
Новичок
|
у кого-нибудь есть легкие игры на Паскале(тетрис, змейка...), с подключенной клавиатурой и мышкой (меню тоже должно быть)... Скиньте, пожалуйста на ящик KrisRu@bk.ru Заранее спасибо!!!
|
Всего сообщений: 14 | Присоединился: сентябрь 2009 | Отправлено: 27 сен. 2009 17:37 | IP
|
|
Dale
Участник
|
var mas2 : array [1..80, 1..25] of boolean; .... procedure LoadMap(MapNum : byte); var mn : string; begin for i:=1 to 80 do for j:=1 to 25 do mas2[i,j]:=false; ... function isUzel(x,y:integer):boolean; var num:integer; begin num:=0; if mas[x,y-1]='0' then num:=num+1; if mas[x,y+1]='0' then num:=num+1; if mas[x-1,y]='0' then num:=num+1; if mas[x+1,y]='0' then num:=num+1; isUzel:=(num>=3); end; function getXY_2(z:integer;var x,y:integer):integer; begin case z of 1:begin x:=px; y:=py-1; end; 2:begin x:=px; y:=py+1; end; 3:begin x:=px-1; y:=py; end; 4:begin x:=px+1; y:=py; end; end; end; function getXY:integer; var b:integer; b2,b3,b4:integer; flag:boolean; num,num2,num3,num4,numX,numY:integer; x1,y1,x2,y2,x3,y3,x4,y4,rn:integer; begin {пол. куда двигаться: вверх, низ, лево или прво} {проверяем, узел ли это} num:=0; if (not(mas2[px,py-1]) and (IsMovPosible(1))) then num:=1; if (not(mas2[px,py+1]) and (IsMovPosible(2))) then num:=2; if (not(mas2[px-1,py]) and (IsMovPosible(3))) then num:=3; if (not(mas2[px+1,py]) and (IsMovPosible(4))) then num:=4; if (num<>0) then b:=num else begin if (IsMovPosible(k) and (not(isUzel(px,py)))) then b:=k else if {random(2)=1}false then begin for i:=1 to mx do for j:=1 to my do if mas[i,j]='3' then begin numX:=i; numY:=j; end; getXY_2(1,x1,y1); getXY_2(2,x2,y2); getXY_2(3,x3,y3); getXY_2(4,x4,y4); num:=(abs(x1*x1-numX*numX)+abs(y1*y1-numY*numY)); num2:=(abs(x2*x2-numX*numX)+abs(y2*y2-numY*numY)); num3:=(abs(x3*x3-numX*numX)+abs(y3*y3-numY*numY)); num4:=(abs(x4*x4-numX*numX)+abs(y4*y4-numY*numY)); b:=1; if (num>num2) then b:=2; if (num>num3) then b:=3; if (num>num4) then b:=4; while not IsMovPosible(b) do b:=random(4)+1; end else while not IsMovPosible(b) do b:=random(4)+1; end; getXY:=b; end; ......... clrscr; write_map; writeln(px,' ',py,' ',px2,' ',py2); gotoxy(px,py); mas2[px,py]:=true; ....... (Сообщение отредактировал Dale 28 сен. 2009 17:44)
|
Всего сообщений: 139 | Присоединился: май 2009 | Отправлено: 28 сен. 2009 17:28 | IP
|
|
Dale
Участник
|
mas2 - массив, показывающий, на каких клетках был минотавр. isUzel показывает, есть ли узел в позиции x,y getXY_2 выдает координаты клетки x и y в направлении z Алгоритм действия getXY: 1) Проверяем, ступал ли минотавр на окружающие клетки? Если нет, то идем туда. Иначе, если минотавр побывал на всех окружающих клетках: 2) принуждаем минотавра сохранить направление, если он не находится на узле. Иначе 3)вычисляем квадраты длин вектора расстояний от итоговой клетки до соседних клеток. Делаем так, чтобы минотавр свернул туда, где расстояние до логова наименьшее; random оставлен для того, чтобы в случае чкего минотавр смог выйти з тупика.
|
Всего сообщений: 139 | Присоединился: май 2009 | Отправлено: 28 сен. 2009 17:43 | IP
|
|
Dale
Участник
|
Интересно пробовать в больших лабиринтах :-) Правда, иногда минотавр надолго застревает в сложных тупиках. Стоит как-нибудь порыть в сторону алгоритма Дейкстры (Сообщение отредактировал Dale 28 сен. 2009 17:54)
|
Всего сообщений: 139 | Присоединился: май 2009 | Отправлено: 28 сен. 2009 17:52 | IP
|
|
MzSpider
Новичок
|
Dale, спс большое =))
|
Всего сообщений: 19 | Присоединился: июль 2009 | Отправлено: 28 сен. 2009 18:57 | IP
|
|
Dale
Участник
|
Незачто) KrisRu На счет меню - смотрите страницу 68 текущей темы Игра с "подключенной клавиатурой" рассматривается в текущий момент(авторство MzSpider ) Еще на стр. 69 выложена вроде работающая версия игры "камень ножницы бумага" для трех человек. Если хотите подключить мышь, то гугл в помощь... (Сообщение отредактировал Dale 29 сен. 2009 5:08)
|
Всего сообщений: 139 | Присоединился: май 2009 | Отправлено: 29 сен. 2009 4:49 | IP
|
|
Alsebra
Новичок
|
ребят,мне задали задачку Найти сумму членов арифметической прогрессии a, a+d, a+2d, ... ,a+(n-1)d по заданным a,d и n. кто подскажет с чего начать?а то я пока слаба в турбопаскале.Всем спасибки :-*
|
Всего сообщений: 3 | Присоединился: сентябрь 2009 | Отправлено: 29 сен. 2009 17:00 | IP
|
|
Dale
Участник
|
Alsebra Щас по-быстрому научим прогить на пскале :-) Начнем с простого примера. Итак, самая простая программа:
Code Sample:
begin end.
Как видите, все просто. Теперь сделаем так, чтобы пользователь мог ввести целые числа a, d, n. Целые числа (а так же не целые числа, строки и т.п. )хранятся в переменных. Нам понадобятся три целочисленные переменные, чтобы хранить числа a d и n. Раздел объявления переменных начинается с ключевого слова var, за которым через запятую следуют имена переменных , и в конце указывается тип переменных. Для целых чисел существует несколько типов данных. Нам достаточно типа integer. Для ввода чисел с клавиатуры будем использовать процедуру readln, которая считывает значения с клавиатуры с новой сроки. (если надо не с новой, используйте read) Итак: объявляем переменные, и вводим их с клавиатуры:
Code Sample:
var a,d,n:integer; begin readln(a); readln(b); readln(n); end.
Теперь нам нужно сосчитать сумму членов прогрессии. Как известно из математики, сумма n членов арифметической прогрессии вычисляется по формуле: Sn=((2a1+d(n-1))/2)*n Так что в рамках данной задачи нам не понадобится даже цикл. Просто ввод чисел и вывод результата. Вывод на экран производится с помощью процедур write или writeln. В итоге наш код будет выглядеть тким образом
Code Sample:
var a,d,n:integer; begin readln(a); readln(b); readln(n); writeln(((2*a+d*(n-1))/2)*n); readln; end.
Вроде все. Последний readln нужен для того, чтобы пользователь вышел из программы только после нажатия клавиши, иначе он не увидит результат.
|
Всего сообщений: 139 | Присоединился: май 2009 | Отправлено: 30 сен. 2009 1:54 | IP
|
|
|