Здравствуй, помогите, пожалуйста. пишу игру кости подскажите где ошибка, начала с программы полегче, в итоге (в законченной программе) на экране должно появиться три кубика и их сумма внизу, нажатие клавиши "пробел" - означает повтор игры, "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 мин.
Помогите, пожалуйста, очень нужно!!!
Прикрепленные файлы
_______________2.pas ( 3.36 килобайт )
Кол-во скачиваний: 401
У меня нет 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.
Павел, спасибо, это действительно работает, а не подскажете как сделать выход в любой момент по нажатию клавиши
Я теряюсь. Ведь в этой программе только один цикл обработки команд (нажатий на кнопки) совмещённый с циклом ожидания. И там выход однозначный.
Если таких циклов обработки будет несколько (например, один в экране/ах справки, другой в экране меню, третий в игровом экране), то можно сделать глобальную переменную активности программы 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.
Павел, простите за мою наглость(просто я совсем новичок в этом), но вы не поможете сделать так чтобы было три кубика на экране разные(рандомно), и внизу выводилась их сумма
Нет. У меня нет 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;
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;
Павел, спасибо вам огромное за вашу помощь!!!