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

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

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

Автор: Vikki 28.01.2016 22:38

Здравствуй, помогите, пожалуйста. пишу игру кости подскажите где ошибка, начала с программы полегче, в итоге (в законченной программе) на экране должно появиться три кубика и их сумма внизу, нажатие клавиши "пробел" - означает повтор игры, "delete"- завершение игры.



Uses CRT, GraphABC;
var i:integer;
c: char;
t: byte;
label m1,loop;
procedure kyb1;
begin
floodfill(1,1,clgreen);
setwindowsize(800,800);
//квадрат
setpencolor(clblack);
setbrushcolor(clblack);
RoundRect(100,100,700,700,50,50);
//круг
setpencolor(clred);
setbrushcolor(clred);
circle(400,400,80);
end;

procedure kyb2;
begin
floodfill(1,1,clgreen);
setwindowsize(800,800);
//квадрат
setpencolor(clblack);
setbrushcolor(clblack);
RoundRect(100,100,700,700,50,50);
//круг
setpencolor(clred);
setbrushcolor(clred);
circle(250,250,60);
circle(550,550,60);
end;

procedure kyb3;
begin
floodfill(1,1,clgreen);
setwindowsize(800,800);
//квадрат
setpencolor(clblack);
setbrushcolor(clblack);
RoundRect(100,100,700,700,50,50);
//круг
setpencolor(clred);
setbrushcolor(clred);
circle(250,250,60);
circle(550,550,60);
circle(400,400,60);
end;

procedure kyb4;
begin
floodfill(1,1,clgreen);
setwindowsize(800,800);
//квадрат
setpencolor(clblack);
setbrushcolor(clblack);
RoundRect(100,100,700,700,50,50);
//круг
setpencolor(clred);
setbrushcolor(clred);
circle(250,250,60);
circle(550,550,60);
circle(250,550,60);
circle(550,250,60);
end;

procedure kyb5;
begin
floodfill(1,1,clgreen);
setwindowsize(800,800);
//квадрат
setpencolor(clblack);
setbrushcolor(clblack);
RoundRect(100,100,700,700,50,50);
//круг
setpencolor(clred);
setbrushcolor(clred);
circle(250,250,60);
circle(550,550,60);
circle(250,550,60);
circle(550,250,60);
circle(400,400,60);
end;

procedure kyb6;
begin
floodfill(1,1,clgreen);
setwindowsize(800,800);
//квадрат
setpencolor(clblack);
setbrushcolor(clblack);
RoundRect(100,100,700,700,50,50);
//круг
setpencolor(clred);
setbrushcolor(clred);
circle(250,250,50);
circle(550,550,50);
circle(250,550,50);
circle(550,250,50);
circle(250,400,50);
circle(550,400,50);
end;


begin
m1:
rectangle(0,0,800,800);
setbrushcolor(clgreen);
setpencolor(clgreen);
textout(200,10,'Программа эмитирует бросиние игральной кости');

randomize;
i:=random (7) ;
if i=0 then goto m1;
if i=1 then kyb1;
if i=2 then kyb2;
if i=3 then kyb3;
if i=4 then kyb4;
if i=5 then kyb5;
if i=6 then kyb6;
begin
clrscr;
t := 0;
repeat
textout(250,750,'Нажмите `пробел` для повторного броска');
textout(300,780,'Нажмите `delete` для выхода');
loop:
c := readkey;
if not (c in [#32, #46]) then goto loop;
if c = #32 then goto m1
else
until (c = #46) or (t=2);

hidecursor;
end;
end.

Добавлено через 9 мин.
Помогите, пожалуйста, очень нужно!!! sad.gif


Прикрепленные файлы
Прикрепленный файл  _______________2.pas ( 3.36 килобайт ) Кол-во скачиваний: 401

Автор: Федосеев Павел 29.01.2016 0:12

У меня нет PascalABC. Могу просмотреть только глазами. Что за ошибка?

------------------
Цикл в основной программе я бы сделал так:

begin

randomize;

rectangle(0, 0, 800, 800);
setbrushcolor(clgreen);
setpencolor(clgreen);

clrscr;

textout(200, 10, 'Программа эмитирует бросиние игральной кости');
textout(250, 750, 'Нажмите `пробел` для повторного броска');
textout(300, 780, 'Нажмите `delete` для выхода');

hidecursor;

repeat
{ввод команды}
repeat
c := readkey;
until c in [#32, #46];
{обработка команд}
case c of
#32: {новый бросок}
begin
i := random(6) + 1;
case i of
1: kyb1;
2: kyb2;
3: kyb3;
4: kyb4;
5: kyb5;
6: kyb6;
end;
end;
end;
until (c = #46) or (t = 2);

end.
Могу ошибаться в графических командах, но смысл именно такой. Лишь в процедурах рисования граней сделал бы не окантовку квадрата, а заливку квадрата.

Автор: Vikki 29.01.2016 0:35

Павел, спасибо, это действительно работает, а не подскажете как сделать выход в любой момент по нажатию клавиши

Автор: Федосеев Павел 29.01.2016 1:04

Я теряюсь. Ведь в этой программе только один цикл обработки команд (нажатий на кнопки) совмещённый с циклом ожидания. И там выход однозначный.

Если таких циклов обработки будет несколько (например, один в экране/ах справки, другой в экране меню, третий в игровом экране), то можно сделать глобальную переменную активности программы Active, в начале программы сделать Active:=true, а в случае нажатия кнопки выхода, присвоить Active:=false. И на каждом уровне проверять состояние этой переменной.
Это пример, с кучей ошибок, только для иллюстрации идеи


var
Active: boolean;
.........................

procedure ShowHelpScreen;
begin
repeat
{ввод команды}
repeat
c := readkey;
until c in [#32, #33, #46];
{обработка команд}
case c of
#32: {следующая подсказка}
begin
.............
end;
#33: {предыдущая подсказка}
begin
............
end;
#34: {завершение подсказки}
begin
............
break; {выход из командного цикла - завершение подсказки}
end;
#46: Active:=false; {завершение программы}
end;
until not Active;
end;
.........................
begin
Active:=true;
...........
repeat
{ввод команды}
repeat
c := readkey;
until c in [#32, #33, #46];
{обработка команд}
case c of
#32: {новый бросок}
begin
............. игровое действие
end;
#33:
begin
ShowHelpScreen; {вызов экрана справки со своим обработчиком команд}
end;
#46: Active:=false;
end;
until not Active;
...........
end.

Автор: Vikki 29.01.2016 1:18

Павел, простите за мою наглость(просто я совсем новичок в этом), но вы не поможете сделать так чтобы было три кубика на экране разные(рандомно), и внизу выводилась их сумма unsure.gif

Автор: Федосеев Павел 29.01.2016 2:15

Нет. У меня нет PascalABC. Вдобавок, вы пытаетесь работать, а я халявой всё испорчу.

Подброшу идею.
Можно сделать три переменные - состояния кубиков - Cube1, Cube2, Cube3. Ну или один массив из трёх элементов вместо этих переменных. Ну пусть будут переменные. Тогда в обработке команд

..........
#32: {новый бросок}
begin
Cube1 := random(6) + 1;
Cube2 := random(6) + 1;
Cube3 := random(6) + 1;
PaintCube(x1, y1, Cube1); {рисование 1-го кубика}
PaintCube(x2, y2, Cube2); {рисование 2-го кубика}
PaintCube(x3, y3, Cube3); {рисование 3-го кубика}
end;
.............

Само рисование кубика сделайте таким (это условно, т.к. проверить не могу)
procedure PaintCube(x,y:integer; Cube: integer);
begin
case Cube of
1: kyb1(x,y);
2: kyb2(x,y);
3: kyb3(x,y);
4: kyb4(x,y);
5: kyb5(x,y);
6: kyb6(x,y);
end;
end;

А процедуры kybX оформите с относительными координатами. Наподобие (нужно проверять, но не на чем - отладьте на одном кубике и примените к нескольким):
  procedure kyb2(x, y: integer);
begin
floodfill(1, 1, clgreen);
setwindowsize(x+800, y+800);
//квадрат
setpencolor(clblack);
setbrushcolor(clblack);
RoundRect(x+100, y+100, x+700, y+700, 50, 50);
//круг
setpencolor(clred);
setbrushcolor(clred);
circle(x+250, y+250, 60);
circle(x+550, y+550, 60);
end;

Не могу проверить рисование. В общем, должен получиться квадратик с кружочками. Причём при рисовании не должно быть очистки всего экрана - только заполнение области квадратика. А координаты должны быть связаны с x и y, чтобы одной процедурой рисовать и 1-й и 2-й и 3-й кубик.

Надеюсь, понятно объяснил. Только код не могу проверить.

Автор: Vikki 29.01.2016 2:30

Павел, спасибо вам огромное за вашу помощь!!! smile.gif