Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Игра "Змейка" (нужно добавить элементы ООП), Игра "Змейка" 
:(
    Опции темы
devl13
Дата 7.10.2014, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 9.12.2013

Репутация: нет
Всего: нет



Написал игру змейка на с++, но мне нужно теперь как нибудь эту же игру сделать, но только с элементами объектно-ориентированного программирование. Прошу помочь мне в написании. 

Код

#include <iostream>  //стандартная библиотека
#include <time.h> //случайные числа
#include <stdio.h> //для printf
#include <windows.h> // для HANDLE, курсора, цвета
#include <conio.h>  //для kbhit
#include <locale.h>
 
using namespace std;
 
 
 
HANDLE hConsole;
//HANDLE hStdout, hStdin;
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
 
void GotoXY(int X, int Y)
{
    COORD coord = { X, Y };
    SetConsoleCursorPosition(hStdOut, coord);

//Цвет
enum ConsoleColor
{
        Black         = 0, //черный
        Blue          = 1, //синий
        Green         = 2, //зеленый
        Cyan          = 3, //голубой
        Red           = 4, //красный
        Magenta       = 5, //пурпурный
        Brown         = 6, //коричневый 
        LightGray     = 7, //светло-серый
        DarkGray      = 8, //темно-серый
        LightBlue     = 9, //светло-синий
        LightGreen    = 10, //светло-зеленый
        LightCyan     = 11, //светло-голубой
        LightRed      = 12, //светло-красный
        LightMagenta  = 13, //светло-пурпурный 
        Yellow        = 14, //желтый
        White         = 15 //белый
};
 
void SetColor(ConsoleColor text, ConsoleColor background)
{
    SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));
}
 
 
class Zmeja  // структура змейка 
{
    public:COORD *t; //точки
    public:int PCount; //количество яблок
};
enum uprawlenie{LEFT,UP,RIGHT,DOWN}; //направление змейки
class Game //даные-точности: змейки, яблок, передвижение по X и Y, задержка, направление
{
    public:Zmeja gaduka; //змейка
    public:COORD jabloko; //яблоко
    public:int dx,dy; //передвижение
    public:int pause; //задержка
    public:int nap; //направление
    
};
 
 
void PlusJabloko(Game &g) //Функция разброски яблок
{
    int i,x,y;
    int n = g.gaduka.PCount;
    do
    {
        x = rand() % 56+3; //
        y = rand() % 19+3; //координаты яблока
        for(i = 0; i < n; i++)
        {
            if(x == g.gaduka.t[i].X && y == g.gaduka.t[i].Y) // проверка чтоб яблоко не бросить на змею
                break;
        }
    }
    while(i < n);
    g.jabloko.X = x; //
    g.jabloko.Y = y; //запоминаем позицию яблока
    SetConsoleCursorPosition(hConsole, g.jabloko); //переносим курсор в эту позицию
    SetConsoleTextAttribute(hConsole,0x0c); //цвет яблока  
    printf("%c", 4); //рисуем яблоко каким хотим символом
    
}
 
 
void skorostGame(Game &g) // Функция старта змейки ее координат и скорости
{
    system("cls");
    g.gaduka.PCount = 3; //сколько точек в змейке
    g.gaduka.t = new COORD [3];//создали точки
    for(int i = 0; i < 3; i++)
    {
        g.gaduka.t[i].X = 20 + i;
        g.gaduka.t[i].Y = 20;
        
    }
    g.dx = 1;
    g.dy = 0;
    g.pause = 100;//скорость передвижение змеи
    PlusJabloko(g);//рисуем яблока
}
void Level()
{
    GotoXY(10,10);cout <<"Будьте внимательны"<<endl;    
}
void ZmejaStart()
{
    GotoXY(10,15);cout <<"Соберите 30 яблок"<<endl;
}
void STENA_2() //Вся информация, отображаемая на стене
{
    GotoXY(64,2);cout <<  "Данные:" << endl ; //Данные
    GotoXY(64,3);cout <<  "Яблок:0" << endl ; //Яблок
    GotoXY(64,4); cout <<  "Длина:3"<< endl; //Длина
    GotoXY(64,5); cout <<  "Скорость:0" << endl; //Скорость
    GotoXY(64,7); cout << "Управление:" <<  endl; //Управление
    GotoXY(64,8); cout << "Esc:выход" <<  endl; //Выход
    GotoXY(64,9); cout << "P:Пауза" <<  endl; //Пауза
    GotoXY(64,10); cout <<"S:Старт" <<  endl; //Старт
    GotoXY(64,11); cout <<"L:Уровень" <<  endl; //Уровень
    GotoXY(64,13);printf("%c",24);cout <<":Вверх"<<endl; //Вверх
    GotoXY(64,14);printf("%c",25);cout<<":Вниз"<<endl;   //Вниз
    GotoXY(64,15);printf("%c",27);cout<<":Влево"<<endl;  //Влево
    GotoXY(64,16);printf("%c",26);cout<<":Вправо"<<endl; //Вправо
                {SetColor(LightMagenta , Black);
                
                GotoXY(2,2); //Рисуем верхнюю горизонтальную линию-стенку
                int m = 0;
                for(m = 0; m < 60; m++)
                {
                    printf("-");
                }
                }
                
                {
                    GotoXY(2,24); //Рисуем нижнюю горизонтальную линию-стенку
                    int m = 0;
                    for(m = 0; m < 60;m++)
                    {
                        printf("-");
                    }
                }
                {   //Рисуем левую вертикальную линию-стенку
                    GotoXY(2,3); cout << "|"<<endl;
                    GotoXY(2,4); cout << "|"<<endl;
                    GotoXY(2,5); cout << "|"<<endl;
                    GotoXY(2,6); cout << "|"<<endl;
                    GotoXY(2,7); cout << "|"<<endl;
                    GotoXY(2,8); cout << "|"<<endl;
                    GotoXY(2,9); cout << "|"<<endl;
                    GotoXY(2,10); cout << "|"<<endl;
                    GotoXY(2,11); cout << "|"<<endl;
                    GotoXY(2,12); cout << "|"<<endl;
                    GotoXY(2,13); cout << "|"<<endl;
                    GotoXY(2,14); cout << "|"<<endl;
                    GotoXY(2,15); cout << "|"<<endl;
                    GotoXY(2,16); cout << "|"<<endl;
                    GotoXY(2,17); cout << "|"<<endl;
                    GotoXY(2,18); cout << "|"<<endl;
                    GotoXY(2,19); cout << "|"<<endl;
                    GotoXY(2,20); cout << "|"<<endl;
                    GotoXY(2,21); cout << "|"<<endl;
                    GotoXY(2,22); cout << "|"<<endl;
                    GotoXY(2,23); cout << "|"<<endl;
                }
                {   //Рисуем правую вертикальную линию-стенку
                    GotoXY(61,3); cout << "|"<<endl;
                    GotoXY(61,4); cout << "|"<<endl;
                    GotoXY(61,5); cout << "|"<<endl;
                    GotoXY(61,6); cout << "|"<<endl;
                    GotoXY(61,7); cout << "|"<<endl;
                    GotoXY(61,8); cout << "|"<<endl;
                    GotoXY(61,9); cout << "|"<<endl;
                    GotoXY(61,10); cout << "|"<<endl;
                    GotoXY(61,11); cout << "|"<<endl;
                    GotoXY(61,12); cout << "|"<<endl;
                    GotoXY(61,13); cout << "|"<<endl;
                    GotoXY(61,14); cout << "|"<<endl;
                    GotoXY(61,15); cout << "|"<<endl;
                    GotoXY(61,16); cout << "|"<<endl;
                    GotoXY(61,17); cout << "|"<<endl;
                    GotoXY(61,18); cout << "|"<<endl;
                    GotoXY(61,19); cout << "|"<<endl;
                    GotoXY(61,20); cout << "|"<<endl;
                    GotoXY(61,21); cout << "|"<<endl;
                    GotoXY(61,22); cout << "|"<<endl;
                    GotoXY(61,23); cout << "|"<<endl;
                }
}
 
 
//Функция которая двигает и рисует
enum {KONEC, STENA,  PLUS, MOVE};
int Move(Game &g)
{
    int & n = g.gaduka.PCount;
    COORD head = g.gaduka.t[n - 1]; //голова
    COORD tail = g.gaduka.t[0]; //хвост
    COORD next;
    next.X = head.X + g.dx;
    next.Y = head.Y + g.dy; //проверка следующей точки по направлению
    
    if(next.X < 3 || next.Y < 3 || next.X > 60 || next.Y > 23)//не уперлась ли в стену?
        return STENA;
        
    if(n > 4)
    {
        for(int i = 0; i < n; i++)
            if(next.X == g.gaduka.t[i].X && next.Y == g.gaduka.t[i].Y) //не наехали ли на себя?
                return KONEC;
    }
    
    if(next.X == g.jabloko.X && next.Y == g.jabloko.Y)
    {
        COORD*temp = new COORD[ ++n ]; //новый массив больший на 1
        for(int i = 0; i < n; i++)
            temp[i] = g.gaduka.t[i]; //перекопируем
        temp[n - 1] = next; //добавляем одну
        delete [] g.gaduka.t;
        g.gaduka.t = temp;
        
        SetConsoleCursorPosition(hConsole,head);
        SetConsoleTextAttribute(hConsole, 0x0a); //закрашиваем яблоко которое съели 
        printf("*");
        SetConsoleCursorPosition(hConsole,next);
        SetConsoleTextAttribute(hConsole,0x0a);
        printf("%c",1);
        PlusJabloko(g);
        return PLUS;
    }
    
    for(int i = 0; i < n - 1; i++)
        g.gaduka.t[i] = g.gaduka.t[i + 1];
    g.gaduka.t[n - 1] = next;
    SetConsoleCursorPosition(hConsole,tail);//закрашиваем хвостик
    printf(" ");
    
    SetConsoleCursorPosition(hConsole,head);
    SetConsoleTextAttribute(hConsole, 0x0a);//красим хвост змеи в зелений цвет
    printf("*");
    SetConsoleCursorPosition(hConsole,next);
    SetConsoleTextAttribute(hConsole,0x0f); //красим курсор в белый цвет (голову змеи) 
    printf("%c",1);
    
    return MOVE;
}
 
int intro()
{
        GotoXY(3,10); //Интро
    printf("Игра - Змейка. (Нажмите Enter...)");
   
    getch();
}
 
int main()
{
    setlocale(LC_ALL, "russian_russia.1251");
    
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE); //получаем дескриптор консоли
    intro();
    int key = 0, count = 0;
    bool Pause=false;
    Game g;
    skorostGame(g);
    STENA_2();
    srand(time(0));
    bool pause = false;
    while(key != 27)
    {
        while(!kbhit()) //ждет пока нажмем
        {
            if(Pause==true)
            {
                Sleep(1); 
                continue;
            }
            
            switch (Move(g))//движение
            {
                
            case PLUS:
                ++count;
                g.pause-=1;
                SetColor(LightBlue , Black);
                GotoXY(64,2);cout <<  "Данные:" << endl ;
                GotoXY(64,3); cout << "Яблок:" <<count << endl;
                GotoXY(64,4); cout << "Длина:" <<g.gaduka.PCount << endl;
                GotoXY(64,5); cout << "Скорость:" <<g.pause<< endl;
                GotoXY(64,7); cout << "Управление:" <<  endl;
                GotoXY(64,8); cout << "Esc:Выход" <<  endl;
                GotoXY(64,9); cout << "P:Пауза" <<  endl;
                GotoXY(64,10); cout <<"S:Старт" <<  endl;
                GotoXY(64,11); cout <<"L:Уровень" <<  endl;
                GotoXY(64,13);printf("%c",24);cout <<":Вверх"<<endl;
                GotoXY(64,14);printf("%c",25);cout<<":Вниз"<<endl;
                GotoXY(64,15);printf("%c",27);cout<<":Влево"<<endl;
                GotoXY(64,16);printf("%c",26);cout<<":Вправо"<<endl;
                if (count == 30) 
                {
                    SetColor(White , Black);
                    GotoXY(24,1); cout << "Вы выйграли, поздравляю!" << endl; 
                    getch();
                    return(0);
                }
                break;
                
            case STENA:
                
            case KONEC:
                GotoXY(23,1); printf("Вы проиграли!!!\n\n\t\t\t"); 
                getch();
                break;
            }
            
            Sleep(g.pause); //Задержка
        }
    key = getch();
        
        if(key=='P'||key=='p')
            Pause=!Pause;
            else if(key=='S'||key=='s')
            ZmejaStart();
        else if(key=='L'||key=='l')
            Level();
        else if(key==0||key==224)
        {
            key=getch();
            
            if(key == 72 && g.nap != DOWN)
            {
                g.nap = UP;
                g.dx = 0;
                g.dy = -1;
            }
            else if(key == 80 && g.nap != UP)
            {
                g.nap = DOWN;
                g.dx = 0;
                g.dy = 1;
            }
            else if(key == 75 && g.nap != RIGHT)
            {
                g.nap = LEFT;
                g.dx = -1;
                g.dy = 0;
            }
            else if(key == 77 && g.nap != LEFT)
            {
                g.nap = RIGHT;
                g.dx = 1;
                g.dy = 0;
            }
        }
    }
}

PM MAIL   Вверх
sQu1rr
Дата 7.10.2014, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Если сами написали то достаточно почитать о методах класса. ИМХО.
А еще есть центр помощи по учебным заданиям, если время поджимает.
Хотите помощь, скажите что не получается, предварительно прочитав о методах класса, как указал выше.

Добавлено через 2 минуты и 19 секунд
Кстати отрисовка стенок порадовала (читай "китайский код")
PM MAIL Skype GTalk   Вверх
math64
Дата 8.10.2014, 07:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



Кстати, мешать вместе printf() и cout << не рекомендуется.
Вместо
Код

int m = 0;
for(m = 0; m < 60;m++)

можно писать
Код

for(int m = 0; m < 60;m++)

Всё равно же пишешь на C++.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0782 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.