Форум программистов, компьютерный форум CyberForum.ru

Тетрис - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 74, средняя оценка - 4.64
St@lker
0 / 0 / 0
Регистрация: 17.09.2009
Сообщений: 60
19.01.2010, 22:59     Тетрис #1
Пишу на c++ for DOS!
Вобщем не могу сделать передвижение фигуры влево или вправо при нажатии на клавишу.
Вот код падения фигуры в стакане:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int Line()
{
 int i,j,color,z=0;
 for (i=0,j=0;i<410,j<410;i++,j++)
 {
 if (getpixel(310,42+i)==15)
  {
   L.x=300+z;
   L.x2=340+z;
   L.y=42+i;
   L.y2=42+i;
   setcolor(2);
   line(L.x,L.y,L.x2,L.y2);
   delay(10);
   L.x=300+z;
   L.x2=340+z;
   L.y=42+j;
   L.y2=42+j;
   setcolor(15);
   line(L.x,L.y-2,L.x2,L.y2-2);
   delay(10);
  }
  else
 continue;
 }
 return 0;
}
А это действие при нажатии клавиши:
C++
1
2
3
4
5
6
7
8
key = getch();
  while(1)
   {
    if (key==13)
     {
       z++;
     }
   }
но я никак не могу их совместить!Я тока как не пробывал и в отдельных процедурах через switch, через if, но ничего не выходит!Уменя либо фигура вообще не вылетает или вылетает но при нажатии на клавишу сдвигается только один раз и больше не сдвигается, либо вылетает и автоматически сдвигается вправо сама по себе.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.01.2010, 22:59     Тетрис
Посмотрите здесь:

Тетрис C++
C++ Тетрис: начало
Игра тетрис C++
C++ Тетрис на C++
Тетрис на c++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vertus
14 / 44 / 1
Регистрация: 26.10.2009
Сообщений: 298
20.01.2010, 00:10     Тетрис #2
Приведи более большой участок кода, а то ведь непонятно ничего.
St@lker
0 / 0 / 0
Регистрация: 17.09.2009
Сообщений: 60
20.01.2010, 00:21  [ТС]     Тетрис #3
Вот все что написал:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
 
 struct LO
  {
   int x,x2,y,y2;
  };
 struct TO
  {
   int x,x2,y,y2;
  };
 struct GO
  {
   int x,x2,y,y2;
  };
 struct KO
  {
   int x,x2,y,y2;
  };
 struct ZO
  {
   int x,x2,y,y2;
  };
 LO L;
 KO K;
 
/* int MoveLine()
{
 int z=0,key;
 key = getch();
  while(1)
   {
    if (key==13)
     {
       z++;
     }
   }
}*/
 
/*int MoveL()
{
 int z=0,key;
 enum keys{ENTER=13, ESC=27};
 while(1)
 {
  key=getch();
   switch(key)
    {
     case ESC:exit(0);break;
     case ENTER: z++; break;
 
    }
 }
}*/
 
 int Line()
{
 int i,j,color,z=0;
 
 for (i=0,j=0;i<410,j<410;i++,j++)
 {
 if (getpixel(310,42+i)==15)
  {
   L.x=300+z;
   L.x2=340+z;
   L.y=42+i;
   L.y2=42+i;
   setcolor(2);
   line(L.x,L.y,L.x2,L.y2);
   delay(10);
   L.x=300+z;
   L.x2=340+z;
   L.y=42+j;
   L.y2=42+j;
   setcolor(15);
   line(L.x,L.y-2,L.x2,L.y2-2);
   delay(10);
  }
  else
 continue;
 }
 return 0;
}
 
int Kvadrat()
{
 int i,j,color;
 for (i=0,j=0;i<410,j<410;i++,j++)
 {
  if(getpixel(310,45+i)==15)
   {
    K.x=300;
    K.x2=315;
    K.y=45+i;
    K.y2=45+i;
    setcolor(3);
    line(K.x,K.y,K.x2,K.y2);
    delay(10);
    K.x=300;
    K.x2=315;
    K.y=45+j;
    K.y2=45+j;
    setcolor(15);
    line(K.x,K.y-10,K.x2,K.y2-10);
    delay(10);
   }
   else
  continue;
 }
 return 0;
}
 
 
 int main(void)
{
 
 /* Podkly4enie Grafiki */
int gdriver = DETECT, gmode, errorcode;
int maxx,maxy,color,n,i;
 clrscr();
 
/* initialize graphics and local variables */
initgraph(&gdriver, &gmode,"");
 
/* read result of initialization */
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 */
  }
 
maxx = getmaxx() / 2;
maxy = getmaxy() / 2;
 
 bar(maxx-200,maxy-200,maxx+200,maxy+200);
   randomize();
 for(i=0;i<5;i++)
  {
   n=1+rand()%2;
   switch(n)
    {
     case 1: Line(); break;
     case 2: Kvadrat(); break;
    }
  }
 getch();
 return 0;
}
QWAN
56 / 55 / 1
Регистрация: 02.09.2008
Сообщений: 181
20.01.2010, 18:50     Тетрис #4
Во вложении полный пример игры из книги Андре Ламота "Программирование игр для Windows".
Думаю он тебе поможет
Вот пример каркаса для игры

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// Определения состояний цикла игры
#define GAME_INIT         // Инициализация игры
#define GAME_MENU         // Игра в режиме меню
#define GAME_STARTING     // Игра начинает работу
#define GAME_RUN         // Игра работает
#define GAME_RESTART     // Перезапуск игры
#define GAME_EXIT         // Выход из игры
// Глобальные переменные игры
int game_state = GAME_INIT; // Начальное состояние игры
 
void main()
{
    // Реализация основного цикла игры
    while( game_state !=GAME_EXIT )
    {
        // Какое текущее состояние игры?
        switch( game_state )
            {
            case GAME_INIT: // Инициализация игры
                {
                    // Распределение памяти
                    // и захват ресурсов
                    // переход в состояние меню
                    game_state=GAME_MENU;
                } break;
            case GAME_MENU:// Игра в режиме меню
                {
                    // Вызов функции меню
                    // и переключение состояния
                    game_state = Menu();
                } break;
            case GAME_STARTING: // Игра начинает работу
                {
                    // Это необяэаьельное состояние, которое
                    // обычно используется для
                    // дополнительной работы с захваченными
                    // ресурсами
                    // Переход в состояние работы
                    game_state=GAME_RUN;
                } break;
            case GAME_RUN: // Игра работает
                {
                    // Эта часть содержит логику игры
                    // Очистка экрана
                    Сlеаг();
                    // Получение ввода
                    Get_Input();
                    //Работа логики и ИИ
                    // Вывод очередного кадра
                    Render_Frame();
                    // Синхронизация
                    Sleep(milliseconds);                            
                    // Единственный способ изменения этого
                    // состояния - через взаимодействие с
                    // пользователем (либо, возможно,
                    // вследствие проигрыша)
                } break;
            case GAME_EXIT: // Выход из игры
                {
                    // Раз мы здесь, работа программы
                    //успешно завершается и мы должны
                    // освободить ресурсы и выполнить
                    // остальную работу этого типа
                    // Раз мы здесь, ошибок не было
                    // Здесь переключение состояний не
                    // требуется, так как все равно
                    //осуществляется выход из программы
                } break;
        } // switch        
    } //while
    // Возврат кода ошибки операционной системе
    return( error);
} // main
Вложения
Тип файла: rar T3DCHAP01.rar (98.5 Кб, 309 просмотров)
St@lker
0 / 0 / 0
Регистрация: 17.09.2009
Сообщений: 60
20.01.2010, 20:07  [ТС]     Тетрис #5
Спасибо за помощь! Тольк в данном примере используются какието библиотеки,чтото может типа OpenGL или ещё чтото я их не понимаю и листинг мне не понятен. В прекреплённом файле не Тетрис там типа пинг-понг или как это назвать...
Но всеравно большое спасибо!
Vertus
14 / 44 / 1
Регистрация: 26.10.2009
Сообщений: 298
20.01.2010, 22:45     Тетрис #6
graphics.h твой заголовочный файл?
St@lker
0 / 0 / 0
Регистрация: 17.09.2009
Сообщений: 60
21.01.2010, 14:55  [ТС]     Тетрис #7
Цитата Сообщение от Vertus Посмотреть сообщение
graphics.h твой заголовочный файл?
всмысле заголовочный?
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
22.01.2010, 16:22     Тетрис #8
Vertus, это стандартная библиотека
St@lker
0 / 0 / 0
Регистрация: 17.09.2009
Сообщений: 60
22.01.2010, 17:03  [ТС]     Тетрис #9
Цитата Сообщение от M128K145 Посмотреть сообщение
Vertus, это стандартная библиотека
О!Спасибо, сразу дапер что он имел ввиду!
QWAN
56 / 55 / 1
Регистрация: 02.09.2008
Сообщений: 181
25.01.2010, 12:18     Тетрис #10
Вот пример как сделать передвижение фигуры влево или вправо при нажатии на клавишу.
Программка выводит типа квадратик пока он падает им можно двигать влево вправо. Никаких столкновений я не делал. Поэтому как только квадратик столкнется со стенкой или опустится вниз нужно запускать программку по новому.
Я сделал его на своей давно забытой заготовке (чистая консоль без каких либо графических библиотек), так что извини разбираться будешь сам.
Вот дополнительно ссылка на сайт http://www.vsokovikov.narod.ru/New_M...le/ogl_con.htm
там расписаны все консольные функции которые я применял.
Когда запустиш программку:
1) первое синие окошко это окно меню (я удалил кнопки). Чтобы перейти в режим игры нажми клавишу "n". Для выхода из игры нажми клавишу "Esc".
2) Окно игры появиться белый квадратик(типа квадратик, его размер 3х2). Можно управлять клавишами влево вправо.

То что тебе нужно для твоей игры :
C++
1
2
3
double rectangle_x = 39, rectangle_y = 2; //Начальное положение фигуры типа кубик
double speed_dx = 2;    //Скорость по оси Х (управление клавишами <- и ->)        
double speed_dy = 0.04;    //Скорость падения шарика
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//-----Game_Main----------------------------------------------------------------------------------------------------------------
int Game_Main(void *params)
{
    set_color(hStdout,cBLACK,cBLUE);
    cls(hStdout);
    set_fill_style(EMPTY_FILL);
    set_color(hStdout,cLIGHT_GRAY ,cWHITE);
    draw_rectangle(hStdout, (int)rectangle_x, (int)rectangle_y, (int)rectangle_x+3, (int)rectangle_y+2); //Рисуем прямоугольник        
    cpy_Buffer(hScreenBuffer,hStdout);//выводим на экран
    rectangle_y += speed_dy;
    wait(30);
    //возвращаем код завершения
    return 0;
}//END----Game_Main------
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//-----------KeyEventProc------------------------------------------------------------------------------------------=-----
VOID KeyEventProc(KEY_EVENT_RECORD ker)
{    
    switch(game_state)
    {
        case GAME_INIT:    //Инициализация игры
            {
            }break;//case GAME_INIT
        case GAME_MENU:    //Инициализация игры
            {               
            }break;//case GAME_MENU
        case GAME_START:    //Инициализация игры
            {
            }break;//case GAME_START
        case GAME_RUN:    //Инициализация игры
            {
                if(ker.bKeyDown) 
                {                    
                    switch(ker.wVirtualScanCode)
                    {
                        case 75:    // <- передвинуть влево
                            rectangle_x -= speed_dx;
                            break;
                        case 77:    //-> передвинуть вправо
                            rectangle_x += speed_dx;
                            break;
                        case 1://ESC - выйти из игры
                            game_state = GAME_MENU;
                            break;        
                        default:
                            break;
                    }//switch(ker.wVirtualScanCode)
                }
            }break;//case GAME_RUN
        case GAME_RESTART:    //Инициализация игры
            {
            }break;//case GAME_RESTART
        case GAME_EXIT:    //Инициализация игры
            {
            }break;//case GAME_EXIT
    }//switch(game_state)
}//------------END---VOID KeyEventProc
И последний код (он работает но его нужно еще дорабатывать)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
if(!PeekConsoleInput(hStdin,    // дескриптор буфера ввода
                            pBuffer,    // буфер, в котором читаем
                            128,        // размер буфера чтения
                            &cNumRead))    // дескриптор буфера ввода
        {
            MessageBox(NULL, "ReadConsoleInput", "Console Error", MB_OK); 
            return 0;
        }//if(!-- PeekConsoleInput --или-- ReadConsoleInput
        // Направляем события соответствующим обработчикам.
        for (unsigned int i = 0; i < cNumRead; i++)
        {
            switch(pBuffer[i].EventType)
            {
                case KEY_EVENT: // ввод с клавиатуры
                    KeyEventProc(pBuffer[i].Event.KeyEvent);
                    //Пока незнаю как правильно очистить буфер ввода использую ReadConsoleInput
                    if(!ReadConsoleInput(hStdin,    // дескриптор буфера ввода
                                        pBuffer,    // буфер, в котором читаем
                                        128,        // размер буфера чтения
                                        &cNumRead))    // дескриптор буфера ввода
                    {
                        MessageBox(NULL, "ReadConsoleInput", "Console Error", MB_OK); 
                        return 0;
                    }//if(!ReadConsoleInput
                    break;
                case MOUSE_EVENT: // ввод от мыши
                    MouseEventProc(pBuffer[i].Event.MouseEvent);
                    break;
                case WINDOW_BUFFER_SIZE_EVENT: // изменение размера экранного буфера                                                
                    ResizeEventProc(pBuffer[i].Event.WindowBufferSizeEvent);
                    //Пока незнаю как правильно очистить буфер ввода использую ReadConsoleInput
                    if(!ReadConsoleInput(hStdin,    // дескриптор буфера ввода
                                        pBuffer,    // буфер, в котором читаем
                                        128,        // размер буфера чтения
                                        &cNumRead))    // дескриптор буфера ввода
                    {
                        MessageBox(NULL, "ReadConsoleInput", "Console Error", MB_OK); 
                        return 0;
                    }//if(!ReadConsoleInput
                    break;
                case FOCUS_EVENT:  // игнорирование событий фокуса
                case MENU_EVENT:   // игнорирование событий меню
                    break;
                default:
                    MessageBox(NULL, "unknown event type", "Console Error", MB_OK);
                    break;
            }//switch(pBuffer[i].EventType)
        }//for (i = 0; i < cNumRead; i++)
Вложения
Тип файла: rar Tetris_1.rar (9.0 Кб, 255 просмотров)
St@lker
0 / 0 / 0
Регистрация: 17.09.2009
Сообщений: 60
22.10.2010, 23:52  [ТС]     Тетрис #11
вообщем не прошло и сто лет как я опять взялся доделать эту работу)
реализовал управление фигурами (право : лево) и падение их друг на друга чтоб одна фигура не затирала другую.Теперь возникла проблема!Как сделать чтобы накопленные в шырину стакана фигурки исчезали? помогите решить эту проблему.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#include <bios.h>
 
 enum keys{RIGHT=19712,LEFT=19200,ESC=283};
 
 struct LO
  {
   int x,x2,y,y2;
  };
 struct TO
  {
   int x,x2,y,y2;
  };
 struct GO
  {
   int x,x2,y,y2;
  };
 struct KO
  {
   int x,x2,y,y2;
  };
 struct ZO
  {
   int x,x2,y,y2;
  };
 LO L;
 KO K;
 
 int Line()
{
 int i,j,color,z=0,key;
 // enum keys{RIGHT=19712, ESC=283};
 
 for (i=0,j=0;i<410,j<410;i++,j++)
 {
 
 if (getpixel(310+z,42+i)==15)
  {
   L.x=300+z;
   L.x2=340+z;
   L.y=42+j;
   L.y2=42+j;
   setcolor(15);
   line(L.x,L.y-5,L.x2,L.y2-5);
   delay(10);
   L.x=300+z;
   L.x2=340+z;
   L.y=42+i;
   L.y2=42+i;
   setcolor(2);
   line(L.x,L.y,L.x2,L.y2);
   key=bioskey(1);
   if (key!=0) getch();
   switch(key)
    {
     case ESC:exit(0);break;
     case RIGHT: z++; break;
     case LEFT: z--; break;
    }
   delay(10);
  }
  else
 continue;
 }
 return 0;
}
 
int Kvadrat()
{
 int i,j,z=0,key;
 for (i=0,j=0;i<410,j<410;i++,j++)
 {
  if(getpixel(310+z,45+i)==15)
   {
    K.x=300+z;
    K.x2=315+z;
    K.y=45+j;
    K.y2=45+j;
    setcolor(15);
    line(K.x,K.y-10,K.x2,K.y2-10);
    delay(10);
    K.x=300+z;
    K.x2=315+z;
    K.y=45+i;
    K.y2=45+i;
    setcolor(3);
    line(K.x,K.y,K.x2,K.y2);
    key=bioskey(1);
   if (key!=0) getch();
   switch(key)
    {
     case ESC:exit(0);break;
     case RIGHT: z++; break;
     case LEFT: z--; break;
    }
    delay(10);
   }
   else
  continue;
 }
 return 0;
}
 
 
 int main(void)
{
 
 /* Podkly4enie Grafiki */
int gdriver = DETECT, gmode, errorcode;
int maxx,maxy,color,n,i;
 clrscr();
 
/* initialize graphics and local variables */
initgraph(&gdriver, &gmode,"");
 
/* read result of initialization */
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 */
  }
 
maxx = getmaxx() / 2;
maxy = getmaxy() / 2;
 
 bar(maxx-200,maxy-200,maxx+200,maxy+200);
   randomize();
 for(i=0;i<5;i++)
  {
   n=1+rand()%2;
   switch(n)
    {
     case 1: Line(); break;
     case 2: Kvadrat(); break;
    }
  }
 getch();
 return 0;
}
Славик___077
21 / 21 / 3
Регистрация: 30.01.2011
Сообщений: 119
03.02.2011, 01:43     Тетрис #12
а напиши пожалуйста общий код игры
QWAN
56 / 55 / 1
Регистрация: 02.09.2008
Сообщений: 181
03.02.2011, 10:43     Тетрис #13
Как я понимаю весь стакан это матрица размером M x N. Просто наверное нужно проверять в цикле каждую строчку матрицы на предмет заполнения. Каждая фигура состоит из квадратиков. Если в каждой ячейке одной строчки лежит квадратик, то строчку нужно удалить.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2011, 13:19     Тетрис
Еще ссылки по теме:

Тетрис на С++ C++
Тетрис на mvc C++
Оцените тетрис C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
St@lker
0 / 0 / 0
Регистрация: 17.09.2009
Сообщений: 60
03.02.2011, 13:19  [ТС]     Тетрис #14
Цитата Сообщение от Славик___077 Посмотреть сообщение
а напиши пожалуйста общий код игры
Это весь код программы. Она просто не доделання.

Добавлено через 2 минуты
QWAN, В том то и дело что никакой матрицы нету. У меня все ограничения по цвету стоят.
Yandex
Объявления
03.02.2011, 13:19     Тетрис
Ответ Создать тему
Опции темы

Текущее время: 10:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru