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

Тетрис: начало - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
14.08.2011, 08:38     Тетрис: начало #1
Здравствуйте. Захотелось мне сделать тетрис. Консольный, некрасивый, но рабочий. Так как мой скилл программирования невысок, то решил начать с малого — научить программку генерировать случайные символы (в дальнейшем это будут фигуры), кидать в случайный столбец двумерного массива, скидывать вниз и складывать стопочкой.

В общем-то, все работает как надо, но когда один символ сверху падает на другой, вся картинка неприятно дергается. Как этого можно избежать?

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
#include <ctime>       //
#include <conio.h>     //
#include <cstdlib>     //
#include <iostream>    //
#include <windows.h>   // 
                       //
using namespace std;   //
/////////////////////////
 
char randomSymbol ();   // функция, выбирающая случайный символ
int randomPlace ();     // функция, помещающая символ в случаный столбец
void symbolDown (char [][ 20 ]);    // функция, "кидающая" символы
void printArray (char [][ 20 ]);    // функция, печатающая массив
 
int main ()
{
    char array [ 20 ][ 20 ] = {0};       // сам двумерный массив
    
    while (true)
       symbolDown (array);
   
    getch ();
    return 0;
}
 
// функция, выбирающая случайный символ
char randomSymbol ()
{
     short random;
     
     srand (time (0) );
     random = 1 + rand() % 5;
       
     if (random == 1)
        return '!';
     else if (random == 2)
        return '@';
     else if (random == 3)
        return '#';
     else if (random == 4)
        return '$';
     else
        return '%';
}
 
// функция, помещающая символ в случаный столбец
int randomPlace ()
{
    short random;
    
    srand (time (0) );
    random = 1 + rand() % 19;
    
    return random;
}
 
void symbolDown (char array [][ 20 ])
{
    int rand_place = randomPlace ();
    char rand_symbol = randomSymbol ();
    
    for (int i = 0; i < 19; i++)
    {
        printArray (array);     // показываем массив
        
        Sleep (300);
        
        if (array [ i + 1 ][ rand_place ] != 0)        // провярем, есть ли что-то на шаг впереди
           break;
        else
        {
           array [ i + 1 ][ rand_place ] = rand_symbol;
           array [ i ][ rand_place ] = 0;
        }
        
        system ("cls");
    }
}
 
// функция, печатающая массив
void printArray (char array [][ 20 ])
{
    for (int i = 0; i < 20; i++)
    {
        for (int j = 0; j < 20; j++)
            cout << array [ i ][ j ];
            
        cout << endl;
    }
}
Ещё два вопроса: в каком расово правильном порядке подключать библиотеки и в каком порядке записывать прототипы и код функций? В том порядке, в котором они вызываются?

Пожалуйста, если это "быдлокод" — скажите, где именно и "как это лечить", а то я ж хочу быть офигенным

Заранее спасибо, жду ваших ответов.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2011, 08:38     Тетрис: начало
Посмотрите здесь:

C++ Тетрис
Тетрис C++
C++ Тетрис и многопоточность
C++ Тетрис на C++
Тетрис на c++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stdcout
53 / 53 / 2
Регистрация: 06.04.2011
Сообщений: 210
14.08.2011, 10:07     Тетрис: начало #2
vortexx1,
если это "быдлокод"
Тебе в самом деле нравится рамочка, которой ты окружил подключение библиотек? По-моему некрасиво смотрится.
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
14.08.2011, 10:52  [ТС]     Тетрис: начало #3
Спасибо, учту. А ещё что не так здесь?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
14.08.2011, 11:05     Тетрис: начало #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
char randomSymbol ()
{
     short random;
     
     srand (time (0) );
     random = 1 + rand() % 5;
       
     if (random == 1)
        return '!';
     else if (random == 2)
        return '@';
     else if (random == 3)
        return '#';
     else if (random == 4)
        return '$';
     else
        return '%';
}
я бы так сделал:
C++
1
2
3
4
5
char randomSymbol (){
    char simbol[]={'!','@','#','$','%'};
    srand (time (0) );
    return simbol[rand()%5];
}
дальше код не смотрел, т.к. еще не проснулся
А экран мерцает из-за этого:
C++
1
system ("cls");
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
14.08.2011, 11:13     Тетрис: начало #5
Функцию srand надо вызывать в одном месте, желательно в самом начале main.
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
14.08.2011, 11:27  [ТС]     Тетрис: начало #6
Спасибо. По поводу мигания: мне нужно обновлять экран, а как иначе-то? Но вопрос был не в том.
Если не трудно — запустите, пожалуйста, у себя код. Там именно передергивание нехорошее, когда один символ на другой падает.
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
14.08.2011, 13:17     Тетрис: начало #7
Цитата Сообщение от vortexx1 Посмотреть сообщение
Спасибо. По поводу мигания: мне нужно обновлять экран, а как иначе-то? Но вопрос был не в том.
Если не трудно — запустите, пожалуйста, у себя код. Там именно передергивание нехорошее, когда один символ на другой падает.
у вас подергивание из-за того, что вы всегда перерисовываете весь массив, а не текущий символ.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.08.2011, 13:39     Тетрис: начало #8
Цитата Сообщение от Kastaneda Посмотреть сообщение
я бы так сделал:
C++
1
2
3
4
5
6
char randomSymbol ()
{
    char simbol[]={'!','@','#','$','%'};
//  srand (time (0) );
    return simbol[rand()%5];
}
еще бы массив статическим сделать
Kastaneda
14.08.2011, 13:55
  #9

Не по теме:

Цитата Сообщение от Maxwe11 Посмотреть сообщение
еще бы массив статическим сделать
я думаю в данном случае затраты на создание массива в стеке каждый раз при вызове ф-ции не на столько существенны

easybudda
14.08.2011, 16:31
  #10

Не по теме:

Название темы зачётное. Улыбнуло.

vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
14.08.2011, 20:27  [ТС]     Тетрис: начало #11
Цитата Сообщение от silentnuke Посмотреть сообщение
у вас подергивание из-за того, что вы всегда перерисовываете весь массив, а не текущий символ.
А как перерисовывать конкретные символы не трогая весь массив?
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
14.08.2011, 20:31     Тетрис: начало #12
Цитата Сообщение от vortexx1 Посмотреть сообщение
А как перерисовывать конкретные символы не трогая весь массив?
SetConsoleCursorPosition
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
14.08.2011, 20:34  [ТС]     Тетрис: начало #13
Спасибо. Ещё два вопроса: в каком расово правильном порядке подключать библиотеки и в каком порядке записывать прототипы и код функций? В том порядке, в котором они вызываются?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
14.08.2011, 21:10     Тетрис: начало #14
Цитата Сообщение от vortexx1 Посмотреть сообщение
в каком расово правильном порядке подключать библиотеки и в каком порядке записывать прототипы и код функций? В том порядке, в котором они вызываются?
Если сначала писать прототипы функций, а потом сами функции, абсолютно всё равно, в каком они порядке будут. Заголовки вообще не важно, в каком порядке включать.
C
1
2
3
4
5
6
7
8
9
int a(int);
int b(int);
 
int b(int val){
    return a(val + 1);
}
int a(int val){
    return val - 1;
}
так можно

C
1
2
3
4
5
6
int b(int val){
    return a(val + 1);
}
int a(int val){
    return val - 1;
}
так нельзя. Важно, чтобы функция была объявлена перед первым её использованием.
C
1
2
3
4
5
6
7
8
9
int b(int);
int a(int);
 
int b(int val){
    return a(val + 1);
}
int a(int val){
    return val - 1;
}
так снова можно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2011, 21:16     Тетрис: начало
Еще ссылки по теме:

Данный массив A (n). Все положительные его элементы поместить в начало массива B (n), а все отрицательные - в начало массива C (n). Подсчитать количес C++
Тетрис на С++ C++
Оцените тетрис C++

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

Или воспользуйтесь поиском по форуму:
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
14.08.2011, 21:16  [ТС]     Тетрис: начало #15
Понятно, спасибо.
Yandex
Объявления
14.08.2011, 21:16     Тетрис: начало
Ответ Создать тему
Опции темы

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