```c++
#include <string.h>
#include "graphics.h"
// типы данных
typedef struct Button { // Кнопка
int x, y; // координаты
char text[50]; // текст
int w, h; // размеры
int state; // 0 - обычный, 1 - выделенный, 2 - заблокированный
// IMAGE * bmp; // или картинка
} Button;
// количество элементов массива
#define SIZE(mn) (int)(sizeof(mn)/sizeof(mn[0]))
// размеры кнопок по умолчанию
#define MENU_W 128
#define MENU_H 32
// глобальные переменные
Button mn[5]; // кнопки главного меню
int mode=0; // режим для переключателя
Button setmn[4]= { // кнопки настроек
{100, 100, "", 250, MENU_H, 0}, // поле ввода
{100, 150, "Просто", 100, MENU_H, 1}, // переключатель
{250, 150, "Сложно", 100, MENU_H, 0}, //
{150, 200, "OK", 100, MENU_H, 0}, //
};
IMAGE *fon; // фон для меню
// Заголовки функций
void init();
void zastavka();
void draw_menu(Button mn[], int n);
int select_menu(Button mn[], int n);
void new_game();
void settings();
void about();
void rules();
int main() { // основная функция
int st;
init();
zastavka();
do {
draw_menu(mn,SIZE(mn));
// Нарисовать остальные неитерактивные элементы оформления
st=select_menu(mn,SIZE(mn));
switch (st) {
case 1:
new_game();
break;
case 2:
settings();
break;
case 3:
about();
break;
case 4:
rules();
break;
}
} while (st < 5);
closegraph();
return 0;
}
Button new_button(int x, int y, const char *t, int w=MENU_W, int h=MENU_H, int st=0) { // создание кнопки
Button b;
b.x=x;
b.y=y;
b.w=w;
b.h=h;
b.state=st;
strcpy(b.text,t);
// или b.img=loadBMP(t);
return b;
}
void init() { // инициализация
initwindow(600, 600, "Пример меню");
// fon=loadBMP("menufon.jpg");
// инициализация кнопок по массиву
const char *items[]= {"Новая игра","Настройки","О программе","Правила","Выход"};
int top=50;
int left=(getmaxx()-MENU_W)/2;
for (int i=0; i<SIZE(items); ++i)
{ mn[i]=new_button(left,top,items[i]);
top+=MENU_H+20;
}
}
void zastavka() { // начальная заставка
setbkcolor(BLACK);
setcolor(WHITE);
outtextxy(100, 100, "Это заставка");
// или IMAGE *pic=loadBMP("screen.jpg");
getch(2);
// freeimage(pic);
}
void input_text(Button *b) { // ввод текста - поле ввода как кнопка
size_t len=strlen(b->text);
while (1) {
setfillstyle(SOLID_FILL,WHITE);
bar(b->x,b->y,b->x+b->w,b->y+b->h);
setcolor(BLACK);
outtextxy(b->x+5,b->y+(b->h-textheight("A"))/2,b->text);
int x=b->x+textwidth(b->text)+6;
line(x,b->y+2,x,b->y+b->h-2); // курсор
int k=getch(2);
if (k==MOUSE_LCLICK || k==KEY_ENTER)
return;
else if (k==KEY_BACKSPACE && len>0)
b->text[--len]=0;
else if (k>=' ' && len<sizeof(b->text)-1) {
b->text[len++]=k;
b->text[len]=0;
if (textwidth(b->text)>b->w-10) // и не превышает ширины!
b->text[--len]=0;
}
}
}
void draw_menu(Button mn[], int n) { // рисование меню
static int statecolor[3]= {LIGHTGRAY,YELLOW,DARKGRAY};
setbkcolor(BLUE);
clearviewport();
// putimage(0,0,fon);
setcolor(BLACK);
setbkcolor(NO_COLOR);
settextjustify(CENTER_TEXT,TOP_TEXT);
for (int i=0; i < n; i++) {
// рисуем кнопку
setfillstyle(SOLID_FILL,statecolor[mn[i].state]);
bar(mn[i].x,mn[i].y,mn[i].x+mn[i].w,mn[i].y+mn[i].h);
outtextxy(mn[i].x+mn[i].w/2,mn[i].y+(mn[i].h-textheight("A"))/2,mn[i].text);
// или putimage(mn[i].x, mn[i].y, mn[i].bmp, COPY_PUT);
}
settextjustify(LEFT_TEXT,TOP_TEXT);
}
int select_menu(Button mn[], int n) { // выбор пункта
int k=getch(2);
if (k==MOUSE_LCLICK)
{
int x = mousex();
int y = mousey();
for (int i=0; i < n; i++)
if (mn[i].state!=2 && x >= mn[i].x && y>=mn[i].y
&& x <= mn[i].x+mn[i].w && y<=mn[i].y+mn[i].h)
return i+1;
}
// можно сделать обработку клавиш
if (k==KEY_ESC) return n;
if (k==KEY_ENTER) return 1;
return 0;
}
void new_game() { // Игра
setbkcolor(BLACK);
setcolor(WHITE);
clearviewport();
outtextxy(100, 100, "Это новая игра");
getch(2);
}
void settings() { // Настройки
int st;
do {
draw_menu(setmn,SIZE(setmn));
// Нарисовать остальные неитерактивные элементы оформления
setcolor(WHITE);
setbkcolor(NO_COLOR);
outtextxy(100,70,"Введите текст:");
st=select_menu(setmn,SIZE(setmn));
switch (st) {
case 1: // ввод текста
input_text(&setmn[0]);
break;
case 2: // переключение режимов
mode=0;
setmn[1].state=1;
setmn[2].state=0;
break;
case 3:
mode=1;
setmn[1].state=0;
setmn[2].state=1;
break;
}
} while (st < 4);
}
void about() { // О программе
setbkcolor(BLACK);
setcolor(WHITE);
clearviewport();
outtextxy(100, 100, "О программе");
getch(2);
}
const char *rules_text[]= {"Правила игры","AAA","BBB"};
void rules() { // Вывод правил
setbkcolor(BLACK);
setcolor(WHITE);
clearviewport();
int top=20;
int left=20;
int skip=textheight("A")*1.5;
for (int i=0; i<SIZE(rules_text); ++i) {
outtextxy(left,top,rules_text[i]);
top+=skip;
}
getch(2);
}
```