Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Игра арканоид


Автор: Alexey91 20.4.2009, 17:13
Здравствуйте!

Дали тему - написать арканоид. Если кому не трудно, можете написать примерный алгоритм создания? 

Автор: zim22 20.4.2009, 17:29
http://lmgtfy.com/?q=%D0%B0%D1%80%D0%BA%D0%B0%D0%BD%D0%BE%D0%B8%D0%B4+site%3Avingrad.ru

Автор: Alexey91 21.4.2009, 07:36
К сожалению не помогло, а вы думаете я до этого не пробовал, большинство найденных тем оставлены без ответа и пустые(

Автор: zim22 21.4.2009, 08:19
Цитата(Alexey91 @  21.4.2009,  07:36 Найти цитируемый пост)
а вы думаете я до этого не пробовал

да, так и думаю.

http://forum.vingrad.ru/forum/topic-120571.html
http://forum.vingrad.ru/forum/topic-5200.html
http://forum.vingrad.ru/forum/topic-134016/anchor-entry1013510/0.html
http://forum.vingrad.ru/forum/topic-191137.html
http://forum.vingrad.ru/forum/topic-197048.html

Цитата(Alexey91 @  21.4.2009,  07:36 Найти цитируемый пост)
большинство найденных тем оставлены без ответа и пустые(

большинство - это не все.

Автор: Alexey91 21.4.2009, 08:49
Цитата

да, так и думаю.

Ну.. smile  Если хотите могу переслать свой журнал истории поиска, там есть даты. 

Цитата

http://forum.vingrad.ru/forum/topic-120571.html
http://forum.vingrad.ru/forum/topic-5200.html
http://forum.vingrad.ru/forum/topic-134016...y1013510/0.html
http://forum.vingrad.ru/forum/topic-191137.html
http://forum.vingrad.ru/forum/topic-197048.html

Ни в одной из этих ссылок не объясняется как происходит создание игры. Тем более, если быть конкретным, я задал вопрос в ветке с/с++. 

Автор: zim22 21.4.2009, 09:02
Цитата(Alexey91 @  21.4.2009,  08:49 Найти цитируемый пост)
Тем более, если быть конкретным, я задал вопрос в ветке с/с++. 

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


Автор: Alexey91 21.4.2009, 09:23
Хорошо, спасибо, секрет принимаю  smile 
Но в этих темах алгоритма все равно нет, зато есть частные вопросы

Автор: azesmcar 21.4.2009, 09:35
Alexey91

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

Автор: Alexey91 21.4.2009, 09:47
Ясно, спасибо ;)
А как реализовать, чтобы кубик, в которой попал шарик исчезал? И потом шарик уже свободно перелетал через это пространство?

Автор: azesmcar 21.4.2009, 09:51
Цитата

А как реализовать, чтобы кубик, в которой попал шарик исчезал? И потом шарик уже свободно перелетал через это пространство? 

Как реализовать на чем??? Это зависит от того как вы рисуете кубик, что вы используете (DirectX, OpenGL, GDI...)

Автор: mes 21.4.2009, 11:53
Цитата(Alexey91 @  21.4.2009,  08:47 Найти цитируемый пост)
А как реализовать, чтобы кубик, в которой попал шарик исчезал? И потом шарик уже свободно перелетал через это пространство? 

1. Заводите матрицу, каждый элемент которой и его положение  в оной  будет представлять кубик и относительную позицию на экране соответсвенно.
Заполняете матрицу нужными значениями и отрисовываете (значение может характеризовать как форму так и цвет кубика и возможно еще что нибудь)
Сама матрица тоже имеет координаты - тот прямоугольник в который "помещeны" все кубики.

2. При движение мячика проверяте пересекается ли его координаты, с координатами матрицы и если да, то с каким именно кубиком.
По значению этого кубика определяете тип взаимодействия и выполняете соответсвующая реакция для  мячика (изменение скорости, направления и т.д.) 
и кубика (изчез, надломался, не изменился)

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




 

Автор: sdukshis 21.4.2009, 23:24
Полностью готовую реализацию арканоида Вы можете посмотреть в книга А.Ламонта "Программирование игр под Windows"

Автор: Alexey91 22.4.2009, 07:57
Там нет арканоида  smile 

Автор: Alexey91 29.4.2009, 22:34
Возникла проблема, когда я отбибаю битой шарик по диагонали, то при соударении с квадратиком он не отталкивается обратно, а идет дальше.
Код

#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <dos.h>
#include <stdlib.h>

#define c15 textcolor(15);
#define col 30
#define row 4

int i,j,x=5, y=5, vx=1, vy=1, paddle=1,
    points=0, level=0, timet=0, blocks[row][col];

char a;
float s=1;

clock_t t1=0, t2=0; // timers



void arc(void)
{
 gotoxy(1,25);
 for(i=0; i<79; i++)
 printf(".");
 gotoxy(paddle,25);
 printf("!@@@!");
}

int ball(void)
{
 t2=clock();
 if((t2-t1)*(s/2) < timet) return 0;
 t1=clock();

 gotoxy(x,y); // koordinati sharika
 printf(" "); // zatiraet shleyf sharika

 if(x<=2 || x > 79) vx=-vx;
 if(y>23) // granica. SHAR DOHODIT DO NIZA
 {
  if(x==paddle) // otlet c bolshey skorostiyu s kraya ottolk. udaryatcya ob !xxxx
  {
   vy=-vy;
   vx=-vx;
   s++;

  }

  if(x==(paddle+1)) // x@xxx
  {
   vy=-vx;
   vx=-vx;

  }

  if(x==(paddle+2)) // xx@xx
  {
   if(vy==-vy) vy=vy;
   if(vy==vy) vy=-vy;
   vx=0;
  }

  if(x==(paddle+3)) // xxx@x
  {
   vy=-vy;
   vx=vx;
  }

  if(x==(paddle+4))// xxxx!
  {
   vy=-vy;
   vx=vx;
   s++;
  }

  if(x>(paddle+4) || x < paddle) return 1; // SHAR KRANTI
 }

 if(y<=2) vy=-vy; // OTTALKIVANIE OT POTOLKA

 x+=vx;
 y+=vy;

 gotoxy(x,y);
 printf("*");

 for(i=3; i < row+3; i++)
 {
  for(j=0; j < col; j++)
  {
   if(blocks[i-3][j]==1)
   {
    if(x==(10+j) && y==i)
    {
     points++;
     vy=-vy;
     blocks[i-3][j]=0;

    }
   }
  }
 }

 gotoxy(1,1); // INDIKATOR SBITIH KVADRATIKOV
 printf("Points: %d",points);
 return 0;
}

void putsq(void)
{
 textcolor(random(4*2)+1); cprintf("\376");
}

void squares(void)
{
 for(i=3; i < row+3; i++)
 {
  for(j=0; j < col; j++)
  {
   gotoxy(10+j*2,i);
   putsq();
  }
 }
}

void main()
{
 clrscr();
 for(i=0; i < row; i++)
 {
  for(j=0; j < col; j++)
  {
   blocks[i][j]=1;
  }
 }

 do
 {
  c15; cprintf("\nEnter difficulty 1<=diff<=4: ");
  scanf("%d",&level);
 }

 while(level < 1 || level > 4);
 clrscr();
 timet=level+1;
 squares();


 do
 {
  a=0;
  if(kbhit())
  {
   a=getch();
   if(a==77)
   {
    paddle++;

   }
   if(a==75)
   {
    paddle--;

   }
   if(paddle < 1) paddle=1;  // GRANICI DVIJENIYA ARKANOIDA
   if(paddle > 74) paddle=74;
   if(a == 32) break;  // BREAK NA PROBEL
   arc();
  }

  if(ball()) break;
 }
 while(1);

 if(points>100)
 {
  clrscr();
  c15; cprintf("\n\nYou are winner! :)");
  getch();
  return;
 }

 clrscr();
 c15; cprintf("Vi proigrali");

 getch();
}

Автор: mes 29.4.2009, 22:53
Цитата(Alexey91 @  29.4.2009,  21:34 Найти цитируемый пост)
 
 vy=-vx;
 if(vy==-vy) vy=vy;
 if(vy==vy) vy=-vy;


не кажется ли Вам, что в каждой из трех приведенных строчек (и к сожалению не только в них) не все в порядке с логичностью ?  smile 


Автор: Alexey91 29.4.2009, 23:11
Код

#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <dos.h>
#include <stdlib.h>

#define c15 textcolor(15);
#define col 60
#define row 5

int i,j,x=5, y=5, vx=1, vy=1, paddle=1,
    points=0, level=0, timet=0, blocks[row][col];

char a;
float s=1;

clock_t t1=0, t2=0; // timers


void arc(void)
{
 gotoxy(1,25);
 for(i=0; i<79; i++)
 printf(".");
 gotoxy(paddle,25);
 printf("!@@@!");
}

int ball(void)
{
 t2=clock();
 if((t2-t1)*(s/2) < timet) return 0;
 t1=clock();

 gotoxy(x,y); // koordinati sharika
 printf(" "); // zatiraet shleyf sharika

 if(x<=2 || x > 79) vx*=-1;
 if(y>23) // granica. SHAR DOHODIT DO NIZA
 {
  if(x==paddle) // otlet c bolshey skorostiyu s kraya ottolk. udaryatcya ob !xxxx
  {
   vy=-1;
   vx=-1;
   s++;

  }

  if(x==(paddle+1)) // x@xxx
  {
   vy=-1;
   vx=-1;

  }

  if(x==(paddle+2)) // xx@xx
  {
   if(vy==-1) vy=1;
   else vy=-1;
   vx=0;
  }

  if(x==(paddle+3)) // xxx@x
  {
   vy=-1;
   vx=1;
  }

  if(x==(paddle+4))// xxxx!
  {
   vy=-1;
   vx=1;
   s++;
  }

  if(x>(paddle+4) || x < paddle) return 1; // SHAR KRANTI
 }

 if(y<=2) vy*=-1; // OTTALKIVANIE OT POTOLKA

 x+=vx;
 y+=vy;

 gotoxy(x,y);
 printf("*");

 for(i=3; i < row+3; i++)
 {
  for(j=0; j < col; j++)
  {
   if(blocks[i-3][j]==1)
   {
    if(x==(10+j*2) && y==i)
    {
     points++;
     vy*=-1;
     blocks[i-3][j]=0;

    }
   }
  }
 }

 gotoxy(1,1); // INDIKATOR SBITIH KVADRATIKOV
 printf("Points: %d",points);
 return 0;
}

void putsq(void)
{
 textcolor(random(4*2)+1); cprintf("\376");
}

void squares(void)
{
 for(i=3; i < row+3; i++)
 {
  for(j=0; j < col; j++)
  {
   gotoxy(10+j*2,i);
   putsq();
  }
 }
}

void main()
{
 clrscr();
 for(i=0; i < row; i++)
 {
  for(j=0; j < col; j++)
  {
   blocks[i][j]=1;
  }
 }

 do
 {
  c15; cprintf("\nEnter difficulty 1<=diff<=4: ");
  scanf("%d",&level);
 }

 while(level < 1 || level > 4);
 clrscr();
 timet=level+1;
 squares();


 do
 {
  a=0;
  if(kbhit())
  {
   a=getch();
   if(a==77)
   {
    paddle++;

   }
   if(a==75)
   {
    paddle--;

   }
   if(paddle < 1) paddle=1;  // GRANICI DVIJENIYA ARKANOIDA
   if(paddle > 74) paddle=74;
   if(a == 32) break;  // BREAK NA PROBEL
   arc();
  }

  if(ball()) break;
 }
 while(1);

 if(points>100)
 {
  clrscr();
  c15; cprintf("\n\nYou are winner! :)");
  getch();
  return;
 }

 clrscr();
 c15; cprintf("Vi proigrali");

 getch();
}


Поправил, но проблема остается актуальной  smile 

Автор: mes 29.4.2009, 23:53
Цитата(Alexey91 @  29.4.2009,  22:11 Найти цитируемый пост)
Поправил, но проблема остается актуальной  smile 


Цитата(Alexey91 @  29.4.2009,  22:11 Найти цитируемый пост)
  if(x==(paddle+2)) // xx@xx
  {
   if(vy==-1) vy=1;
   else vy=-1;
   vx=0;

а может все таки 
Код

vy = -1;
vx = -vx;

 ?

Да и посмотрите на свои остальные условия - там куча повторений. Проведите внимательную ревизию и добейтесь, чтоб Вам самим было красиво и понятно, а не лишь бы написать,
и все заработает smile





Автор: Alexey91 30.4.2009, 13:52
Да, mes вообщем ты прав. Сейчас все работает, за помощь спасибо.

Код

#include <string.h>
#include <math.h>
#include <graphics.h>
#include <dos.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <process.h>
#include <time.h>

#define path "c:\\borlandc\\bin\\"
#define c15 textcolor(15);
#define col 60
#define row 3

int i,k=10,l=0,j,x=5, y=5, vx=1, vy=1, paddle=1, z,
    points=0, level=0, timet=0, blocks[row][col];

char a,ch;
float s=1;

clock_t t1=0, t2=0; // timers

FILE *f;
struct scores {int p; char name[10];} h;

void stats()
{
  f=fopen("scores.txt","rb");
  fread(&h,sizeof(h),1,f);
  while(!feof(f))
  {printf("%s %d",h.name,h.p); putchar('\n'); fread(&h,sizeof(h),1,f);}
  fclose(f);
}

 void arc(void)
{
 gotoxy(1,25);
 for(i=0; i<79; i++)
 printf(".");
 gotoxy(paddle,25);
 printf("!@@@@@!");
}

int ball(void)
{
 t2=clock();
 if((t2-t1)*(s/2) < timet) return 0;
 t1=clock();

 gotoxy(x,y); // koordinati sharika
 c15; cprintf("   "); // zatiraet shleyf sharika

 if(x<=2 || x > 77) vx*=-1;
 if(y>23) // granica. SHAR DOHODIT DO NIZA
 {
  if(x+2==paddle) // (_!)xxxxx
  {
   vy=-1; z=0;
   vx=-1;
   s++;

  }

  if(x+1==(paddle) && x+2==(paddle+1))
   // !@xxxx
  {
   vy=-1; z=-k;
   vx=-1;

  }

  if(x==(paddle) && x+1==(paddle+1) && x+2==(paddle+2))

  {
   vy=-1; z=0;
   vx=-1;

  }

  if(x==(paddle+1) && x+1==(paddle+2) && x+2==(paddle+3)) // xx@@xx
  {
   vy=-1; z=0;
   vx=-1;

  }

  if(x==(paddle+2) && x+1==(paddle+3) && x+2==(paddle+4)) // xxx@@x
  {
   if(vy==1) {vy=-1; vx=0;}
   else vy=1; vx=0;

  }

  if(x==(paddle+3) && x+1==(paddle+4) && x+2==(paddle+5)) // xxxx@!
  {
   vy=-1; z=0;
   vx=1;

  }

  if(x==(paddle+4) && x+1==(paddle+5) && x+2==(paddle+6))
  {
   vy=-1; z=0;
   vx=1;
  }

  if(x==(paddle+5) && x+1==(paddle+6))// xxxxx(!_)
  {
   vy=-1; z=k;
   vx=1;
  }

  if(x==(paddle+6))
  {
   vy=-1; z=0;
   vx=1;
   s++;
  }

  if(x>(paddle+7) || (x+2) < paddle-1){ z=0; return 1;} // SHAR KRANTI
 }

 if(y<=2) vy*=-1; // OTTALKIVANIE OT POTOLKA

 if(z==k && l%4 == 0) vx=1;
 if(z==k && l%4 != 0) vx=0;
 if(z==-k && l%4 == 0) vx=-1;
 if(z==-k && l%4 != 0) vx=0;

 x+=vx;
 y+=vy;
 l++;
 gotoxy(x,y);
 c15; cprintf("[ ]");

 for(i=3; i < row+3; i++)
 {
  for(j=0; j < col; j++)
  {
   if(blocks[i-3][j]==1)
   {
    if(x==(10+j) && y==i)
    {
     blocks[i-3][j]=0;
     points++;
     vy*=-1; vx*=-1;
     z=0;

    }
   }
  }
 }

 gotoxy(1,1); // INDIKATOR SBITIH KVADRATIKOV
 printf("Points: %d",points);
 return 0;
}

void putsq(void)
{
 textcolor(random(4*2)+1); cprintf("\376");
}

void squares(void)
{
 for(i=3; i < row+3; i++)
 {
  for(j=0; j < col; j++)
  {
   gotoxy(10+j,i);
   putsq();
  }
 }
}

void game()
{

 clrscr();
 for(i=0; i < row; i++)
 {
  for(j=0; j < col; j++)
  {
   blocks[i][j]=1;
  }
 }

 do
 {
  c15; cprintf("\nEnter difficulty 1<=diff<=4: ");
  scanf("%d",&level);
 }

 while(level < 1 || level > 4);
 clrscr();
 timet=level+1;
 squares();


 do
 {
  a=0;
  if(kbhit())
  {
   a=getch();
   if(a==77)
   {
    paddle++;

   }
   if(a==75)
   {
    paddle--;

   }
   if(paddle < 2) paddle=2;  // GRANICI DVIJENIYA ARKANOIDA
   if(paddle > 73) paddle=73;
   if(a == 32) break;  // BREAK NA PROBEL
   arc();
  }
  if(ball()) break;
 }
 while(1);


 if(points>100)
 {
  clrscr();
  c15; cprintf("You are winner! Enter your name: "); scanf("%s",&h.name);
 }

 clrscr();
 c15; cprintf("You are loose!( Enter your name: "); scanf("%s",&h.name);

 h.p=points;

 f=fopen("scores.txt","ab");
 fwrite(&h,sizeof(h),1,f);
 fclose(f);

 putchar('\n');
 printf("Eshe raz?: "); ch=getch();

 i,k=10,l=0,j,x=5, y=5, vx=1, vy=1, paddle=1, z,
 points=0, level=0, timet=0;
 a,ch;
 s=1;
 clock_t t1=0, t2=0; // timers
}

void menu(int a,int b,int c)
{
 setcolor(a);
 settextstyle(TRIPLEX_FONT,HORIZ_DIR,4);
 outtextxy(235,200,"1. GAME");

setcolor(b);
 settextstyle(TRIPLEX_FONT,HORIZ_DIR,4);
 outtextxy(235,230,"2. SCORE");

 setcolor(c);
 settextstyle(TRIPLEX_FONT,HORIZ_DIR,4);
 outtextxy(235,260,"3. EXIT");
}

void main()
{
 // <Подключение графики>
int gdriver=DETECT;
int gmode;
int errorcode;

 initgraph(&gdriver,&gmode,path);
 errorcode=graphresult();

 if(errorcode != grOk)
 {
  printf("Error: %d\n",errorcode);
  puts("For ending program press <enter>");
  getch();
  exit(1);
 }  // </Подключение графики>

 // <Логотип игры>
 settextstyle(TRIPLEX_FONT,HORIZ_DIR,0);
 setcolor(LIGHTCYAN);
 setusercharsize(2,1,1,1);
 outtextxy(175,150,"Arcanoid");  // </Логотип игры>

 // <Меню игры>

 char choose;
 int move=1;

 menu(8,8,8);
 choose=getch();



 while(choose!=27)
 {

  if(choose==13)  break;
  if(choose=='P') move++;
  if(choose=='H') move--;

  if(move<1) move=3;
  if(move>3) move=1;

  if(move==1) menu(10,8,8);
  if(move==2) menu(8,10,8);
  if(move==3) menu(8,8,10);


  choose=getch();

  delay(10);

 }
 cleardevice(); closegraph();


  if(move==3) exit(0);
  if(move==1)
  {
   do
   {
    game();

   } while(ch != 'n');
  }

  if(move==2)
  {
   stats();
  }


 printf("Press key to exit");
 getch();
}


Рабочая версия. Может кому-нибудь пригодится.  smile 

Автор: zim22 30.4.2009, 14:10
Цитата(Alexey91 @  30.4.2009,  13:52 Найти цитируемый пост)
Рабочая версия. Может кому-нибудь пригодится

у меня не работает(MSVC 2008). вы не могли бы переделать?  smile 

Автор: allbrandsstars 27.10.2016, 07:11
Могу помочь с созданием  игры арканоида  скайп: kuorsun

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)