Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Въпросчета за задача

Featured Replies

Здравейте,

Трябва да направя Tic Tac Toe игра в терминала. Изискването към задачата е да се въвеждат координатите на хиксчетата и кръгчетата като в матрица. Това, което не ми харесва в подхода на решаването на задачата е, че не знам как да съкратя кода, който отговаря за входа на данните. Тоест първи играч въвежда, втори после пак първи и тн.  Бих искал някак си чрез цикъл или чрез рекурсия да си спестя редовете за входа, но в същото време да се запазва реда на действията, но не се сещам как да стане това. Също така задачата я искат обектно ориентирана но аз я почнах процедурно защото още не ми е ясно как да разделя и подредя логиката за тази задача. Погледнете кода ми, за да разберете:

 

#include<iostream>

using namespace std;

void readData(char m, int &n1, int &n2){
    

            cout << "Enter coordinates for " << m << endl;
            cin >> n1 >> n2;
       
    
}
int main()
{
   char x[3][3];
   for(int i =0;i<3;i++){
       for(int j=0;j<3;j++) 
        x[i][j] = '*';
    
   }
    int r, c;
    readData('X', r, c);

   
   for(int i=0;i<3;i++){
       for(int j=0;j<3;j++)
       {
           
            
            x[r][c] = 'X';
            cout<< x[i][j];
        }
        
    cout << endl;
   }
   
    readData('O', r, c);
   
    for(int i=0;i<3;i++){
       for(int j=0;j<3;j++)
       {
           
            if(x[r][c] != 'X'){
                x[r][c] = 'O';
            }
            
            cout<< x[i][j];
        }
        
    cout << endl;
   }
   
   readData('X', r, c);
    
     for(int i=0;i<3;i++){
       for(int j=0;j<3;j++)
       {
           
               if(x[r][c] != 'O'){
                x[r][c] = 'X';
            }
            cout<< x[i][j];
        }

        
    cout << endl;
    }
   
   readData('O', r, c);
   
    for(int i=0;i<3;i++){
       for(int j=0;j<3;j++)
       {
           
            
              if(x[r][c] != 'X'){
                x[r][c] = 'O';
            }
            cout<< x[i][j];
        }

        
    cout << endl;
    }
   
    return 0;
}

 

Редактирано от frozener (преглед на промените)

#include<iostream>

#define NL putchar('\n')

using namespace std;

class board {
    char x[3][3];
public:
    board();
    void readData(char);
    void print();
    int isWin(char);
};
    
board::board() 
{
    memset(x, '+', 9);
} 

void board::readData(char m)
{
    int r, c;
    do {          
        cout << "\nEnter coordinates for " << m <<" ";
        cin >> r >> c;
    } while (r<0||r>2||c<0||c>2||x[r][c]!='+');
    x[r][c]=m;
}

void board::print()
{
    for (int i=0; i<3; ++i)
    {
        NL;
        for (int j=0; j<3; ++j)
            cout<<x[i][j]<<' ';
        NL;
    }
}

int board::isWin(char p)
{
    return 0;
}
     
int main()
{
    char p='O';
    char z='O'^'X';
    int  h=0, w;
    board b;
    do {
        b.print();
        p ^= z;
        b.readData(p);
        w = (++h>4) && b.isWin(p);
    } while((h<9)&&!w);
    b.print();
    if (w) cout<<"The Player "<<p<<" is a Winner!\n";
    return 0;
}

Метода за проверка дали има победа съм ти го оставил празен - да си го напишеш сам

Редактирано от ined (преглед на промените)

  • Автор

Аз чак сега видах отговора става ли да си покажа и моето ОО решение и да ми кажеш дали е добро?

#include<iostream>

using namespace std;


class Player{
    
    private:
        char piece;
            
    char b[3][3];
        int r, c;
    public:
        Player();
        void setStartingPiece(char p);
        char getStartingPiece() const;
        int getRowCoord() const;
        int getColCoord() const;
    
};


Player::Player(){
    
    piece = 'X';
    r = 0;
    c = 0;
    
    
}


void Player::setStartingPiece(char p){
    
    piece = p;
    
}

char Player::getStartingPiece() const{
    
    return piece;
    
}




int Player::getRowCoord() const{
    
    return this->r;
    
}

int Player::getColCoord() const{
    
    return this->c;
    
}

class Board
{
  
        private:
            char b[3][3];
            int r, c;
            char winner;
        public:
            Board();
            void placePiece(int r, int c, char turn);
            void comparePieces();
            void printcurr();
            bool findWinner();
            void setTheWinner(char c);
            char getTheWinner();
    
    
    
};

Board::Board(){
    
    r = 0;
    c = 0;
    
    for(int i=0;i<3;i++){
         for(int j=0;j<3;j++){
            
            b[i][j] = '*';
         }
        
    }
    
}


void Board::placePiece(int r, int c, char turn){
    
    this->r = r;
    this->c = c;
    
    if(b[this->r][this->c] == 'X' || b[this->r][this->c] == 'O'){
        
        cout << "Error. There is a piece"<< endl;
        
    }else
    {
       b[r][c] = turn;
        
    }
    
    
    
    
}


void Board::comparePieces(){
    
    
    
    
}


void Board::printcurr(){
    
        for(int i=0;i<3;i++){
         for(int j=0;j<3;j++){
            
            cout << b[i][j];
         }
        cout << endl;
    }
    
}


bool Board::findWinner(){
    
    
   
        
            
           if( b[0][0] == b[1][0]){
            
                if(b[1][0] == b[2][0]){
                    
                    if(b[2][0] == 'X'){
                    
                        setTheWinner('X');    
                        return true;
                    
                        
                    }
                }
                
                
            
           }

    
    return false;
    
    
    
}


void Board::setTheWinner(char c){
    
    winner = c;
    
    
}

char Board::getTheWinner(){
    
    return winner;
    
}





int main()
{
    
    Board board;
    Player player1;
    
    char turn;
    player1.setStartingPiece('X');
    turn = player1.getStartingPiece();
    
    Player player2;
    player2.setStartingPiece('O');
    
    int r, c;
    bool winner = false;
    while(winner == false){
    
        
        
        if(turn == player1.getStartingPiece()){
            cout << "Enter coordinates for X" << endl;
            cin >> r >> c;
            board.placePiece(r, c, turn);
            turn = player2.getStartingPiece();
            board.printcurr();
        }
        else
        {
            cout << "Enter coordinates for O" << endl;
            cin >> r >> c;
            board.placePiece(r, c, turn);
            turn = player1.getStartingPiece();
           board.printcurr();
        }
        
        winner = board.findWinner();
        
    }
    
    
   
    cout << "We have a winner " << board.getTheWinner() << endl;
    
    
  
   
    return 0;
}

 

на January 30, 2016 at 7:07, ined написа:

Метода за проверка дали има победа съм ти го оставил празен - да си го напишеш сам

 

Горе долу правилно си се ориентирал. Може би ти емалко рано за такъв тип дизайн, но те гледам, че упорито вървиш напред. Без да навлизам в подробности, в играта има два играча, една дъска и правила. Играчите могат да въвеждат данни ръчно или да компютъра може да "играе вместо тях". В обектно отношение, това са обектите:

 

1. Player - играта да използва две инстанции от този обект - по една за всеки играч. Всеки от обектите ще съдържа спецификите за отделните играчи, а това са №1 идентификатор (име  на играча), №2 ред (кой е почнал първи), и №3 историята на ходовете

2. Board - една истанция представяща моментното състояние на играта

3. GameManager - една инстанция грижеща №1се да дава ред на играчите, №2 да може да възпроизвежда всяко състояние на дъската спрямо историческите данни за ходовете на всеки от играчите и №3 да анализира състоянието на дъската за завършеност на играта

4. IPlayerManager по един за всеки играч - това е най-трудния за реализация интерфейс - фекчърито трябва да инстанцира ManualPlayerManager обслужващ ръчното въвеждане на данни за ходовете или AutoPlayerManager когато компютъра играе (анализира позицията на дъската и генерира ход според правилата с различна степен на интелигентност) вместо един от играчите...

 

С така подредените роли и взаимодействия вече е детска игра да се имплементира тази проста игрица, според предпочитанията на разработчика.

 

Успех!

айде сега 1001 обекта ще прави, два са си предостатъчни, само трябва да си изчисти нещата защото в момента са пълна каша.

Примерно ако играча обърка координатите какво правим? Програмата не трябва да дава грешни разултати защото е дал координати извън масива или на вече заета позиция - може да поиска да ги въведе отново или за по-интересно играча да си губи хода без да си сложи знака. 

 

  • Автор
на January 31, 2016 at 11:33, darkterminal написа:

Горе долу правилно си се ориентирал. Може би ти емалко рано за такъв тип дизайн, но те гледам, че упорито вървиш напред. Без да навлизам в подробности, в играта има два играча, една дъска и правила. Играчите могат да въвеждат данни ръчно или да компютъра може да "играе вместо тях". В обектно отношение, това са обектите:

 

1. Player - играта да използва две инстанции от този обект - по една за всеки играч. Всеки от обектите ще съдържа спецификите за отделните играчи, а това са №1 идентификатор (име  на играча), №2 ред (кой е почнал първи), и №3 историята на ходовете

2. Board - една истанция представяща моментното състояние на играта

3. GameManager - една инстанция грижеща №1се да дава ред на играчите, №2 да може да възпроизвежда всяко състояние на дъската спрямо историческите данни за ходовете на всеки от играчите и №3 да анализира състоянието на дъската за завършеност на играта

4. IPlayerManager по един за всеки играч - това е най-трудния за реализация интерфейс - фекчърито трябва да инстанцира ManualPlayerManager обслужващ ръчното въвеждане на данни за ходовете или AutoPlayerManager когато компютъра играе (анализира позицията на дъската и генерира ход според правилата с различна степен на интелигентност) вместо един от играчите...

 

С така подредените роли и взаимодействия вече е детска игра да се имплементира тази проста игрица, според предпочитанията на разработчика.

 

Успех!

В началото съм в ООП-то и ми е трудно да мисля обектно-ориентирано. Какъв съвет можеш да ми дадеш за да се науча да мисля по такъв начин? Досега съм правил уеб неща процедурно и ОО не съм решавал такива задачки. По-лесно ми е да мисля процедурно. :D

Редактирано от frozener (преглед на промените)

Често OO-то повече пречи отколкото помага. Мене ме кефят С програмите -

две програми които правят едно и също само дето на С е 20 КБ , а на С++ 480 КБ.

 

Редактирано от ined (преглед на промените)

преди 11 минути, ined написа:

Често OO-то повече пречи отколкото помага. Мене ме кефят С програмите -

две програми които правят едно и също само дето на С е 20 КБ , а на С++ 480 КБ.

ООП е свързано с начина на мислене и подход към проблемите, не с език. Примерно подхода горе описан от @darkterminal може изключително лесно да се разшири за горе долу всякакви игри от този тип, докато иначе ще трябва да се пренаписва програмата. А ти в твоя код ще е изключително трудно да обосновеш, защо изобщо ти е тоя клас board и нормално ли ти се струва една "дъска" да чете данни от клавиатурата :D или да знае кой печели. Ми ако искаме после да играем на една и съща дъска различни игри? При големи проекти, ООП изключително улеснява работата, поддръжката, разширяването, преизползването и т.н. на кода. Та идеята на Дарки беше да го научи как трябва да се прави, а не да отбие номера.

 

  • Автор
преди 14 часа, flare написа:

ООП е свързано с начина на мислене и подход към проблемите, не с език. Примерно подхода горе описан от @darkterminal може изключително лесно да се разшири за горе долу всякакви игри от този тип, докато иначе ще трябва да се пренаписва програмата. А ти в твоя код ще е изключително трудно да обосновеш, защо изобщо ти е тоя клас board и нормално ли ти се струва една "дъска" да чете данни от клавиатурата :D или да знае кой печели. Ми ако искаме после да играем на една и съща дъска различни игри? При големи проекти, ООП изключително улеснява работата, поддръжката, разширяването, преизползването и т.н. на кода. Та идеята на Дарки беше да го научи как трябва да се прави, а не да отбие номера.

 

Да това разбрах, че ми покзаха правилния начин за писане на такава програма и искам да знам как да почна да мисля обектно-ориентирано за по-сложни задачи?

Има много подходи към проблема. Най-простият е този:

 

1. Запомни, че ти описваш процес, а не пишеш програма. Процеса може да се нарисува с квадратчета, а програмата изисква дословен код!

2. Процеса се развива във  времето, като в него активно си взаимодействат Ентити и Двигатели, които се контролират от Мениджъри.

2. Ентити са обети носители и пазители на данни, описващи отделни обекти/субекти в процеса. Двигателите се занимават с преобразуване на данни. Мениджърите имплементират правилата за взаимодействие между Ентитите и Двигателите, както се и грижат за смяна и регистрация на статусите и положенията им в процеса.

 

От тук нататък, вече е въпрос на избор на архитектура какъв какъв подход за описание ще ползваш - класически примери са Сървис Ориентирана Архитектура или Аспек Ориентирана Архитектура има и други.

 

Мен ако питаш... Почвай полечка... Нещата само ще си дойдат на място с времето... Номера е да се опитваш да намериш глобално решение на проблема с неговите аспекти и взаимовръзки. Справиш ли се добре с тази част, нататък е песен да го пишеш Процедурно, Обектно, Спагети или Аспектно ориентирано...

 

Успех!

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.