Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Одновременная работа циклов 
:(
    Опции темы
mes
Дата 17.5.2009, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250




нда.. У Вас вся логика завязана на глобальные переменные.
Чтоб добиться гибкости, необходимо, чтоб каждая (насколько это возможно) функция была законеченная, т.е не зависила бы от внешних факторов.
все необходимое, она должна узнавать не из глобальных перемен, а из своих параметров.

Вот примерчик: 
Код


struct SObject
{
    int x,y;
};

void DrawObject (SObject const& obj)
{
    line(obj.x-3, obj.y+8, obj.x-10, obj.y+13);
}

void Run ()
{

    SObject Objects[10]; 
        
    for (;;)
    {
        for (int i=0; i<10; ++i) DrawObject(Object[i]);
    }
}



--------------------
PM MAIL WWW   Вверх
Toxyrain
Дата 17.5.2009, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 15.4.2009

Репутация: нет
Всего: нет



что не работает примерчик (
PM MAIL   Вверх
Toxyrain
Дата 17.5.2009, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 15.4.2009

Репутация: нет
Всего: нет



в часности на эту строку 
Код

void DrawObject (SObject const& obj)

PM MAIL   Вверх
mes
Дата 17.5.2009, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Toxyrain @  17.5.2009,  11:53 Найти цитируемый пост)
в часности на эту строку 

ага, она в стиле С++

на Турбо Си кажется так будет :
Код

void DrawObject (struct SObject * obj)
{
    line(obj->x-3, obj->y+8, obj->x-10, obj->y+13);
}



--------------------
PM MAIL WWW   Вверх
Toxyrain
Дата 17.5.2009, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 15.4.2009

Репутация: нет
Всего: нет



теперь ругается на 
Код

SObject Objects[10]; 

и на 
Код

 for (int i=0; i<10; ++i) DrawObject(Object[i]);

PM MAIL   Вверх
mes
Дата 17.5.2009, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Toxyrain @  17.5.2009,  13:31 Найти цитируемый пост)
теперь ругается 

ну вобще то неплохо бы сообщать, как именно ругается, чтоб легче было понять в чем ошибка.

Код

struct SObject Objects[10]; 
...DrawObject(&Object[i]);






--------------------
PM MAIL WWW   Вверх
Toxyrain
Дата 17.5.2009, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 15.4.2009

Репутация: нет
Всего: нет



Код

 for (i=0; i<10; ++i)

struct DrawObject(Object[i]);
}


Constant expression required in function Run
Undefined structure 'DrawObject' in function Run
Undefined structure 'DrawObject' in function Run
Size of structure or array not known in function Run
вот так 
PM MAIL   Вверх
Toxyrain
Дата 17.5.2009, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 15.4.2009

Репутация: нет
Всего: нет



В обшем вот что я набыдлокодил потихоньку. Можете помочь сделать чтоб эти метеориты падали рандомно и до плоскостей + чтобы персонаж не мог проходить через плоскости и тот минерал(в планах n-ое кол-во штук) респался при его взятии на плоскости, а то у меня 2й день от этого голова болит (от части от того что препод немного не те темы давал нам и сейчас дал задание)
Код

#include <graphics.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

#include <time.h>

#include <dos.h>



void Init_Graph();

void charaster();

void meteor1();

void meteor2();

void meteor3();

void meteor4();

void meteor5();

void minerals();

char key;

int x;    /* x coords */

int y;    /* y coords */

int i;

int v;    /* moving speed */

int x1;

int y1;

int x2;

int y2;

int x3;

int y3;

int x4;

int y4;

int x5;

int y5;

int x6;

int y6;

int die;



int main(void)

{

  x=340;

  y=460;

  x6=320;

  y6=240;

  v=3;

  die=0;

  Init_Graph();

  setcolor(7);

  setfillstyle(1,6);

  bar(20,170,380,175);

  bar(260,260,640,265);

  charaster();



  for(;;)

  {

  minerals();

meteor1();



meteor2();



meteor3();



meteor4();



meteor5();

delay(4000);

if(die==1)

{

closegraph();

gotoxy(38,13);

textcolor(RED + BLINK);

printf("Game Over");

getch();

break;

}

if(kbhit())

{

  key=getch();

  if(key=='w' && y>=18)

  {

  setcolor(0);

  charaster();

  setcolor(7);

  y=y-v;

  charaster();

  }

  else

   if(key=='s' && y<=460)

   {

   setcolor(0);

  charaster();

   setcolor(7);

   y=y+v;

  charaster();

   }

   else

   if(key=='d' && x<= 623)

   {

   setcolor(0);

  charaster();

   setcolor(7);

   x=x+v;

  charaster();

   }

   else

   if(key=='a'&& x>=17)

   {

   setcolor(0);

  charaster();

   setcolor(7);

   x=x-v;

  charaster();

   }

   else

   if(key=='x')

   {

   closegraph();

   gotoxy(38,13);

   textcolor(RED + BLINK);

   printf("Game Over");

   getch();

   break;

   }

    }

    }





closegraph();

return 0;

}





void Init_Graph()

{

  int gdriver = VGA, gmode=2, errorcode;



  initgraph(&gdriver, &gmode, "");

  errorcode = graphresult();

  if (errorcode != grOk)  /* an error occurred */

  {

      printf("Graphics error: %s\n", grapherrormsg(errorcode));

      printf("Press any key to halt:");

      getch();

      exit(1); /* terminate with an error code */

  }

}



void charaster()

{

ellipse(x,y,360,0,4,7);

  line(x-3,y+8,x-10,y+13);

  line(x+3,y+8,x+10,y+13);

  line(x-12,y,x-4,y-5);

  line(x+4,y-5,x+12,y);

  line(x,y-7,x,y-8);

  circle(x,y-12,4);



}



void meteor1()

{



setcolor(4);

circle(x1,y1,5);

if(y1<=250)

{

setcolor(0);

circle(x1,y1,5);

setcolor(4);

y1=y1+2;

circle(x1,y1,5);



if((y1==y || y1==y-1 || y1==y-2 || y1==y-3 || y1==y-4 || y1==y-5 || y1==y-6 || y1==y-7 || y1==y-8 || y1==y-9 || y1==y-10) && (x1==x || x1==x-1 || x1==x-2 || x1==x-3 || x1==x-4 || x1==x-5 || x1==x-6 || x1==x-7 || x1==x-8 || x1==x-9 || x1==x-10))

die=1;

}

else

{

setcolor(0);

circle(x1,y1,5);

y1=10;

x1=630-random(128);

for(;;)

{

if(x1<=512 || x1>=630)

x1=630-random(128);

else

break;

}

}



}



void meteor2()

{

setcolor(4);

circle(x2,y2,5);

if(y2<=250)

{

setcolor(0);

circle(x2,y2,5);

setcolor(4);

y2=y2+2;

circle(x2,y2,5);



if((y2==y || y2==y-1 || y2==y-2 || y2==y-3 || y2==y-4 || y2==y-5 || y2==y-6 || y2==y-7 || y2==y-8 || y2==y-9 || y2==y-10) && (x2==x || x2==x-1 || x2==x-2 || x2==x-3 || x2==x-4 || x2==x-5 || x2==x-6 || x2==x-7 || x2==x-8 || x2==x-9 || x2==x-10))

die=1;

}

else

{

setcolor(0);

circle(x2,y2,5);

y2=10;

x2=630-random(256);

for(;;)

{

if(x2<=384 || x2>=512)

x2=630-random(256);

else

break;

}

}



}





void meteor3()

{

setcolor(4);

circle(x3,y3,5);

if(y3<=160)

{

setcolor(0);

circle(x3,y3,5);

setcolor(4);

y3=y3+2;

circle(x3,y3,5);



if((y3==y || y3==y-1 || y3==y-2 || y3==y-3 || y3==y-4 || y3==y-5 || y3==y-6 || y5==3-7 || y3==y-8 || y3==y-9 || y3==y-10) && (x3==x || x3==x-1 || x3==x-2 || x3==x-3 || x3==x-4 || x3==x-5 || x3==x-6 || x3==x-7 || x3==x-8 || x3==x-9 || x3==x-10))

die=1;

}

else

{

setcolor(0);

circle(x3,y3,5);

y3=10;

x3=630-random(384);

for(;;)

{

if(x3<=256 || x3>=384)

x3=630-random(384);

else

break;

}

}



}





void meteor4()

{

setcolor(4);

circle(x4,y4,5);

if(y4<=160)

{

setcolor(0);

circle(x4,y4,5);

setcolor(4);

y4=y4+2;

circle(x4,y4,5);



if((y4==y || y4==y-1 || y4==y-2 || y4==y-3 || y4==y-4 || y4==y-5 || y4==y-6 || y4==y-7 || y4==y-8 || y4==y-9 || y4==y-10) && (x4==x || x4==x-1 || x4==x-2 || x4==x-3 || x4==x-4 || x4==x-5 || x4==x-6 || x4==x-7 || x4==x-8 || x4==x-9 || x4==x-10))

die=1;

}

else

{

setcolor(0);

circle(x4,y4,5);

y4=10;

x4=630-random(512);

for(;;)

{

if(x4<=128 || x4>=256)

x4=630-random(512);

else

break;

}

}



}





void meteor5()

{

setcolor(4);

circle(x5,y5,5);

if(y5<=160)

{

setcolor(0);

circle(x5,y5,5);

setcolor(4);

y5=y5+2;

circle(x5,y5,5);

if((y5==y || y5==y-1 || y5==y-2 || y5==y-3 || y5==y-4 || y5==y-5 || y5==y-6 || y5==y-7 || y5==y-8 || y5==y-9 || y5==y-10) && (x5==x || x5==x-1 || x5==x-2 || x5==x-3 || x5==x-4 || x5==x-5 || x5==x-6 || x5==x-7 || x5==x-8 || x5==x-9 || x5==x-10))

die=1;

}

else

{

setcolor(0);

circle(x5,y5,5);

y5=10;

x5=630-random(630);

for(;;)

{

if(x5<=10 || x5>=128)

x5=630-random(630);

else

break;

}

}

}





void minerals()

{



setcolor(6);

circle(x6,y6,6);

if((x6==x || x6==x-1 || x6==x-2 || x6==x-3 || x6==x-4 || x6==x-5 || x6==x-6 || x6==x-7 || x6==x-8 || x6==x-9 || x6==x-10 || x6==x-11 || x6==x-12 || x6==x-13 || x6==x-14 || x6==x-15) &&

(y6==y || y6==y-1 || y6==y-2 || y6==y-3 || y6==y-4 || y6==y-5 || y6==y-6 || y6==y-7 || y6==y-8 || y6==y-9 || y6==y-10 || y6==y-11 || y6==y-12 || y6==y-13 || y6==y-14 || y6==y-15))

{

setcolor(0);

circle(x6,y6,6);

x6=random(610);

y6=random(460);

 }

}


 
PM MAIL   Вверх
mes
Дата 17.5.2009, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Toxyrain @  17.5.2009,  15:33 Найти цитируемый пост)
struct DrawObject(Object[i]);

нда.. я же совсем не то написал :

Цитата(mes @  17.5.2009,  13:34 Найти цитируемый пост)
struct SObject Objects[10]; 
...DrawObject(&Object[i]);


я так понял, что со структарами вы вобще не знакомы, тогда можно обойтись и без них.

вот ловите набросок и подгоняйте под нужды: 

Код

void DrawMeteor (int x, int y)
{
   // рисование относительно переданных координат
}

#define METEOR_COUNT  10
int meteor_x[METEOR_COUNT]; // координата х
int meteor_y[METEOR_COUNT]; // координата y
int meteor_v[METEOR_COUNT]; // коэффициент скорости

void PrepareMeteors ()
{
 // самый простой способ создать не пересекающеся и разнолинейное падение это разместить каждый метеорит на своей вертикали, и задать разную высоту 
       for (unsigned i=0; i<METEOR_COUNT; ++i)
       {        
           meteor_x[i]  = 20+640 / (METEOR_COUNT+1) * i; // 640 ширина экрана
           meteor_y[i] = -(i * 10); // отрицательная чтоб были за пределом экрана
           meteor_v[i]  = i/5;
       }
}
void DrawScene ()
{
         for (unsigned i=0; i<METEOR_COUNT; ++i)
         if (meteor_y[i])  // если попадает на экран то рисовать
              DrawMeteor (meteor_x[i], meteor_y[i]);
}

void MoveMeteors ()
{
         for (unsigned i=0; i<METEOR_COUNT; ++i)
         meteor_y[i]+= meteor_v[i];
}



void Run ()
{
     for (;;)
    {        
         DrawScene();
         delay (...);
         MoveMeteors ();
     }
}



Добавлено @ 23:30
Цитата(Toxyrain @  17.5.2009,  16:25 Найти цитируемый пост)
а то у меня 2й день от этого голова болит

при таком стиле программирования как у Вас, совсем не удивительно.
Старайтесь писать так, чтоб было понятно Вам, а не для того чтоб понял комп, и сразу станет легче.  smile 

Это сообщение отредактировал(а) mes - 18.5.2009, 18:28


--------------------
PM MAIL WWW   Вверх
Toxyrain
Дата 18.5.2009, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 15.4.2009

Репутация: нет
Всего: нет



ругается на 
Код

void DrawMeteor (int x, int y)
{
   // рисование относительно переданных координат
}

parametr 'y' is never used in function DrawMeteor
parametr 'x' is never used in function DrawMeteor

и на это 

Код

meteor_y[i]+= meteor_v;


Illegal use of pointer in function MoveMeteors


также ругалось на обїявление переменной 'i' в цикле но это утранил

Добавлено через 7 минут и 38 секунд
Исправил эти все ошибки заменив тут 
[code=cpp]
meteor_y[i]+= meteor_v;
[/code

meteor_v на число , но оно не рисует ничего (
PM MAIL   Вверх
mes
Дата 18.5.2009, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Toxyrain @  18.5.2009,  14:48 Найти цитируемый пост)

ругается на 
parametr 'y' is never used in function DrawMeteor
parametr 'x' is never used in function DrawMeteor

неудивительно, ведь  в комментах написано что нужно добавить в функцию.

Цитата(Toxyrain @  18.5.2009,  14:48 Найти цитируемый пост)
и на это 

а тут опечатка, вот :
Код

meteor_y[i]+= meteor_v[i];


Я так понял что и массивов не проходили ?! не поверю, раз задание составить игру.

Добавлено через 2 минуты и 14 секунд
Цитата(Toxyrain @  18.5.2009,  14:48 Найти цитируемый пост)
также ругалось на обїявление переменной 'i' в цикле но это утранил 

то есть турбо си не поддерживает объявление переменной внутри цикла ?!  smile 
Это на таком старье учат ?! Ужас, сразу неправильные привычки и образ мысли развивают, а потом уже трудно будет исправить :(


--------------------
PM MAIL WWW   Вверх
Toxyrain
Дата 18.5.2009, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 15.4.2009

Репутация: нет
Всего: нет



Функцию добавил такую circle(x,y,10);

там уже понял чего ругалось но не рисует 
Учил я все просто только с универа сдавал лабы по UML так и не сразу отловил что почем вот так

Добавлено через 6 минут и 43 секунды
Цитата(mes @  18.5.2009,  16:00 Найти цитируемый пост)
то есть турбо си не поддерживает объявление переменной внутри цикла ?!  smile 
Это на таком старье учат ?! Ужас, сразу неправильные привычки и образ мысли развивают, а потом уже трудно будет исправить :(


Да на таком учат, препод объявляет цикловые переменные как глобальные =(
Хотя когда я работаю на нормальном компиляторе то всегда объявляю их внутри, поэтому у меня так все и завязано на глоб переменных в игре потому что ТУрбо С ЗЛО
PM MAIL   Вверх
mes
Дата 18.5.2009, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Toxyrain @  18.5.2009,  14:48 Найти цитируемый пост)
но оно не рисует ничего ( 

ну чтоб рисовало в main надо написать :
Код

PrepareMeteors ();
Run ();

smile

Добавлено через 37 секунд
я думал до этого сами догадаетесь по коду smile


--------------------
PM MAIL WWW   Вверх
Toxyrain
Дата 18.5.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 15.4.2009

Репутация: нет
Всего: нет



Эм... я что то добавил но походу я в мэин добавил  DrawMeteor  =)

Добавлено через 13 минут и 9 секунд
Где тут и что прописать чтоб они когда падают падали как анимация(ну двигался кружочек тут он вырисовывает толстую линию) и чтоб по достижению нижней границы экрана стирался и появлялся гдето опять ?
PM MAIL   Вверх
mes
Дата 18.5.2009, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Toxyrain @  18.5.2009,  15:27 Найти цитируемый пост)
Где тут и что прописать чтоб они когда падают падали как анимация(ну двигался кружочек тут он вырисовывает толстую линию) ? 

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

Цитата(Toxyrain @  18.5.2009,  15:27 Найти цитируемый пост)
и чтоб по достижению нижней границы экрана стирался и появлялся гдето опять ? 

а вот для это Вам нужно сделать функцию-проверку, которая будет проверять метеоры по y и если они достигли края, то обнулять (точнее задавать  минусовое значение)

Добавлено через 5 минут и 26 секунд
Цитата(Toxyrain @  18.5.2009,  15:27 Найти цитируемый пост)
Эм... я что то добавил но походу я в мэин добавил  DrawMeteor  =)

Вначале вы должны вызвать все функции подготавливающее вашу сцену, после запускаете основной цикл (Run), после финализируете, если необходимо.
DrawMeteor должно вызываться в DrawScene,которая вызывается в свою очередь из основного цикла.


Это сообщение отредактировал(а) mes - 18.5.2009, 18:24


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1346 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.