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

Оптимизация кода игры в крестики нолики. - C++

Восстановить пароль Регистрация
 
Teplotexnik
1 / 1 / 0
Регистрация: 31.08.2013
Сообщений: 25
31.08.2013, 19:57     Оптимизация кода игры в крестики нолики. #1
Написал небольшой код буду благодарен если нормальные программисты порекомендуют как его нужно исправить. это игра в крестики нолики 10*10.
ниже привожу файлы.
Board.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
107
108
109
#ifndef _Board_
#define _Board_
#include <iostream>
#include "board.h"
#endif
using namespace std;
 
Board::Board(){
    
    
        Board::SetCell();
            Board::cell_win = Going;
}
Who_Win Board::WhoWinner(){
return cell_win;
}
 
Who_Win Board::IsWin (Who_Win prov){
    int wcount, hcount;
    for (int i=0; i<10; i++){// горизонтальная вертикальная проверка
        wcount=0;
        for (int j=0; j<10; j++){
            hcount=0;
            if (Array[i][j]==prov){
                wcount++;
                if (wcount==5){ 
                    cell_win =prov;
                    return cell_win;
                }
            }
            else{
                wcount =0;
            };
            if (Array[j][i]==prov){
                hcount++;
                if (hcount==5){ 
                    cell_win =prov;
                    return cell_win;
                }
            }
            else{
                hcount =0;
            };
        };
    };
 
    int drCount,dlCount;         //диагональная проверка
    for (int j=-10; j<10; j++){
        drCount=0; dlCount=0;
        for (int i=0;i<10;i++){
            if (((i+j)<10)&&((i+j)>=0)){
                if (Array[i][i+j]==prov){
                    drCount++;
                    if (drCount==5){
                        cell_win=prov;
                    return cell_win;}
                }
                else{
                    drCount =0;}
            };
            if (((j-i+10)<10)&&((j-i+10)>=0)){
                if (Array[i][(j-i+10)]==prov){
                    dlCount++;
                    if (dlCount==5){
                        cell_win=prov;
                        return cell_win;}
                    }
                    else{
                dlCount =0;}
            };
        };
    };
    
    int nobody=0;
    for (int i=0; i<10; i++){
        for (int j=0; j<10; j++){
            if (Array[i][j]==0){nobody++;
            }
        }
    }
    if (!nobody){return Draw;} 
    // cout << cell_win;    
    return cell_win;
    
};
bool Board::SetCell (int set_x, int set_y, XO xo){
    //cout << Array [set_x-1][set_y-1];
    if ((set_x>0)&&(set_x<11)&&(set_y>0)&&(set_y<11)){
    if ((Array[set_x-1][set_y-1]==0)){
                
        Array [set_x-1][set_y-1]= int (xo);
            //  cout << Array [set_x-1][set_y-1];
                return true;
    };
    };
    //Array [set_x-1][set_y-1]= int (xo);
    //  cout << Board::Array [set_x-1][set_y-1];
return false;
};
int Board::GetCell (int set_x, int set_y){
    return Board::Array[set_x][set_y];
};
void  Board::SetCell (){
    for (int i=0; i<10;i++){
        for (int j=0;j<10;j++){
            Board::Array[i][j]=0;
        }; 
    };
}
Board.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
enum Who_Win {Going, X_win, Y_win, Draw};
enum XO {x_count=1,y_count};
 
class Board{
private:
    int Array [10][10];
//  int set_x, set_y;
    Who_Win cell_win;
    static const int FIELD_SIZE=5;
public:
    Who_Win IsWin(Who_Win prov);
    bool SetCell (int set_x, int set_y, XO xo);
    void SetCell ();
    int GetCell (int set_x, int set_y);
    Who_Win WhoWinner();
    Board();
};
BoardView.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
enum Players {PLAYER1=1, PLAYER2};
 
class BoardView 
{
private:
        Board *MyBoard;
        void PrintMap();
public:
    BoardView();
    BoardView(Board* b );
    void GoGame();
    int Proverka (Players player);
};
BoardView.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
#ifndef _Board_View_
#define _Board_View_
#include "board.h"
#include <iostream>
#include "boardview.h"
#endif
using namespace std;
 
 
BoardView::BoardView(Board* My) 
{
    MyBoard = My;
};
 
void BoardView::PrintMap(){
    for (int i=0; i<10; i++){
        for (int j=0; j<10; j++){
            switch (MyBoard->GetCell(j,i)){
            case 0: cout << " _";
                break;
            case 1: cout << " X";
                break;
            case 2: cout << " O";
            }
        };
    cout << "\n";
    };
};
 
void BoardView::GoGame(){
 
    Players player;
 
    do{
        player = PLAYER1;
        cout<<"\n" << "1 Player enter the koordinats"<<"\n";
        Proverka(player);
        if (MyBoard->IsWin(X_win)) {break;}
        player = PLAYER2;
        cout<<"\n" << "2 Player enter the koordinats"<<"\n";
        Proverka(player);
        PrintMap();
    }while ((!MyBoard->IsWin(X_win))&&(!MyBoard->IsWin(Y_win)));
    if (MyBoard->WhoWinner()==2){
        cout << "Player 2 WINNER";}
    else {
        cout << "Player 1 WINNER";}
 
    }
 
 
int BoardView::Proverka(Players player){
        int set_x=0;
        int set_y=0;
                do{
        cin >> set_x, 
        cin >>  set_y;
        }while (!MyBoard->SetCell(set_x, set_y, XO(player)));
        
    return 1;
};
 
 
    int main(){
    char teta;
    Board MyBoard;
    BoardView MyBoardview(&MyBoard);
    char moreGames='y';
    do {
        if ((moreGames =='n')||(moreGames =='N'))
        {cout << "Are you sure? Y/N "<<"\n";
        cin >> moreGames;
        if ((moreGames =='y')||(moreGames =='Y')){
        break;} }
    //MyBoardview.GoGame();
    cout << "Do you want again Y/N" << "\n";
    cin >> moreGames;
    }while ((moreGames =='y')||(moreGames =='Y')||(moreGames =='n')||(moreGames =='N'));
    //MyBoardview.PrintMap();
    //cin >> teta;
    return 0;
}
Вложения
Тип файла: rar program.rar (1.6 Кб, 21 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2013, 19:57     Оптимизация кода игры в крестики нолики.
Посмотрите здесь:

C++ Логика для игры крестики нолики
C++ крестики нолики
C++ Крестики-нолики
C++ Крестики-нолики
Крестики - нолики. Комментарии. Программа. Объясните часть кода C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
x1Mike7x
 Аватар для x1Mike7x
214 / 127 / 6
Регистрация: 06.11.2010
Сообщений: 234
01.09.2013, 20:12     Оптимизация кода игры в крестики нолики. #2
1) Форматирование кода не очень - всё как-то сбито в разные блоки, непонятные отступы где не нужно и их отсутствие где нужно. В идеале: каждый блок должен иметь отступ в 4 пробела. И египетские скобочки режут глаз - всё-таки не на Джаве пишешь.
Например, первых два метода в Боард.срр я бы поправил так (по форматированию)
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
Board::Board()
{
    Board::SetCell();
    Board::cell_win = Going;
}
 
Who_Win Board::WhoWinner()
{
    return cell_win;
}

2) Вызовы методов класса из другого метода этого же класса. Например, в конструкторе Боарда ты вызываешь Board::SetCell(); - так пишут тогда, когда нужно вызвать метод внутри метода другого класса (или где-то еще, но не в методе того же класса), при этом не создавая экземпляр класса, т.е. класс выступает в роли обычного неймспейса. Также, метод, который вызывается таким образом должен быть статическим.
К тому же в методе Board::WhoWinner() ты уже не пишешь Board::cell_win =)
Я бы написал так:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
Board::Board()
{
    SetCell();
    cell_win = Going;
}
 
Who_Win Board::WhoWinner()
{
    return cell_win;
}

3) Правила наименования. По кодестайлу принято классы называть с большой буквы, а поля и методы классов - с маленькой. Также, лучше всего полям (константам не надо - они все капсом и так выделены) добавить префикс "m" (member), а после - писать название поля. Также обычно объявляют сначала паблик-секцию, потом протектед, а потом приват.
Еще - не понятны сразу два сеттера для ячейки в классе Боард, причём с разными возвращаемыми типами.
И, кстати, если ты в методе не изменяешь полей класса, то этот метод лучше всего сделать констовым, т.к. когда ты будешь работать с неизменяемым объектом (например, объявишь его как const Board * board), то ты не сможешь дернуть неконстовые методы.
Например, класс Боард я бы описал так:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Board
{
public:
    Board();
    Who_Win isWin(Who_Win prov);
    bool setCell(int set_x, int set_y, XO xo);
    void setCell();
    int getCell(int set_x, int set_y) const;
    Who_Win whoWinner();
 
private:
    int m_array[10][10];   // или mArray, как удобней
    Who_Win m_cell_win;  // или mCellWin
    static const int FIELD_SIZE=5;
};

4) В BoardView::PrintMap() есть свитч-кейс, так вот - всегда закрывай свитч-кейс дефолтом. Даже если уверен, что там только именно эти состояния, которые ты написал. Всегда добавляй дефолт. Потому что в будущем ты можешь расширить варианты значения проверяемого объекта, а свитч изменить забудешь. Или просто завтыкаешь, что иногда там может быть не 0, 1 или 2, а 845. Но это такое.


Это то, что на первый взгляд увидилось. Может что-то покажется тебе полезным и ты даже учтешь это =)
А вообще - молодец, что учишься и делаешь что-то.
Удачи.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
01.09.2013, 20:58     Оптимизация кода игры в крестики нолики. #3
Teplotexnik, обычно подход вида:
Код
function()
{
}
Применяют на С++, а на Java/C# :
Код
function(){
}
Конечно, как вам удобнее - так и делайте, но всё же большинство используют родные места скобок (выше привел примеры в кодах)
Teplotexnik
1 / 1 / 0
Регистрация: 31.08.2013
Сообщений: 25
02.09.2013, 01:55  [ТС]     Оптимизация кода игры в крестики нолики. #4
Спасибо x1Mike7x за советы, первые два пункта вообще не знал а третий и четвертый просто забыл. В любом случае спасибо за ответ.
Yandex
Объявления
02.09.2013, 01:55     Оптимизация кода игры в крестики нолики.
Ответ Создать тему
Опции темы

Текущее время: 20:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru