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

Создание игр в текстовом режиме - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Подскажите библиотеку GUI, реализующую графический интерфейс http://www.cyberforum.ru/cpp-beginners/thread1098407.html
Доброй ночи. Подскажите, пожалуйста, лёгкую и простую библиотеку реализующую графический интерфейс. Сам интерфейс примитивен - пара кнопок и диалоговых окон. Это всё, что мне нужно от библиотеки. ОС - Windows, компилятор - VC++. Спасибо.
C++ Выведение на экран фигуры, которая изображает множество точек, которые удовлетворяют неравенству Исправьте, пожалуйста, ошибки. Задача. Выведение на экран фигуры, которая изображает множество точек, которые удовлетворяют неравенство: x^2+y^2<=2(abs(x)+abs(y)) #include <math.h> #include <bios.h> int x0, y0; void main() int x, y; int gdriver - DETECT, gmode, errorcode; initgraph (&gdriver, &gmode, "g:\\bc31\\bg1"); http://www.cyberforum.ru/cpp-beginners/thread1098406.html
C++ Как разрешить ввод только чисел типа int?
Доброго времени суток. Подскажите, пожалуйста, как разрешить ввод только чисел типа int. Преподаватель очень любит заваливать на этом, введя например букву, там где нужно число. Очень важно, чтобы код был негромоздким. #include <iostream> #include <cstdio> #include <conio.h> using namespace std; int roman (int,int,char); int main()
Некорректно работает вывод вещественных чисел в массиве C++
#include "stdafx.h" #include <conio.h> #include <stdio.h> void ReadArray(double a)
C++ Вывести информацию в виде таблицы http://www.cyberforum.ru/cpp-beginners/thread1098387.html
помогите, после введения данных , в конце программами должна выводится инф. в виде таблицы #include <stdio.h> #include <iostream> #include <stdlib.h> #include <time.h> #include <conio.h> #include <locale.h> using namespace std; int main (){
C++ Добавить в конец программы строчку cout << "Your number is", не задев цикл Здравстуйте! Подскажите, пожалуйста, как добавить в конец программы cout << "Your number is" не задев цикл. #include <iostream> #include <cstdio> #include <conio.h> using namespace std; int roman (int,int,char); int main() { подробнее

Показать сообщение отдельно
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 468
Завершенные тесты: 1
07.03.2014, 22:17  [ТС]     Создание игр в текстовом режиме
Короче по максимому изменил мой класс Меню,в лучшую сторону или нет, судить конечно не мне а Вам. А как мне кажется, он ниче так)
Во-первых, теперь он у меня не абстрактный.Потому что, я подумал что это не нужно в принципе.
Во-вторых, я написал библиотеку графики,точнее стащил пол кода с книги Р.Лафоре, и сделал на его "Упрощенном варианте консольной графики" класс. Теперь этот класс я использую везде, где хочу изменить цвет, стереть с экрана что-нибудь, или расположить курсор в нужном мне месте. Думаю это стало более удобнее, чем было раньше. Но меню не будет работать без этого класса, поэтому его нужно таскать всегда с собой.
В-третьих, избавился от функций run вовсе, они мне не нужны) Создаю меню я в главной функции main и все такое)

Итак сами файлы:

Файл Menu.h
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
#ifndef MENU_H_
#define MENU_H_
 
#include <iostream>
#include <vector>
#include <string>
#include <conio.h>
 
#include "Grafic.h"
 
 
/* ## Класс интерфейса ## */
class Menu
{
private:
    static int number_current_menu_;                    // Номер текущего списка меню
    int current_cursor_;                                // Каретка текущего пункта меню
    int x_, y_;                                         // Координаты прорисовки списка на экране
    static std :: vector<std :: wstring> list_menu_;    // Список меню
    Grafic *grafic_;                                    // Объект графики
 
public:
    Menu(int,int);                                      // Конструктор
    ~Menu();                                            // Деструктор
 
    void add_list_menu(std :: wstring);                 // Добавить пункт в список меню
    void draw_menu();                                   // Прорисовка списка меню
    int current_menu() const;                           // Получение номера текущего списка меню
    int current_cursor() const;                         // Получение каретки текущего пункта меню
    static void next_menu();                            // Следующий список меню
    static void back_menu();                            // Предыдущий список меню
};
 
#endif  MENU_H_
Файл Menu.cpp
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
#include "Menu.h"
 
 
int Menu :: number_current_menu_ = 1;
std :: vector<std :: wstring> Menu :: list_menu_;
 
 
/* ## Конструктор ## */
Menu :: Menu(int x,int y) : x_(x),y_(y)
{ 
    grafic_ = new Grafic;
}
 
 
/* ## Деструктор ## */
Menu :: ~Menu()
{ }
 
 
/* ## Следующий список меню ## */
void Menu :: next_menu()
{
    if(number_current_menu_ != list_menu_.size())
    { number_current_menu_++; }
}
 
 
/* ## Предыдущий список меню ## */
void Menu :: back_menu()
{
    if(number_current_menu_ != 0)
    { number_current_menu_--; }
}
 
 
/* ## Получение текущего списка меню ## */
int Menu :: current_menu() const
{
    return number_current_menu_;
}
 
 
/* ## Получение каретки текущего пункта меню ## */
int Menu :: current_cursor() const
{
    return current_cursor_;
}
 
 
/* ## Добавить пункт в список меню ## */
void Menu :: add_list_menu(std :: wstring item)
{
    list_menu_.push_back(item);
}
 
 
/* ## Прорисовка списка меню ## */
void Menu :: draw_menu()
{
    if (list_menu_.empty())
    {
        grafic_ -> clear_screen();
        std :: cout << "Check your list menu!It is empty!";
        _getch();
        exit(0);
    }
 
    grafic_ -> set_color(cWHITE,cBLACK);
    grafic_ -> clear_screen();
 
    for(unsigned int i = 0; i < list_menu_.size(); i++) 
    {
        grafic_ -> set_cursor_pos(x_ + 4,y_ + i);
        std :: wcout << list_menu_[i] << std :: endl;
    }
 
    grafic_ -> set_cursor_pos(x_,y_);
    current_cursor_ = 1;
    char c;
 
    do
    {
        for(unsigned int i = 0; i < list_menu_.size(); i++)
        {
            if(i == current_cursor_ - 1)
            { grafic_ -> set_color(cBLACK,cYELLOW); }
            else
            { grafic_ -> set_color(cBLACK,cBLUE); }
 
            grafic_ -> set_cursor_pos(x_,y_ + i);
            std :: cout << "->";
        }
 
        c = _getch();
 
        switch(c)
        {
        case 72: if(current_cursor_ != 1) { current_cursor_--; } break;
        case 80: if(current_cursor_ != list_menu_.size()) { current_cursor_++; } break;
        }
    }
    while(c != 13);
 
    list_menu_.clear();
}
Файл Grafic.h
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
#ifndef GRAFIC_H_
#define GRAFIC_H_
 
#include <iostream>
#include <windows.h>
 
 
/* ## Список перечисления ## */
enum color
{
    cBLACK=0, cDARK_BLUE=1, cDARK_GREEN=2, DARK_CYAN=3, cDARK_RED=4, cDARK_MAGENTA=5, cBROWN=6, cLIGHT_GRAY=7,
    cDARK_GRAY=8, cBLUE=9, cGREEN=10, cCYAN=11, cRED=12, cMAGENTA=13, cYELLOW=14, cWHITE=15
};
 
 
/* ## Класс графики ## */
class Grafic
{
private:
    static HANDLE h_console_;                       // Дескриптор окна консоли
 
public:
    Grafic();                                       // Конструктор
    ~Grafic();                                      // Деструктор
 
    void set_color(color fg,color bg = cBLACK);     // Установка цвета
    void set_cursor_pos(int x,int y);               // Установка позиции курсора
    void clear_screen();                            // Стирание экрана
};
 
#endif GRAFIC_H_
Файл Grafic.cpp
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
#include "Grafic.h"
 
 
HANDLE Grafic :: h_console_ = NULL;
 
 
Grafic :: Grafic()
{
    COORD console_size = {80,25};
 
    h_console_ = CreateFile( L"CONOUT$",
                            GENERIC_WRITE |
                            GENERIC_READ,
                            FILE_SHARE_READ |
                            FILE_SHARE_WRITE,
                            0L,
                            OPEN_EXISTING,
                            FILE_ATTRIBUTE_NORMAL,
                            0L );
 
    SetConsoleScreenBufferSize(h_console_,console_size);
 
    SetConsoleTextAttribute(h_console_,(WORD)((0<<4) | 15));
 
    clear_screen();
}
 
 
Grafic :: ~Grafic()
{ }
 
 
void Grafic :: set_color(color foreground,color background)
{
    SetConsoleTextAttribute(h_console_,(WORD)((background<<4) | foreground));
}
 
 
void Grafic :: set_cursor_pos(int x,int y)
{
    COORD cursor_pos;
    cursor_pos.X = x - 1;
    cursor_pos.Y = y - 1;
 
    SetConsoleCursorPosition(h_console_,cursor_pos);
}
 
 
void Grafic :: clear_screen()
{
    set_cursor_pos(1,25);
 
    for(int j = 0;j < 25;j++)
    { std :: cout << "\n"; }
 
    set_cursor_pos(1,1);
}
И конечно же сам main.cpp
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
#include <iostream>
#include <conio.h>
 
#include "Menu.h"
#include "Grafic.h"
 
using namespace std;
 
int main()
{
    Grafic *grafic = new Grafic;
    Menu *inter = new Menu(38,10);
    
    for(;;)
    {
        switch(inter -> current_menu())
        {
        case 1: // Первое меню - START  OPTION  EXIT
            {
                inter -> add_list_menu(L"START");
                inter -> add_list_menu(L"OPTION");
                inter -> add_list_menu(L"EXIT");
 
                inter -> draw_menu();
 
                switch(inter -> current_cursor())
                {
                case 1:
                    {
                        grafic -> clear_screen();
                        cout << "hello world";
                        _getch();
                    }
                break;
 
                case 2:
                    {
                        inter -> next_menu();
                    }
                break;
 
                case 3:
                    {
                        exit(0);
                    }
                break;
                }
            }
        break;
 
        case 2: // Второе меню - DINAMIC CREATE MENU   MESSAGE   BACK
            {
                inter -> add_list_menu(L"DINAMIC CREATE MENU");
                inter -> add_list_menu(L"MESSAGE");
                inter -> add_list_menu(L"BACK");
 
                inter -> draw_menu();
 
                switch(inter -> current_cursor())
                {
                case 1:
                    {
                        grafic -> clear_screen();
                        wstring item;
                        vector<wstring> dimanic_menu;
 
                        for(int i = 0; i < 6; i++)
                        {
                            cout << "Input item of menu";
                            wcin >> item;
                            inter -> add_list_menu(item);
                        }
 
                        inter -> draw_menu();
 
                        switch(inter -> current_cursor())
                        {
                        case 1: inter -> back_menu(); break;
                        case 2: inter -> back_menu(); break;
                        case 3: { inter -> back_menu(); } break;
                        }
                    }
                break;
 
                case 2:
                    {
                        grafic -> clear_screen();
                        cout << "I Love CyberForum";
                        _getch();
                        inter -> back_menu();
                    }
                break;
 
                case 3:
                    {
                        inter -> back_menu();
                    }
                break;
                }
            }
        break;
        }
    }
 
    return 0;
}
Жду снова ваших комментариев по поводу написанного. Надеюсь хоть на этот раз более-менее грамотно написано, и можно продолжать дальше)
 
Текущее время: 04:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru