о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о Популярная игра Змейка! о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о о
Простой и удобный интерфейс дает возможность насладится всем известной игрой Змейка. В архиве есть исходники программы на с++ builder и скомпилированый ехе файл. Управление производится с помощью стрелочек на клавиатуре компьютера. Скачиваем и играем)))
Часть кода программы:
//автор(с): Бабченко Александр #ifndef _UNICODE #define _UNICODE #endif #ifndef UNICODE #define UNICODE #endif #ifndef min #define min(a, b) (((a) < (b)) ? (a) : (b)) #endif #ifndef max #define max(a, b) (((a) > (b)) ? (a) : (b)) #endif #include <windows.h> #include <stdio.h> #include <time.h> #ifdef __BORLANDC__ #pragma hdrstop #pragma warn -8027 #endif #include "console.h" #include "controls.h" #define GAME_CMD_START 0 #define GAME_CMD_HELP 1 #define GAME_CMD_QUIT 2 #define STATE_G_MENU 0 #define STATE_G_PLAY 1 #define STATE_G_HELP 2 #define DELAY_START 150UL #define SNAKE_LENGTH 77 #define SNAKE_LEVELS 7 class Snake: public xConsole { private: DWORD score; DWORD delay; WORD level; WORD state; WORD key_ctrl; SMALL_RECT frect; COORD obj_pos; WORD obj_inc; xField field; xMsgBox msgbox; xButtonGroup<3> buttons; slist<COORD> snake; public: Snake(void); virtual ~Snake(); private: virtual void OnCreate(void); virtual void OnMouseMove(const COORD&); virtual void OnMouseDown(UINT, const COORD&); virtual void OnMouseUp(const COORD&); // virtual void OnMouseWheel(int); // virtual void OnMouseDblDown(UINT, const COORD&); virtual void OnKeyDown(WORD); virtual void OnKeyUp(WORD); virtual void OnProcess(void); private: void draw_play(void); void generate_pos(void); bool is_self_intersect(void); void put_bonus(void); void show_help(void); void draw_victory(void); void draw_pause(void); }; //------------------------------------------------------------------------------------------------------- Snake::Snake():xConsole(), score(0UL), delay(0UL), level(0), state(STATE_G_MENU), key_ctrl(0){ } Snake::~Snake(){ snake.clear(); msgbox.destroy(); } //событие возникает создание консольного буфера или присваивание текущего void Snake::OnCreate(void){ SetConsoleTitleW(L"Змейка"); srand((unsigned int)time(NULL)); //добавляем дополнительный буфер для игрового поля if(Add() == ERROR_SUCCESS){ setActiveNoVisible(1); setBufferSize(Width(), Height() / 9); SMALL_RECT rc = getWindowSize(); rc.Bottom = Height() - 1; setWindowSize(rc, TRUE); VisibleCaret(FALSE); } //рисуем меню игры setActiveNoVisible(0); setBufferSize(Width(), Height() / 11); SMALL_RECT rc = getWindowSize(); rc.Bottom = Height() - 1; setWindowSize(rc, TRUE); VisibleCaret(FALSE); const WORD color = BACKGROUND_RED | BACKGROUND_BLUE; DrawRect(0, 0, Width(), 3, color); DrawRect(0, Height() - 4, Width(), Height(), color); const TCHAR str[] = TEXT("\4 \4 \4 ЗМЕЙКА \4 \4 \4"); const int len = lstrlen(str); WriteText(str, len, (Width() - len) / 2, 2, color | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); buttons.set_parameter(this, 3); buttons.add(0, TEXT("НАЧАТЬ ИГРАТЬ"), (Width() - 32)/2, 5, 32, 4); buttons.add(1, TEXT("СПРАВКА ИГРЫ"), (Width() - 32)/2, 11, 32, 4); buttons.add(2, TEXT("ВЫЙТИ ИЗ ИГРЫ"), (Width() - 32)/2, 17, 32, 4); const TCHAR hlp[] = TEXT("Для выбора пункта меню используйте мышку или клавиши клавиатуры"); WriteText(hlp, lstrlen(hlp), 2, Height()-2, color | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); setAsyncLoop(TRUE); msgbox.create(this); setActiveNoVisible(1); setFixedHeight(Height() / 9); setActiveNoVisible(0); level = 0; } //событие движение мыши void Snake::OnMouseMove(const COORD& pos){ switch(state){ case STATE_G_MENU: buttons.mouse_move(pos); break; } } void Snake::OnMouseDown(UINT but, const COORD& pos){ switch(state){ case STATE_G_MENU: buttons.mouse_down(but, pos); break; } } void Snake::OnMouseUp(const COORD& pos){ if(state == STATE_G_MENU){ switch(buttons.mouse_up(pos)){ case GAME_CMD_START: draw_play(); break; case GAME_CMD_HELP: show_help(); break; case GAME_CMD_QUIT: setAsyncLoop(FALSE); break; } } } //событие нажатие клавиши клавиатуры void Snake::OnKeyDown(WORD key){ switch(state){ case STATE_G_MENU: buttons.key_down(key); break; case STATE_G_PLAY: switch(key){ case VK_LEFT: case 'A': key_ctrl = VK_LEFT; break; case VK_RIGHT: case 'D': key_ctrl = VK_RIGHT; break; case VK_UP: case 'W': key_ctrl = VK_UP; break; case VK_DOWN: case 'S': key_ctrl = VK_DOWN; break; case VK_ESCAPE: //выход setAsyncLoop(FALSE); break; case VK_SPACE: //пауза пробел MessageBeep(MB_ICONINFORMATION); draw_pause(); break; } break; } } //событие отпускание клавиши клавиатуры void Snake::OnKeyUp(WORD key){ if(state == STATE_G_MENU){ switch(buttons.key_up(key)){ case GAME_CMD_START: draw_play(); break; case GAME_CMD_HELP: show_help(); break; case GAME_CMD_QUIT: setAsyncLoop(FALSE); break; } } }
alexfint32