Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Написание игр _ игра "Кости"

Автор: yazer 18.11.2006 22:42

Сделал свою первую игру на Паскале. Зацените.
Прикрепленный файл  BONES.PAS ( 1.15 килобайт ) Кол-во скачиваний: 628

Автор: мисс_граффити 3.12.2006 1:27

goto сразу портит впечатление...
лучше сразу добавлять к случайному значению 1, чтобы 0 никогда не получался

Автор: yazer 9.12.2006 21:30

Зделал через процедуры без goto.
Дабавил к случайному значению 1, а всё равно иногда ноль випадает sad.gif
Прикрепленный файл  BONES2.PAS ( 1.18 килобайт ) Кол-во скачиваний: 449

Автор: Гость 9.12.2006 22:25

a:=random(6+1);
замени на
a:=random(6) + 1;

Автор: yazer 10.12.2006 21:02

Спасибо
Прикрепленный файл  BONES.PAS ( 1.17 килобайт ) Кол-во скачиваний: 446

Автор: Lapp 11.12.2006 17:53

Хорошо бы все же сделать какую-то возможность выхода из игры (например, ввод нулевой ставки).
Темно-красный на черном фоне очень плохо различим..
Мне кажется, лучше не стирать, а сохранять предыдущие ходы как протокол игры, но это дело вкуса.
Минутная задержка в конце игры - очень неудачное решение. Сделай ReadKey.
Кости по-английски называются Dice smile.gif
Забавно было бы рисовать выпвшие кости типа так:

  -----
|0 0|
| 0 |
|0 0|
-----

При написании соблюдай отступы внутри блоков - увидишь, как это помогает.

Автор: yazer 11.12.2006 22:50

Доделал. Только вопрос: как использовать readkey?
Прикрепленный файл  Dice.PAS ( 3.15 килобайт ) Кол-во скачиваний: 437

Автор: mamont001 12.12.2006 4:11

Цитата(yazer @ 11.12.2006 17:50) *

Только вопрос: как использовать readkey?


делаеш еще одну переменную типа char, например

symbol:char;



и в програме дописываеш вместо задержки


symbol:=readkey;



Автор: volvo 12.12.2006 4:16

Совершенно не обязательно вводить лишнюю переменную. ReadKey даже без присваивания (вызванный, как процедура) остановит работу программы до нажатия любой клавиши ...

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

Автор: Bokul 12.12.2006 4:32

Цитата
А вот потом желательно очистить буфер

Как?

Автор: volvo 12.12.2006 4:43

while keypressed do readkey;

или
repeat
readkey
until not keypressed;

Автор: Lapp 12.12.2006 9:38

Цитата(yazer @ 11.12.2006 19:50) *

Доделал.

Ты пошто из шестерки девятку сделал? Думаешь, так главнее?.. lol.gif

yazer, настоятельно тебе советую: поинтересуйся отступами.
В маленьких программах еще ничего, но потом запутаешься напрочь..

Автор: Lapp 12.12.2006 10:55

Способ рисования костей у тебя чересчур банальный.. Посмотри вот на эту процедурку.

uses crt;

procedure Picture(n:integer);
var
x,y,i,j:integer;
c:char;

procedure Put(i,j:integer);
begin
GotoXY(x+i,y+j);Write(с )
end;

begin
x:=WhereX;
y:=WhereY;
c:='|';
for i:=1 to 5 do begin
Put(0,i);Put(8,i)
end;
c:='-';
for i:=1 to 7 do begin
Put(i,0);Put(i,6)
end;
c:='0';
repeat
case n of
1: begin Put(4,3); n:=0 end;
2: begin Put(2,1); Put(6,5); n:=0 end;
3: begin Put(4,3); n:=2 end;
4: begin Put(6,1); Put(2,5); n:=2 end;
5: begin Put(4,3); n:=4 end;
6: begin Put(6,3); Put(2,3); n:=4 end;
end
until n=0
end;

var
i:integer;

begin
ClrScr;
for i:=1 to 6 do begin
GoToXY(i*12-10,i*3);
Picture(i)
end;
readKey
end.

Наверняка, можно еще гораздо компактнее сделать.. smile.gif

Автор: Lapp 12.12.2006 13:47

Ага, можно yes2.gif
Что-то меня пробило на это дело.. smile.gif Вот еще один вариант. Он не только компактнее, но еще и масштабируется при необходимости в некоторых пределах.
Попробуй! smile.gif

uses crt;

var
Lx,Ly:integer;

procedure Picture(n:integer);
const
Dice:array[1..6,1..6,1..2]of integer=
(((45,45),(0,0),(0,0),(0,0),(0,0),(0,0)),
((10,15),(75,65),(0,0),(0,0),(0,0),(0,0)),
((45,45),(10,15),(75,65),(0,0),(0,0),(0,0)),
((10,15),(75,65),(10,65),(75,15),(0,0),(0,0)),
((10,15),(75,65),(10,65),(75,15),(45,45),(0,0)),
((10,15),(75,65),(10,65),(75,15),(10,45),(75,45)));

var
x,y,i,j,k:integer;

procedure Put(c:char);
begin
GotoXY(x+i,y+j);Write©
end;

begin
x:=WhereX;
y:=WhereY;
for j:=2 to Ly-1 do begin i:=1;Put('|');i:=Lx;Put('|') end;
for i:=2 to Lx-1 do begin j:=1;Put('-');j:=Ly;Put('-') end;
x:=x+1;
y:=y+1;
for j:=1 to Ly do for i:=1 to Lx do for k:=1 to 6 do
if (Round((Lx-2)*Dice[n,k,1]/100)=i-1)and(Round((Ly)*Dice[n,k,2]/100)=j) then Put('0')
end;

var
i:integer;

begin
ClrScr;
Lx:=5;
Ly:=5;
for i:=1 to 6 do begin
GoToXY(i*12-10,i);
Picture(i)
end;
Lx:=7;
Ly:=5;
for i:=1 to 6 do begin
GoToXY(i*12-10,i+5);
Picture(i)
end;
Lx:=9;
Ly:=7;
for i:=1 to 6 do begin
GoToXY(i*12-10,i+10);
Picture(i)
end;
Lx:=11;
Ly:=7;
for i:=1 to 6 do begin
GoToXY(i*12-10,i+17);
Picture(i)
end;
readKey
end.

Автор: volvo 12.12.2006 13:51

blink.gif
Я бы дальше вот такого, скажем, не пошел... Ухудшается читабельность, потом разбираться придется, КАК оно работало...

uses crt;

procedure Picture(n:integer);
var
c: char;

procedure Put(i,j:integer);
var x, y: integer;
begin
X := whereX; Y := wherey;

GotoXY(x+i,y+j);Write( c );

GotoXY(X, Y);
end;

var
i: integer;
const
coord: array[1 .. 3] of integer = (1, 5, 3);

begin
c:='|';
for i:=1 to 5 do begin
Put(0,i);Put(8,i)
end;
c:='-';
for i:=1 to 7 do begin
Put(i,0);Put(i,6)
end;
c:='0';
repeat

if odd(n) then Put(4, 3)
else begin
Put(2, coord[n div 2]); Put(6, 6 - coord[n div 2]);
end;
n := 2 * (pred(n) div 2);

until n=0
end;

var
i:integer;

begin
ClrScr;
for i:=1 to 6 do begin
GoToXY(i*12-10,i*3);
Picture(i)
end;
readKey
end.

Автор: Lapp 12.12.2006 13:58

Цитата(volvo @ 12.12.2006 10:51) *

Я бы дальше вот такого, скажем, не пошел... Ухудшается читабельность, потом разбираться придется, КАК оно работало...

Абсолютно согласен, и тут два вывода: либо снабдить подробнейшими комментариями, либо уже ничего не менять, а пользоваться так smile.gif))