Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 31.08.2019
Сообщений: 3

Не получается сделать колодец для тетриса ровным

31.08.2019, 19:45. Показов 1380. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Не могу найти проблему в коде. Не получается сделать колодец для тетриса ровным...


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
#include <stdlib.h>
#include <windows.h>
#include <stdio.h>
#include <string>
 
using namespace std;
 
char* pField = nullptr;   //массив неподписанных символов для поля
int nFieldWidth = 12;            //ширина
int nFieldHeight = 18;          //высота
 
int nScreenWidth = 80;          // Console Screen Size X (columns)
int nScreenHeight = 30;         // Console Screen Size Y (rows)
 
int main()
{
    // Поле игры ========================================================
 
    pField = new char[nFieldWidth * nFieldHeight]; // создание игрового буффера
    for (int x = 0; x < nFieldWidth; x++) // Board Boundary
        for (int y = 0; y < nFieldHeight; y++)
            pField[y * nFieldWidth + x] = (x == 0 || x == nFieldWidth - 1 || y == nFieldHeight - 1) ? 9 : 0;
 
    ///////создание экранного буфера ////////////////////
    wchar_t* screen = new wchar_t[nScreenWidth * nScreenHeight];
    for (int i = 0; i < nScreenWidth * nScreenHeight; i++) screen[i] = L' ';
    HANDLE hConsole = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
    SetConsoleActiveScreenBuffer(hConsole);
    DWORD dwBytesWritten = 0;
    
    bool bGameOver = false;
 
    while (!bGameOver)
    {
 
        // Draw Field //////////////////////////////
        for (int x = 0; x < nFieldWidth; x++)
            for (int y = 0; y < nFieldHeight; y++)
                screen[(y + 1) * nScreenWidth + (x + 1)] = L" ABCDEFG=#"[pField[y * nFieldWidth + x]];
                
        // Display Frame /////////////////////
        WriteConsoleOutputCharacter(hConsole, screen, nScreenWidth * nScreenHeight, { 0, 0 }, &dwBytesWritten);
    }
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.08.2019, 19:45
Ответы с готовыми решениями:

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

Не получается нарисовать фигурки тетриса. C++ Opengl
Пожалуста помогите, не получается нарисовать фигурки тетриса, вроде все правильно в чем проблема не понимаю. Рисует какую-то хрень, вот код...

Управление для тетриса
Кто подскажет, как можно сделать для тетриса передвежение влево, вправо, верх переворот фигури и вниз ускореник.

15
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
31.08.2019, 21:57
Цитата Сообщение от bzzzz21 Посмотреть сообщение
Здравствуйте. Не могу найти проблему в коде. Не получается сделать колодец для тетриса ровным...
Цитата Сообщение от bzzzz21 Посмотреть сообщение
int nScreenWidth = 80; // Console Screen Size X (columns)
int nScreenHeight = 30; // Console Screen Size Y (rows)
Скорее всего, у тебя размеры не соответствуют. Попробуй сделать.
C++
1
2
3
4
        CONSOLE_SCREEN_BUFFER_INFO csbi = {0};
        GetConsoleScreenBufferInfo(hConsole, &csbi);
        nScreenWidth = csbi.dwSize.X;
        nScreenHeight = csbi.dwSize.Y;
0
0 / 0 / 0
Регистрация: 31.08.2019
Сообщений: 3
01.09.2019, 13:11  [ТС]
Добавлено через 10 минут
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
CONSOLE_SCREEN_BUFFER_INFO csbi = {0};
* * * * GetConsoleScreenBufferInfo(hConsole, &csbi);
* * * * nScreenWidth = csbi.dwSize.X;
* * * * nScreenHeight = csbi.dwSize.Y;
Только учусь программировать. Поэтому не совсем понимаю, куда ты предлагаешь вставить эту часть кода. Мог бы подсказать?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.09.2019, 19:36
Цитата Сообщение от bzzzz21 Посмотреть сообщение
Только учусь программировать. Поэтому не совсем понимаю, куда ты предлагаешь вставить эту часть кода. Мог бы подсказать?
А зачем ты вообще используешь этот ScreenBuffer?
Просто печатай на консоль при помощи std::cout и всё
0
Just Do It!
 Аватар для XLAT
4212 / 2671 / 655
Регистрация: 23.09.2014
Сообщений: 9,090
Записей в блоге: 3
03.09.2019, 08:21
Цитата Сообщение от bzzzz21 Посмотреть сообщение
Не получается сделать колодец для тетриса ровным...
а у мя не получается сделать ваш колодец кривым
ваш код:
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
#include <windows.h>
 
using namespace std;
 
char* pField = nullptr; // массив неподписанных символов для поля
int nFieldWidth  = 12;  // ширина
int nFieldHeight = 18;  // высота
 
int nScreenWidth  = 80; // Console Screen Size X (columns)
int nScreenHeight = 30; // Console Screen Size Y (rows)
 
int main()
{   
    // Поле игры ===============================================================
    pField = new char[nFieldWidth * nFieldHeight]; // создание игрового буффера
    for (int x = 0; x < nFieldWidth; x++) // Board Boundary
        for (int y = 0; y < nFieldHeight; y++)
            pField[y * nFieldWidth + x] = 
                (x == 0 || x == nFieldWidth - 1 || y == nFieldHeight - 1) ? 
                    9 : 0;
 
    // Создание экранного буфера ===============================================
    wchar_t* screen = new wchar_t[nScreenWidth * nScreenHeight];
    for (int i = 0; i < nScreenWidth * nScreenHeight; i++) screen[i] = L' ';
    HANDLE hConsole = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0,
                      NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
    SetConsoleActiveScreenBuffer(hConsole);
    
    DWORD dwBytesWritten = 0;
    bool  bGameOver      = false;
 
    while (!bGameOver)
    {
        // Draw Field ==========================================================
        for (int x = 0; x < nFieldWidth; x++)
            for (int y = 0; y < nFieldHeight; y++)
                screen[(y + 1) * nScreenWidth + (x + 1)] =
                    L" ABCDEFG=#"[pField[y * nFieldWidth + x]];
 
        // Display Frame =======================================================
        WriteConsoleOutputCharacterW( hConsole,
                                     screen, 
                                     nScreenWidth * nScreenHeight,
                                     { 0, 0 },
                                     &dwBytesWritten );
    }
    
    return 0;
}
выдает результат:


компилятор MinGW GCC 4.9.2
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
03.09.2019, 08:45
Цитата Сообщение от XLAT Посмотреть сообщение
а у мя не получается сделать ваш колодец кривым
Попробуй размер окна изменить, мышкой
0
Just Do It!
 Аватар для XLAT
4212 / 2671 / 655
Регистрация: 23.09.2014
Сообщений: 9,090
Записей в блоге: 3
03.09.2019, 09:00
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Попробуй размер окна изменить, мышкой
ок

а вы для того чтобы увидеть разницу все таки попробуйте скомпилить и запустить код из моего поста, ПЖЛСТА.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
03.09.2019, 09:07
Цитата Сообщение от XLAT Посмотреть сообщение
а вы для того чтобы увидеть разницу все таки попробуйте скомпилить и запустить код из моего поста, ПЖЛСТА.
Ну запустил. Та же самая картинка, что в первом посте. И?
0
Just Do It!
 Аватар для XLAT
4212 / 2671 / 655
Регистрация: 23.09.2014
Сообщений: 9,090
Записей в блоге: 3
03.09.2019, 09:24
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
И?
интересно,
озвучьте компилятор для начала

кстати, у мя win7-64

можете дать сюда ваш exe'ник?

Добавлено через 6 минут
проверил щас на VS2010: всё отлично, колодец прямой.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
03.09.2019, 09:25
Цитата Сообщение от XLAT Посмотреть сообщение
озвучьте компилятор для начала
кстати, у мя win7-64
можете дать сюда ваш exe'ник?
Причём тут компилятор?
Там неправильная работа с консолью, поэтому результат зависит не от того где ты скомпилировал, а от того какую консоль ты используешь для запуска.
0
Just Do It!
 Аватар для XLAT
4212 / 2671 / 655
Регистрация: 23.09.2014
Сообщений: 9,090
Записей в блоге: 3
03.09.2019, 09:30
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Попробуй размер окна изменить, мышкой
до:

после мышкой по вертикали:

как видите, скроллинг по боку.
0
Just Do It!
 Аватар для XLAT
4212 / 2671 / 655
Регистрация: 23.09.2014
Сообщений: 9,090
Записей в блоге: 3
03.09.2019, 10:04
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
а от того какую консоль ты используешь для запуска
можно конкретнее, какую консоль(и как именно(тут поподробнее)) мне использовать для запуска, чтобы получить кривой колодец?

Добавлено через 9 минут
bzzzz21,
итого вот этот код должен у вас работать(по идее Олега):
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
#include <windows.h>
 
using namespace std;
 
char* pField = nullptr; // массив неподписанных символов для поля
int nFieldWidth   = 12; // ширина
int nFieldHeight  = 18; // высота
 
int nScreenWidth  = 0;  // Console Screen Size X (columns)
int nScreenHeight = 0;  // Console Screen Size Y (rows)
 
int main()
{   
    // Поле игры ===============================================================
    pField = new char[nFieldWidth * nFieldHeight]; // создание игрового буффера
    for (int x = 0; x < nFieldWidth; x++) // Board Boundary
        for (int y = 0; y < nFieldHeight; y++)
            pField[y * nFieldWidth + x] = 
                (x == 0 || x == nFieldWidth - 1 || y == nFieldHeight - 1) ? 
                    9 : 0;
 
    // Создание экранного буфера ===============================================
    HANDLE hConsole = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0,
                      NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
    SetConsoleActiveScreenBuffer(hConsole);
    
    CONSOLE_SCREEN_BUFFER_INFO csbi = {0};
    GetConsoleScreenBufferInfo(hConsole, &csbi);
    nScreenWidth  = csbi.dwSize.X;
    nScreenHeight = csbi.dwSize.Y;
    
    wchar_t* screen = new wchar_t[nScreenWidth * nScreenHeight];
    for (int i = 0; i < nScreenWidth * nScreenHeight; i++) screen[i] = L' ';
    
    DWORD dwBytesWritten = 0;
    bool  bGameOver      = false;
 
    while (!bGameOver)
    {
        // Draw Field ==========================================================
        for (int x = 0; x < nFieldWidth; x++)
            for (int y = 0; y < nFieldHeight; y++)
                screen[(y + 1) * nScreenWidth + (x + 1)] =
                    L" ABCDEFG=#"[pField[y * nFieldWidth + x]];
 
        // Display Frame =======================================================
        WriteConsoleOutputCharacterW( hConsole,
                                      screen, 
                                      nScreenWidth * nScreenHeight,
                                      {0, 0},
                                      &dwBytesWritten );
    }
    
    return 0;
}
у меня работают все варианты.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
03.09.2019, 10:08
Цитата Сообщение от XLAT Посмотреть сообщение
можно конкретнее, какую консоль(и как именно(тут поподробнее)) мне использовать для запуска, чтобы получить кривой колодец?
Любую, у которой ширина не равна 80
0
Just Do It!
 Аватар для XLAT
4212 / 2671 / 655
Регистрация: 23.09.2014
Сообщений: 9,090
Записей в блоге: 3
03.09.2019, 10:45
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Любую, у которой ширина не равна 80
я поправил код,
колодец то какой щас у вас получается?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
03.09.2019, 12:19
Цитата Сообщение от XLAT Посмотреть сообщение
я поправил код,
колодец то какой щас у вас получается?
Проверь сам.
Найди консоль, у которой можно менять ширину, и запусти в ней свою программу. Потом мышкой увеличь ширину.
0
0 / 0 / 0
Регистрация: 31.08.2019
Сообщений: 3
17.09.2019, 17:38  [ТС]
Цитата Сообщение от XLAT Посмотреть сообщение
можно конкретнее, какую консоль(и как именно(тут поподробнее)) мне использовать для запуска, чтобы получить кривой колодец?
Использую VS2019
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.09.2019, 17:38
Помогаю со студенческими работами здесь

Таблица рекордов для тетриса
написал тетрис нужно добавить еще таблицу рекордов. я сделал вторую форму сделал так чтобы она появлялась после завершения игры, а рекорд...

инклуды для написания 2 мерного тетриса
хочу начать учить с++ с написания чего-нибудь веселенького, радующего глаз, решил начать с тетриса Вопрос: какие заголовочные файлы нужны...

Как создать фигуры для тетриса?
Привет всем! Захотел написать простенькую игру и решил начать с тетриса. Пишу в visual studio 2013 c++. Как и всегда появляются проблемы: ...

Рандомное генерирование фигур для тетриса (консоль)
Добрый вечер. Такой вопрос: как следует реализовать случайное генерирование фигур для тетриса, используя класс фигур? Все фигуры состоят...

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru