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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
#1

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

14.08.2011, 08:38. Просмотров 2407. Ответов 14
Метки нет (Все метки)

Здравствуйте. Захотелось мне сделать тетрис. Консольный, некрасивый, но рабочий. Так как мой скилл программирования невысок, то решил начать с малого — научить программку генерировать случайные символы (в дальнейшем это будут фигуры), кидать в случайный столбец двумерного массива, скидывать вниз и складывать стопочкой.

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

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;
    }
}
Ещё два вопроса: в каком расово правильном порядке подключать библиотеки и в каком порядке записывать прототипы и код функций? В том порядке, в котором они вызываются?

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

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

Тетрис на С++ - C++
Помогите доработать игру. запутался с _kbhit() и _getch() нужно сделать чтобы фигура постоянно падала, а во время нажатия клавиш смещалась....

Тетрис - C++
Пишу на c++ for DOS! Вобщем не могу сделать передвижение фигуры влево или вправо при нажатии на клавишу. Вот код падения фигуры в...

Тетрис на c++ - C++
Я решил проверить свои скудные знания языка и написать всем известную игру тетрис. Вот что получилось. #include &lt;iostream&gt; #include...

Тетрис на C++ - C++
Вот надо написать тетрис на курсовую. Проблема в том, что незнаю с чего начать. Есть , что то вроде гайдов по написанию подобного? И еще,...

Тетрис - C++
Задали сделать тетрис на Турбо СИ но незнаю даже с чего начать....только учить начали и уже курсак((

Тетрис на mvc - C++
Здрасти евриван) Как Вы? Все у Вас в порядке?) Думаю да) А я опять к Вам со своими проблемами( Наверное уже достал Вас хи-хи) Ладно, сразу...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
stdcout
53 / 53 / 2
Регистрация: 06.04.2011
Сообщений: 210
14.08.2011, 10:07 #2
vortexx1,
если это "быдлокод"
Тебе в самом деле нравится рамочка, которой ты окружил подключение библиотек? По-моему некрасиво смотрится.
1
vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
14.08.2011, 10:52  [ТС] #3
Спасибо, учту. А ещё что не так здесь?
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 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");
1
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
14.08.2011, 11:13 #5
Функцию srand надо вызывать в одном месте, желательно в самом начале main.
1
vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
14.08.2011, 11:27  [ТС] #6
Спасибо. По поводу мигания: мне нужно обновлять экран, а как иначе-то? Но вопрос был не в том.
Если не трудно — запустите, пожалуйста, у себя код. Там именно передергивание нехорошее, когда один символ на другой падает.
0
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
14.08.2011, 13:17 #7
Цитата Сообщение от vortexx1 Посмотреть сообщение
Спасибо. По поводу мигания: мне нужно обновлять экран, а как иначе-то? Но вопрос был не в том.
Если не трудно — запустите, пожалуйста, у себя код. Там именно передергивание нехорошее, когда один символ на другой падает.
у вас подергивание из-за того, что вы всегда перерисовываете весь массив, а не текущий символ.
1
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 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];
}
еще бы массив статическим сделать
1
Kastaneda
14.08.2011, 13:55
  #9

Не по теме:

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

1
easybudda
14.08.2011, 16:31
  #10

Не по теме:

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

2
vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
14.08.2011, 20:27  [ТС] #11
Цитата Сообщение от silentnuke Посмотреть сообщение
у вас подергивание из-за того, что вы всегда перерисовываете весь массив, а не текущий символ.
А как перерисовывать конкретные символы не трогая весь массив?
0
asics
Freelance
Эксперт С++
2847 / 1784 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
14.08.2011, 20:31 #12
Цитата Сообщение от vortexx1 Посмотреть сообщение
А как перерисовывать конкретные символы не трогая весь массив?
SetConsoleCursorPosition
1
vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
14.08.2011, 20:34  [ТС] #13
Спасибо. Ещё два вопроса: в каком расово правильном порядке подключать библиотеки и в каком порядке записывать прототипы и код функций? В том порядке, в котором они вызываются?
0
easybudda
Модератор
Эксперт CЭксперт С++
9627 / 5575 / 947
Регистрация: 25.07.2009
Сообщений: 10,710
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;
}
так снова можно.
1
vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
14.08.2011, 21:16  [ТС] #15
Понятно, спасибо.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2011, 21:16
Привет! Вот еще темы с ответами:

Оцените тетрис - C++
Написано коряво, но это первый блин. Мне бы очень хотелось его дошлифовать до красивого внешнего и внутреннего содержания. Если участники...

Консольный Тетрис на С++ - C++
Написать консольный Тетрис на С++ используя процедурное программирование(без классов и go to). Реализовать: 1) меню 2) уровни...

Игра тетрис - C++
Помогите, ребята. Мне нужно сдать курсовую по игре тетрис, может есть у кого самый простой тетрис, где падают фигуры, или какой-то анолог...

Тетрис и многопоточность - C++
Здравствуйте. Взялся я за тетрис, немного написал, а потом понял, что мне нужны два потока. Вот зачем: у меня игровое поле — двумерный...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.08.2011, 21:16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru