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

крестики-нолики, морской бой, карты... - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 38, средняя оценка - 4.92
NatasheJkeeenatashka
0 / 0 / 0
Регистрация: 03.05.2009
Сообщений: 25
21.05.2009, 16:32     крестики-нолики, морской бой, карты... #1
нужно написать на си++ какую нибудь игру, типа крестики-нолики, морсой бой, карты... ну в этом роде. Все программы, которые находила в интернете, не работают чота ((
может у каво нибудь было уже такое задание, напишите пожалуйста, и если есть, то с комментариями))
БУДУ ОЧЕНЬ БЛАГОДАРНА ! заранее спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2009, 16:32     крестики-нолики, морской бой, карты...
Посмотрите здесь:

Морской бой C++
Морской бой C++
C++ Морской бой в С
C++ Морской Бой
C++ Морской бой=)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Бартимеус
 Аватар для Бартимеус
181 / 33 / 2
Регистрация: 29.10.2008
Сообщений: 283
21.05.2009, 19:30     крестики-нолики, морской бой, карты... #2
воспользуйся поиском, я писал эту программу и выкладывал код
NatasheJkeeenatashka
0 / 0 / 0
Регистрация: 03.05.2009
Сообщений: 25
21.05.2009, 19:45  [ТС]     крестики-нолики, морской бой, карты... #3
а ссылки нету? я искала, не работает ни одна программа (
Бартимеус
 Аватар для Бартимеус
181 / 33 / 2
Регистрация: 29.10.2008
Сообщений: 283
22.05.2009, 15:21     крестики-нолики, морской бой, карты... #4
Морской бой
NatasheJkeeenatashka
0 / 0 / 0
Регистрация: 03.05.2009
Сообщений: 25
24.05.2009, 12:23  [ТС]     крестики-нолики, морской бой, карты... #5
а как сделать чтобы ето работало ? как в одну программу записать ?
Бартимеус
 Аватар для Бартимеус
181 / 33 / 2
Регистрация: 29.10.2008
Сообщений: 283
28.05.2009, 18:11     крестики-нолики, морской бой, карты... #6
новый проект создай)
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
28.05.2009, 18:26     крестики-нолики, морской бой, карты... #7
Если хоть иногда читать книги то там можно найти примеры игр.
вот хрестики нолики
The_Game_XO.h
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
#ifndef The_Game_XO_h__
#define The_Game_XO_h__
 
 
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <stack>
#include <numeric>
 
const int       InitWeight      = 100;  // начальный вес.
const int       PrecCoeff       = 50;   // точность генератора случайных чисел.
const double    StepCoeff       = 0.65; // коэффициент обучения.
const int       LearningStep    = 20;   // шаг обучения.
 
char GameField[9];                      // Игровое поле.
 
enum OUTCOME { Xs, Os, DRAW, UNFINISHED };
 
struct TField
{
    char Field[9];
 
    TField(){ std::copy( GameField, GameField + 9, Field ); }
 
    bool operator < ( const TField &rhs ) const
    {
        return std::lexicographical_compare( Field, Field + 9, rhs.Field, rhs.Field + 9 );
    }
};
 
struct TWeight
{
    int Weight[9];
 
    TWeight() { std::fill( Weight, Weight + 9, InitWeight ); }
};
 
class Player
{
public:
    Player( char _symbol ) : Symbol( _symbol ) {}
    
    virtual void MakeMove() = 0;
    virtual void Learn( int ) {}
protected:
    char Symbol;
};
 
class HumanPlayer: public Player
{
public:
    HumanPlayer( char _symbol ) : Player( _symbol ) {}
 
    virtual void MakeMove()
    {
        int Cell;
        std::cout << "Input Position: ";
        std::cin >> Cell;
        GameField[Cell] = Symbol;
    }
};
 
class RandomPlayer: public Player
{
public:
    RandomPlayer( char _symbol ): Player( _symbol ) {}
    
    virtual void MakeMove()
    {
        std::vector<int> v;
 
        for(int i = 0; i < 9; ++i)
        {
            if( GameField[i] == ' ')
                v.push_back(i);
        }
 
        GameField[ v[rand()%v.size()] ] = Symbol;
    }
};
 
class SmartPlayer: public Player
{
public:
    SmartPlayer( char _sumbol ): Player( _sumbol ) {}
 
    virtual void MakeMove();
    void Learn( int );
private:
    struct HistoryElement
    {
        std::map<TField, TWeight>::iterator Situation;
        int Move;
        HistoryElement( std::map<TField, TWeight>::iterator s, int m)
            : Situation(s), Move(m) {}
    };
 
    std::stack<HistoryElement> History;
    std::map<TField, TWeight> Database;
 
    std::map<TField, TWeight>::iterator GetSituation();
    int GetRandom(std::map<TField, TWeight>::iterator s);
};
 
std::map<TField, TWeight>::iterator SmartPlayer::GetSituation()
{
    std::map<TField, TWeight>::iterator p = Database.find(TField());
 
    if(p == Database.end())
    {
        TWeight w;
 
        for(int i = 0; i < 9; ++i)
        {
            if( GameField[i] != ' ')
                w.Weight[i] = 0;
        }
 
        Database[TField()] = w;
        return Database.find(TField());
    }
 
    return p;
}
 
int SmartPlayer::GetRandom(std::map<TField, TWeight>::iterator s)
{
    int sum = std::accumulate( s->second.Weight, s->second.Weight + 9, 0 );
 
    if( !sum )
        return std::find( GameField, GameField + 9, ' ') - GameField;
 
    std::vector<int> coords;
 
    for(int i = 0; i < 9; ++i)
        std::fill_n( std::back_inserter(coords), PrecCoeff * s->second.Weight[i] / sum, i);
 
    return coords[ rand()%coords.size() ];
 
}
 
void SmartPlayer::Learn( int Step )
{
    if( History.empty() )
        return;
 
    HistoryElement h = History.top();
    History.pop();
 
    TWeight &w = h.Situation->second;
 
    w.Weight[h.Move] += Step;
    if(w.Weight[h.Move] < 0)
        w.Weight[h.Move] = 0;
 
    Learn(Step * StepCoeff);
}
 
void SmartPlayer::MakeMove()
{
    std::map<TField, TWeight>::iterator s = GetSituation();
 
    int move = GetRandom(s);
    GameField[move] = Symbol;
    History.push(HistoryElement(s,move));
}
OUTCOME GetOutCome()
{
    int v[8][3] = { {0,1,2}, {3,4,5}, {6,7,8}, {0,3,6},
                    {1,4,7}, {2,5,8}, {0,4,8}, {2,4,6} };
 
    for(int i = 0; i < 8; ++i)
    {
        if( GameField[ v[i][0] ] == GameField[ v[i][1] ] &&
            GameField[ v[i][0] ] == GameField[ v[i][2] ] &&
            GameField[ v[i][0] ] != ' ' )
            return GameField[ v[i][0] ] == 'x' ? Xs : Os;
    }
 
    return ( std::find(GameField, GameField + 9, ' ') == GameField + 9 )
                                                    ? DRAW : UNFINISHED;
}
 
void PrintField()
{
    system("cls");
    std::cout << GameField[0] << '|' << GameField[1] << '|' << GameField[2] << std::endl;
    std::cout << GameField[3] << '|' << GameField[4] << '|' << GameField[5] << std::endl;
    std::cout << GameField[6] << '|' << GameField[7] << '|' << GameField[8] << std::endl;
    std::cout << std::endl;
}
 
 
 
void PlayGame(Player *Xp, Player *Op, bool Verbose)
{
    Player *Cp[] = { Xp, Op };
    int move = 0;
    std::fill( GameField, GameField + 9, ' ');
 
    while( GetOutCome() == UNFINISHED )
    {
        Cp[move++ % 2]->MakeMove();
        if(Verbose)
            PrintField();
    }
 
    if( GetOutCome() == Xs )
    {
        Xp->Learn(LearningStep);
        Op->Learn(-LearningStep);
    }else if( GetOutCome() == Os )
    {
        Xp->Learn(-LearningStep);
        Op->Learn(LearningStep);
    }
}
 
#endif // The_Game_XO_h__


main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "The_Game_XO.h"
using namespace std;
 
int main()
{
 
    RandomPlayer *r = new RandomPlayer('o');
    HumanPlayer *h = new HumanPlayer('o');
    SmartPlayer *s = new SmartPlayer('x');
 
    for (int i = 0; i < 10000; ++i)
        PlayGame(s,r,false);
 
    PlayGame(s,h, true);
    system("pause");
    return 0;
}
АИ самообучающийся.
Manifik
 Аватар для Manifik
8 / 8 / 1
Регистрация: 13.05.2009
Сообщений: 31
02.06.2009, 22:31     крестики-нолики, морской бой, карты... #8
ISergey, а можно с более подробным комментарием?
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
02.06.2009, 22:40     крестики-нолики, морской бой, карты... #9
Цитата Сообщение от Manifik Посмотреть сообщение
а можно с более подробным комментарием?
Можно.
ищем книгу C++ Мастер-класс. 85 нетривиальных проектов, решений и задач.
там смотрим с полным описанием и комментариями.
Бартимеус
 Аватар для Бартимеус
181 / 33 / 2
Регистрация: 29.10.2008
Сообщений: 283
03.06.2009, 19:39     крестики-нолики, морской бой, карты... #10
ISergey, а можно проити по ссылке и прокоментировать мой код, указывая все мои недочеты и помочь исправить по возможности? а то утонула тема
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
03.06.2009, 19:57     крестики-нолики, морской бой, карты... #11
Цитата Сообщение от Бартимеус Посмотреть сообщение
ISergey, а можно проити по ссылке и прокоментировать мой код, указывая все мои недочеты и помочь исправить по возможности? а то утонула тема
Где то на выходных посмотрю и прокомментирую.
Сейчас ни времени ни желания.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.04.2012, 23:00     крестики-нолики, морской бой, карты...
Еще ссылки по теме:

C++ Морской бой
C++ Морской бой C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
sve-tanya
0 / 0 / 0
Регистрация: 25.02.2012
Сообщений: 10
16.04.2012, 23:00     крестики-нолики, морской бой, карты... #12
А что у вас получилось в результате?
Yandex
Объявления
16.04.2012, 23:00     крестики-нолики, морской бой, карты...
Ответ Создать тему
Опции темы

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