Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2012, 06:38   #1
tony_su
 
Регистрация: 19.04.2012
Сообщений: 4
По умолчанию Игра "Шериф"

итак курсовая работа в паскале - написать игру шериф. суть программы:
1) меню , надыбал шаблон, подправил под сви нужды
Код:
program menu;
uses Crt;
const
     NORM=$17;
     SEL=$70;
     N=2;
var
     menu:array[1..N] of string[12];
     punkt:integer;
     ch:char;
     x,y:integer;

Procedure punkt1;
begin
     ClrScr;
     writeln('игра');    {сюда надо будт запихнуть игрушку заместо вывода}
     readln;
end;
Procedure MenuToScr;
var i:integer;
begin
     ClrScr;
     for i:=1 to N do begin
          GoToXY(x,y+i-1);
          write(menu[i]);
     end;
     TextAttr:=SEL;
     GoToXY(x,y+punkt-1);
     write(menu[punkt]);
     TextAttr:=NORM;
end;
begin
     menu[1]:='Играть ';
     menu[2]:='Выход';
     punkt:=1;
     x:=30;
     y:=10; TextAttr:=NORM;
     MenuToScr;
     repeat
          ch:=ReadKey;
          if ch=char(0) then begin
               ch:=ReadKey;
               case ch of
                    chr(80):
                         if punkt<N then begin
                              GoToXY(x,y+punkt-1);
                              write(menu[punkt]);
                              punkt:=punkt+1;
                              TextAttr:=SEl;
                              GoToXY(x,y+punkt-1);
                              write(menu[punkt]);
                              TextAttr:=NORM;
                         end;
                    chr(72):
                         if punkt>1 then begin
                              GoToXY(x,y+punkt-1);
                              write(menu[punkt]);
                              punkt:=punkt-1;
                              TextAttr:=SEl;
                              GoToXY(x,y+punkt-1);
                              write(menu[punkt]);
                              TextAttr:=NORM;
                         end;
                 end;
              end
          else
               if ch=chr(13) then begin
                    case punkt of
                         1:punkt1;
                         2:ch:=chr(27);
                    end;
                    MenuToScr;
               end;
     until ch=chr(27);
end.
2) при переходе по первому пункту меню переход к выбору количества окон( 6 или 9 иначе выкидывает в меню) потом сама игрушка в окошках рандомно появляются человечки , цель настрелять максимум фрагов , по кнопке esq вывод количества очков(да количесвто фрагов должно быть в левом верхнем углу во время игры) и выход в меню . Пока сделал "домик" , и сделал прицел, он бегает под управлением стрелочек( решил не заморачиваться с мышью . вот что есть
Код:
Program Sight;
   Uses Crt, Graph;
   Const Step = 7;  {шаг движения прицела}
      Instr = 'esc - âûõîä';
   Var
     GrDriver, GrMode : Integer;
     X, Y             : Integer; {   координаты прицела        }
     XStr, YStr       : String;
     Ch               : Char;
     l,a1,b1,a2,b2,a3,b3,xo,yo,x1,y1,x0,y0,d,m:integer;
 {-----------------------------------------------------------}
  Procedure MakeSight (X, Y : Integer);
   Begin
xo:=70;      {ширина и высота окна}
yo:=90;
x0:=180;     {точка откуда начинают строиться окошки}
y0:=50;
x1:=30;       { интервал}
y1:=30;
setcolor(7);
rectangle(x0-x1,y0-y1,x0+3*xo+3*x1,y0+3*yo+3*y1);     { рамочка вокруг окон}
a1:=x0;
a2:=x0+xo+x1;
a3:=x0+2*xo+2*x1;
b1:=y0;
b2:=y0+yo+y1;
b3:=y0+2*yo+2*y1;
bar(a1,b1,a1+xo,b1+yo);               
bar(a2,b1,a2+xo,b1+yo);
bar(a3,b1,a3+xo,b1+yo);
bar(a1,b2,a1+xo,b2+yo);
bar(a2,b2,a2+xo,b2+yo);
bar(a3,b2,a3+xo,b2+yo);
bar(a1,b3,a1+xo,b3+yo);
bar(a2,b3,a2+xo,b3+yo);
bar(a3,b3,a3+xo,b3+yo);
   SetColor(Green);
     line(X-10, Y, X+10, Y);
     line(X, Y-10, X, Y+10); { ïðèöåë }
     Str(X, XStr); Str(Y, YStr);
    { OutTextXY(X+25, Y-35, 'x=' + XStr);
     OutTextXY(X+25, Y-20, 'y=' + YStr)   }
        End;
{----------------------------------------------}
 BEGIN
    GrDriver := Detect;
   InitGraph(GrDriver, GrMode, 'C:\TP\BGI');
   SetColor(LightGray);
   X := GetMaxX div 2; Y := GetMaxY div 2;  
   MakeSight(X, Y);

   While TRUE do  
     begin

        Ch := ReadKey;
        Case Ch of
           #27: begin CloseGraph; Halt(1) end; 
           #75: X := X-Step; 
           #77: X := X+Step; 
           #72: Y := Y-Step;
           #80: Y := Y+Step
          end;
        ClearViewPort;
        MakeSight(X, Y);
     end;
    CloseGraph;
 END.
человечки наверно будут треугольник а на нем кружочек ,стрелять на пробел, соответственно при выстреле из х , у значение присваиваются другим переменным и проверяются на нахождения внутри человечка, если да то +1 к фрагам. как это осуществить? и как потом склеить меню с игрушкой? + все моргает сильно при движении(( Любая конструктивная критика приветствуется.
P.S. несложные задачки не проблема, а вот чет заумное не осилил
P.S.S. игры на паскале как я понял то еще извращение((
tony_su вне форума Ответить с цитированием
Старый 03.05.2012, 23:28   #2
tony_su
 
Регистрация: 19.04.2012
Сообщений: 4
По умолчанию

ау , блин нет мозговитых что ли? хелп плиз
tony_su вне форума Ответить с цитированием
Старый 04.05.2012, 13:38   #3
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Телепатов нет.
Приведи полностью условие задачи и свои соображения по реализации.

Ну и комментарии в коде расставь.
s-andriano вне форума Ответить с цитированием
Старый 05.05.2012, 00:12   #4
tony_su
 
Регистрация: 19.04.2012
Сообщений: 4
По умолчанию

игра шериф :
суть - написать прогу , запускаем ехе-шник в меню (2 пункта играть и выход) нажимаем играть и включается игра. "Правила данной игры следующие - вы играете за шерифа, случайным образом в окнах дома появляются бандиты, которых нужно пристрелить. За каждого убитого бандита дается одно очко. Управление игрой происходит с клавиатуры, есть возможность сохранять и загружать состояние игры и менять количество окон(6 или 9)." здесь есть готовый вариант http://www.kurslab.ru/sherif.html для общего понятия конечного результата , но разкомпилировать вроде как нельзя.
реализация рисуем домик(+) реализация движения курсора стрелками(+) реализация проверки попадания в мишень(-) реализация генерации мишеней в окнах случайным образом(-) и рисование самих мишеней в результате предыдущего пункта(-) код изменился слегка , дописал коменты, хз почему но русский шрифт при открывания .pas блокнотом превращаются в краказябрики есть вариант как вытаскивать из turbopascal код без данной проблемы?
код игры, надеюсь теперь коментов достаточно, если что спрашивайте отвечу

Последний раз редактировалось tony_su; 05.05.2012 в 00:20. Причина: 5000 ограничение - многа букаф , в следующий пост не влезло
tony_su вне форума Ответить с цитированием
Старый 05.05.2012, 00:12   #5
tony_su
 
Регистрация: 19.04.2012
Сообщений: 4
По умолчанию

Код:
Program sherif;
   Uses Crt, Graph;
   Const Step = 10;  {и*Ј }
   Var
     GrDriver, GrMode : Integer;
     X, Y             : Integer; { Координаты курсора }
     FStr             : String ; {переменная для вывода количества убитых}
     Ch               : Char;
     kol,nom,t,l1,l2,l3,l4,l5,l6,l7,l8,l9,f,a,b,xo,yo,x1,y1,x0,y0,d,m:integer;{ переменные для генерации мишеней в окнах }
     g1,g2,g3,g4:real;
 {-----------------------------------------------------------}
  Procedure MakeSight (X, Y : Integer);{подпрограмма прицела , жмем вправа прицел едет вправо, влево-влево и т.д.}
   Begin
     SetColor(red);{ставим цвет прицела}
     setfillstyle(1,red);
     bar(X-10, Y-1, X+10, Y+1); {рисуем сам крестик прицела}
     bar(X-1, Y-10, X+1, Y+10); {рисуем крестик прицела}
   { Str(X, XStr); Str(Y, YStr);
     OutTextXY(X+25, Y-35, 'x=' + XStr);
     OutTextXY(X+25, Y-20, 'y=' + YStr)   вывод координат прицела проверял работоспособность кода}
        End;
  Procedure dom (X, Y : Integer); {подпрограмма рисует сам дом , написанна в относительных переменных , что бы можно было редактировать размеры дома мишеней и т.д.}
   Begin
   setfillstyle(1,8);
   bar(x0-x1,y0-y1,x0+3*xo+3*x1,y0+3*yo+3*y1);{сам домик }
   setfillstyle(1,14);
   bar(x0,y0,x0+xo,y0+yo); { все бары ,что ниже -окошки}
   bar(x0+xo+x1,y0,x0+xo+x1+xo,y0+yo);
   bar(x0+2*xo+2*x1,y0,x0+2*xo+2*x1+xo,y0+yo);
   bar(x0,y0+yo+y1,x0+xo,y0+yo+y1+yo);
   bar(x0+xo+x1,y0+yo+y1,x0+xo+x1+xo,y0+yo+y1+yo);
   bar(x0+2*xo+2*x1,y0+yo+y1,x0+2*xo+2*x1+xo,y0+yo+y1+yo);
   bar(x0,y0+2*yo+2*y1,x0+xo,y0+2*yo+2*y1+yo);
   bar(x0+xo+x1,y0+2*yo+2*y1,x0+xo+x1+xo,y0+2*yo+2*y1+yo);
   bar(x0+2*xo+2*x1,y0+2*yo+2*y1,x0+2*xo+2*x1+xo,y0+2*yo+2*y1+yo);
   end;
  Procedure mishen(a,b: Integer);{ подпрограмма которая рисует мишень в окне}
   Begin
    setcolor(3);
    circle(a+x0+(xo div 2),b+y0+(yo div 3),(yo div 6));{ рисуем саму мишень - эта и 3 следующие строки,a и b присваивая переменные которым будут рисоваться мишени в разных окнах, тобишь координаты а для х b для y}
    setfillstyle(1,3);
    floodfill(a+x0+(xo div 2),b+y0+(yo div 4),3);
    bar(a+x0+(xo div 6),b+y0+(yo div 2),a+x0+((xo div 6)*5),b+y0+yo);
   end;
   procedure check(l1,l2,l3,l4,l5,l6,l7,l8,l9,f,x,y:integer);{процедура проверки попал ли выстрел в цель, прописан для 1-го окна только в качестве теста, не работает -(((((( хз почему}
    begin
    if l1=1 then begin
     if ((x>x0) and (x<x0+xo) and (y>y0) and (y<y0+yo)) then {проверка попали ли в квадрат корпуса}
     f:=f+1;
     if(sqrt((xo/2+x0-x)*(xo/2+x0-x)+(y0+yo/2-y)*(y0+yo/2-y)) < ( yo/6)) then{проверка попадания в голову}
     f:=f+1;
    end;
    end;
{----------------------------------------------}
 BEGIN {собственно сама программа}
xo:=70;{xo yo размеры окон}
yo:=90;
x0:=180;{x0 y0 координаты откуда начинает рисоваться дом}
y0:=50;
x1:=15;{x1 y1 интервал между окнами}
y1:=15;
f:=0;{количество убитых бандитов}
    GrDriver := Detect;
   InitGraph(GrDriver, GrMode, 'C:\TP\BGI');
   SetColor(LightGray);
   randomize;
   X :=x0+2*xo+x1; {выставляем курсор в начальное положение}
   Y :=y0+2*yo+y1;
   dom(x,y);(
   mishen(a,b);
   MakeSight(X, Y);
  { kol:=random(3)+1;}     //
   kol:=1; {}              //
   for t := 1 to kol       //  
   do nom:= random(8)+1;   //
   case nom of             //
   1: l1:=1;               //    данная часть программы отвечает за случайную генерацию человечков в окнах, надо будет выкинуть в подпрограмму, количество одновременно мишеней максимум 3, как реализовать время показывания мишени???????
   2: l2:=1;               //
   3: l3:=1;               //
   4: l4:=1;               //
   5: l5:=1;               //
   6: l6:=1;               //
   7: l7:=1;               //
   8: l8:=1;               //
   9: l9:=1;               //
   end;
   While TRUE do
     begin
        setbkcolor(7);
        Ch := ReadKey;   {чтение кнопок и собственно управление }
        Case Ch of
           #27: begin CloseGraph; Halt(1) end; {esc -выход}
           #75: begin X := X-Step; if (x<0) then x:=640; end; {влево}
           #77: begin X := X+Step; if (x>640) then x:=0; end; {вправо}
           #72: begin Y := Y-Step; if (y<0) then y:=480; end; {вниз}
           #80: begin Y := Y+Step; if (y>480) then y:=0; end; {вверх}
           #32: check(1,0,0,0,0,0,0,0,0,f,x,y);{пробел обращение к проверке попадания при нажатии пробела написал для проверки на 1-е окно, похоже чет накосячил }
            end;
        ClearViewPort;
        dom(x,y);{рисуем домик}
        Str(f,FStr); {перекидывание переменной в стринг для вывода количества убитых на экран}
        OutTextXY(0,0, 'убито бандитов '+FStr);
        mishen(a,b);{рисуем мишень}
        OutTextXY(0,400, 'выход <Esc>');
        OutTextXY(0,420,'‘огонь <пробел>');
        MakeSight(X, Y);{прицел}
     end;
    CloseGraph;
 END.

Последний раз редактировалось tony_su; 05.05.2012 в 00:19. Причина: не дописал все коменты(
tony_su вне форума Ответить с цитированием
Старый 05.05.2012, 10:43   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

У меня нет ТР, а в том компиляторе, что есть, приведенная программа не работает.
Первый вопрос при просмотре кода:
- а что, массивы вы еще не проходили? (переменные l1-l9)
Впрочем, массив здесь, на мой взгляд, вообще не нужен. Ведь больше одного бандита у нас не будет, следовательно, достаточно единственной переменной - номера окна с бандитом. Эту переменную, как мне кажется, нужно передавать в процедуру рисования дома, чтобы последний рисовался прямо вместе с бандитом.
Ну и еще, для начала я бы упорядочил основной игровой цикл, расположив блоки в таком порядке:
- отрисовка,
- ввод с клавиатуры,
- анализ ввода и изменение состояния.
Одновременно это поможет убрать из начала программы ненужные вызовы процедур.
s-andriano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
игра "worms", доработка игры "косынка". C# den790 Фриланс 11 09.12.2011 10:53
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. воваава Помощь студентам 3 01.12.2011 12:50
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Игра "четный" "нечетный" bigcat Помощь студентам 1 01.03.2008 00:24