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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Van111
кодер с++
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
#1

любителям критики - C++

19.07.2013, 22:03. Просмотров 741. Ответов 19
Метки нет (Все метки)

AI_city.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
// ---------------------------------------------------------------------------
 
#ifndef AI_cityH
#define AI_cityH
 
#include <iostream>
#include <fstream>
#include <string>
#include <map>
#include <windows.h>
using namespace std;
static HANDLE hSTDOut = GetStdHandle(STD_OUTPUT_HANDLE);
inline char toupper_doc(unsigned char c) {
    return c < 16 * 13 ? c - 32 : c - 80; // борьба с кодировкой доса
}
// игрок
class Cplayer {
protected:
    string name;
 
public:
    Cplayer();
    ~Cplayer();
    void SetName(char * name_);
    char first();
    bool init(const char * name_file);
    virtual char stroke(char l);
    void win();
};
// игрок человек
class Chuman : public Cplayer {
protected:
    int life;
public:
    Chuman();    // присваивается количество жизней
    ~Chuman();
    virtual char stroke(char l); // игровой ход
};
// игрок компьютер
class Ccomputer : public Cplayer {
 
public:
    Ccomputer();
    ~Ccomputer();
    virtual char stroke(char l);   // игровой ход
 
};
 
// ---------------------------------------------------------------------------
#endif

AI_city.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
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
// ---------------------------------------------------------------------------
 
#pragma hdrstop
 
#include "AI_city.h"
 
static multimap<char, string>city;
static bool init_true;
 
////////////////////////////////// *Ўбва*Єв*л© Є«*бб ЁЈа®Є
Cplayer::Cplayer() {
}
 
Cplayer::~Cplayer() {
}
 
char Cplayer::stroke(char l) {
    return true;
}
 
void Cplayer::SetName(char * name_) {
    name = name_;
}
 
void Cplayer::win() {
    cout << "Ї®ЎҐ¤Ё« ЁЈа®Є : ";
    cout << name.c_str() << endl;
}
 
char Cplayer::first() { // выбор первого элемента в контейнере
    multimap<char, string>::iterator it = city.begin();
    cout << it->second.c_str() << endl << endl;
    char letter = it->second[it->second.size() - 1];
    letter = toupper_doc(letter); // преобразуем в верхний регистр
    city.erase(it); // данный город больше использовать нельзя
    return letter;
}
 
bool Cplayer::init(const char*name_file) {
    fstream file;
    string tmp_city;
    file.open(name_file, ios::in);
    if (file.good()) {
        while (!file.eof()) {
            getline(file, tmp_city);    // чтение города
            city.insert(pair<char, string>(tmp_city[0], tmp_city)); // запись города
        }
        return true;
    }
    return false;
}
////////////////////////////////// *Ўбва*Єв*л© Є«*бб ЁЈа®Є
 
///////////////////////////////// Є«*бб ЁЈа®Є* - 祫®ўҐЄ
Chuman::~Chuman() {
}
 
Chuman::Chuman() {
    life = 3; // жизни человека
}
 
char Chuman::stroke(char l) {
    SetConsoleTextAttribute(hSTDOut, FOREGROUND_GREEN);
 
    string command;
    unsigned char r;
    cout << "ЁЈа®Є : ";
    cout << name.c_str() << " ";
    cout << "®вўҐз*Ґв : ";
    cin >> command;     // запрос города
    r = command[command.size() - 1]; // установка последней буквы
 
    multimap<char, string>::iterator it = city.find(l);
 
    int count = city.count(l); // количество слов на заданную букву
    for (int i = 0; i < count; i++, it++) {
        if (it->second == command) {// проверим еслть ли слово игрока в списке
            city.erase(it); // данный город больше использовать нельзя
            cout << "б«Ґ¤гойЁ© Ј®а®¤ ¤®«¦Ґ* **зЁ**rвбп ** ЎгЄўг : ";
            r = toupper_doc(r);   // к верхнему регистру
            cout << r << endl << endl;
            return r;
        }
    }
    cout << "ЌҐв в*Є®Ј® б«®ў* «ЁЎ® ®*® 㦥 ЁбЇ®«м§®ў*«®бм " << endl;  //даём ещё шанс
    life--;
    if (life) {   // пока не кончатся  жизни
        cout << "“ ў*б ®бв*«®бм " << life << " ¦Ё§*Ґ©, " << "Ї®Їа®Ўг©вҐ Ґйс" <<
        endl;
        r = stroke(l);  // так мы можем судить об успехе рекурсии
        return r;
    }
    cout << "ЁЈа®Є " << name << " Їа®ЁЈа*«, ®* г¤*«с* Ё§ ЁЈал" << endl;  //нас удалили
    return 0;
 
}
///////////////////////////////// Є«*бб ЁЈа®Є* - 祫®ўҐЄ
 
///////////////////////////////// Є«*бб ЁЈа®Є* - Є®¬ЇмовҐа
char Ccomputer::stroke(char l) {
    SetConsoleTextAttribute(hSTDOut, FOREGROUND_GREEN | FOREGROUND_RED);
    unsigned char r;
    int count = city.count(l);
    if (count) { // компьютер знает город
        count = rand() % count;
        multimap<char, string>::iterator it = city.find(l);
        for (int i = 0; i < count; i++) // выберем случайный элемент на заданную букву
            it++;
 
        cout << "ЁЈа®Є : ";
        cout << name.c_str() << " ";
        cout << "®вўҐз*Ґв : "; // "игрок № отвечает "
 
        cout << it->second.c_str() << endl; // ответ
        cout << "б«Ґ¤гойЁ© Ј®а®¤ ¤®«¦Ґ* **зЁ**вбп ** ЎгЄўг : ";
        r = it->second[it->second.size() - 1]; // установка последней буквы
        r = toupper_doc(r); // преобразуем в верхний регистр
        cout << r << endl;
 
        city.erase(it); // данный город больше использовать нельзя
 
    }
    else { // компьютер не знает город
        SetConsoleTextAttribute(hSTDOut, FOREGROUND_RED);
        // устанавливаем красный режим
        cout << "ЁЈа®Є : ";
        cout << name.c_str();
        cout << " *Ґ §**Ґв **§ў**Ёп Ј®а®¤* ** ЎгЄўг ";
        cout << (char)(l);
        cout << " ®*  г¤*«с* Ё§ ЁЈал " << endl; // игрок выбыл
        r = 0; // код удаления
    }
    cout << endl;
    return r;
 
}
 
Ccomputer::Ccomputer() {
}
 
Ccomputer::~Ccomputer() {
}
///////////////////////////////// Є«*бб ЁЈа®Є* - Є®¬ЇмовҐа
// ---------------------------------------------------------------------------

main.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
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
// ---------------------------------------------------------------------------
#pragma hdrstop
#include <iostream>
 
#include <string>
#include "AI_city.h"
#include <direct.h>
#include <vector>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
 
using namespace std;
 
int main() {
 
    // установка параметров
    int human_player = 1;
    int computer_player = 3;
 
    for (int i = 0; i < 16; i++) {
        for (int j = 0; j < 16; j++)
            cout << char(i * 16 + j) << " ";
        cout << endl;
    }
 
    cout << "ўўҐ¤ЁвҐ Є®«ЁзҐбвў® ЁЈа®Є®ў - «о¤Ґ©" << endl;
    cin >> human_player;
    cout << "ўўҐ¤ЁвҐ Є®«ЁзҐбвў® ЁЈа®Є®ў - Є®¬ЇмовҐа®ў" << endl;
    cin >> computer_player;
    // // установка параметров
    // иницилизация
    char buffer[256];
    vector<Cplayer*>player;
 
    string patch_data = getcwd(buffer, 255);
    patch_data += "\\data\\words.txt";
    srand(time(0));
    /* for (int i = 0, c_c = computer_player, c_h = human_player, r;
    i < human_player + computer_player; i++) {
    r = rand() % 2;
    string name;
    char number[10];
    Cplayer *tmp_player_ptr;
    switch(r) { // формирование команды случайным образом
    case 0:
    if (c_h) { // если есть вакансии людей
    tmp_player_ptr = new Chuman;
    c_h--; // уменьшение вакансий человека
    name = "祫®ўҐЄ N ";
    itoa(human_player - c_h, number, 10); // формирование номера
    name += number; ; // присвоение номера
    tmp_player_ptr->SetName((char*)name.c_str());
    // присвоение имени
    }
    else {
    tmp_player_ptr = new Ccomputer;
    c_c--;
    name = "Є®¬ЇмовҐа N ";
    itoa(computer_player - c_c, number, 10);
    name += number; ;
    tmp_player_ptr->SetName((char*)name.c_str());
    }
    break;
    case 1:
    if (c_c) { // если есть вакансии компьютеров
    tmp_player_ptr = new Ccomputer;
    c_c--; // уменьшение вакансий компьютера
    name = "Є®¬ЇмовҐа N ";
    itoa(computer_player - c_c, number, 10);
    name += number; ;
    tmp_player_ptr->SetName((char*)name.c_str());
    }
    else {
    tmp_player_ptr = new Chuman;
    c_h--;
    name = "祫®ўҐЄ N ";
    itoa(human_player - c_h, number, 10); // формирование номера
    name += number; ; // присвоение номера
    tmp_player_ptr->SetName((char*)name.c_str());
    // присвоение имени
    }
    }
    player.push_back(tmp_player_ptr); // добавление игрока
    } */
    string name;
    char number[10];
    Cplayer *tmp_player_ptr;
    for (int i = 0, c_h = human_player; i < human_player; i++) {
 
        tmp_player_ptr = new Chuman;
        c_h--; // уменьшение вакансий человека
        name = "祫®ўҐЄ N ";
        itoa(human_player - c_h, number, 10); // формирование номера
        name += number; ; // присвоение номера
        tmp_player_ptr->SetName((char*)name.c_str()); // присвоение имени
        player.push_back(tmp_player_ptr); // добавление игрока
    }
 
    for (int i = 0, c_c = computer_player; i < computer_player; i++) {
        tmp_player_ptr = new Ccomputer;
        c_c--;
        name = "Є®¬ЇмовҐа N ";
        itoa(computer_player - c_c, number, 10);
        name += number; ;
        tmp_player_ptr->SetName((char*)name.c_str());
        player.push_back(tmp_player_ptr); // добавление игрока
    }
 
    for (int i = 0, r1, r2; i < (human_player + computer_player) / 2; i++) {
        r1 = rand() % player.size();
        r2 = rand() % player.size();
        Cplayer *tmp_player_ptr;
        tmp_player_ptr = player[r1];
        player[r1] = player[r2];
        player[r2] = tmp_player_ptr; // обмен
    }
    player[0]->init(patch_data.c_str()); // загрузка слов
    // иницилизация
 
    string command;
 
    cout << "**з*«® ЁЈал, ЇҐаўл© Ј®а®¤ : "; // начало игры
    unsigned char last_letter = player[0]->first();
    vector<Cplayer*>::iterator ip = player.begin();
    while (player.size() > 1) {
        if (ip == player.end())
            ip = player.begin(); // закольцевание
 
        last_letter = ip[0]->stroke(last_letter); // получение буквы на которую должно начинатся следующее слово
        SetConsoleTextAttribute(hSTDOut,
            FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
        // графический режим
        if (!last_letter) {
            delete ip._Myptr[0];
            player.erase(ip); // удаляем игрока
            cout << "®бв*«®бм ";
            cout << player.size();
            cout << " ЁЈа®Є®ў" << endl; // пишем сколько осталось игроков
            if (player.size() == 1)
                break;
            cout << "ўлЎ®а б«гз*©*®Ј® Ј®а®¤*, **§ў**ЁҐ Ј®а®¤* : ";
            last_letter = player[0]->first();
            Sleep(2000); // задерживаем время в случаи удаления игрока
        }
        else
            ip++;
    }
    player[0]->win(); // победа
 
    system("pause");
    return 0;
}
// ---------------------------------------------------------------------------

игра города на большое количество человекови и компьютеров (лижбы слов хватило!). Извиняюсь за Doc кодировку (работал в RAD)
формат данных
0
Вложения
Тип файла: rar words.rar (4.4 Кб, 8 просмотров)
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.07.2013, 22:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос любителям критики (C++):

Прошу критики класса "Список enum" - C++
Добрый день! Уважаемые программисты, прошу покритиковать данный участок кода. Задача: создать ограниченный список enum, который не...

Любителям головоломок! - Базы данных
Можно ли в запросе 'сгруппировать' числовое поле в текстовое, в котором через запятую будут перечислены все сгруппированные значения?

Любителям странного - Математика
http://www.cyberforum.ru/mathematics/thread1297774.html#post6843440 Вот такая как-бы несложная задачка. И с четкой формулировкой. И...

Вопрос к любителям DreamweaverMX - Web
уже два года я пользую DreamweaverMX, незачто не променяю на какой-нибудь другой редактор. Порядком подразобрался в настройках, отсюда и...

Любителям менять свой Windows - Windows
Кому надоело смотреть на стандартные кнопки : Да...Нет...Отмена эта программа меняет эти кнопки. можете сами написать название какое Вам...

Любителям открытых корпусов и торчащих проводов - Корпуса
А так же горизонтального размещения материнки. Специально для Люрка &quot;Ваш знакомый компьютерщик никогда не закрывает крышку...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.07.2013, 22:12 #2
первое замечание - почему формат архива проприетарный?

Добавлено через 45 секунд
Цитата Сообщение от Van111 Посмотреть сообщение
using namespace std;
в хедер файле так лучше не делать
1
Van111
кодер с++
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
19.07.2013, 22:14  [ТС] #3
Цитата Сообщение от Jupiter Посмотреть сообщение
в хедер файле так лучше не делать
а using namespace распространяется на файлы которые включает данный хейдер?
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.07.2013, 22:16 #4
Цитата Сообщение от Van111 Посмотреть сообщение
~Cplayer();
деструктор базового класса должен быть виртуальным если предполагается полиморфное использование, а наличие виртуальных функций как раз преполагает

Цитата Сообщение от Van111 Посмотреть сообщение
а using namespace распространяется на файлы которые включает данный хейдер?
да.

Добавлено через 1 минуту
Цитата Сообщение от Van111 Посмотреть сообщение
bool init(const char * name_file);
для чего этот метод? а что будет если я забуду его вызвать?
1
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
19.07.2013, 22:32 #5
Тут по каждой строчке можно выдать пачку критики... Поэтому влом.
По мелочам:
1. В .h можно смело убирать неиспользуемые непосредственно в нем заголовочные файлы - string, map, iostream...
2. Зачем повсеместные char*, когда есть std::string?
3. SetName у плеера очевидно должен быть частью конструктора.
4. Такое оформление кода тяжело читать.
1
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
19.07.2013, 22:41 #6
Цитата Сообщение от Van111 Посмотреть сообщение
C++
1
return c < 16 * 13 ? c - 32 : c - 80; // борьба с кодировкой доса
магические числа какие-то...
0
Van111
кодер с++
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
19.07.2013, 22:46  [ТС] #7
Цитата Сообщение от 0x10 Посмотреть сообщение
SetName у плеера очевидно должен быть частью конструктора.
не должен так как каждый элемент динамический
Цитата Сообщение от 0x10 Посмотреть сообщение
Такое оформление кода тяжело читать.
что конкретно тяжело?
Цитата Сообщение от 0x10 Посмотреть сообщение
В .h можно смело убирать неиспользуемые непосредственно в нем заголовочные файлы - string, map, iostream...
учту, string используется
Цитата Сообщение от 0x10 Посмотреть сообщение
Зачем повсеместные char*, когда есть std::string?
char не повсеместный, я использовал его потому, что из string проще сделать char* нежели наоборот
Цитата Сообщение от Jupiter Посмотреть сообщение
для чего этот метод? а что будет если я забуду его вызвать?
загружает города из файла, пожалуй надо завести статистическую переменную о загрузке и проверять в конструкторе загружены ли данные.

Добавлено через 1 минуту
Цитата Сообщение от gray_fox Посмотреть сообщение
магические числа какие-то...
согласен, откуда они берутся можно увидеть сделав вывод таблицы символов (16 на 16) (doc кодировка).
считаете лучше заменить их константами?
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
19.07.2013, 22:49 #8
Цитата Сообщение от Van111 Посмотреть сообщение
не должен так как каждый элемент динамический
Не понял мысли и как это связано с замечанием.
1
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
19.07.2013, 22:50 #9
Цитата Сообщение от Van111 Посмотреть сообщение
C++
1
2
3
char Cplayer::stroke(char l) { 
return true; 
}
и в чем смысл этой функции?)
1
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
19.07.2013, 22:52 #10
Цитата Сообщение от Van111 Посмотреть сообщение
string используется
В заголовочнике? Где? Не по глазам.
Upd: все, увидел - name. Ну и можно было смело принимать в функцию std::string& и присваивать name.

Цитата Сообщение от Van111 Посмотреть сообщение
char не повсеместный, я использовал его потому, что из string проще сделать char* нежели наоборот
Опять не понял мысли. Как и не вижу места, где жизненно был бы необходим char*.
1
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
20.07.2013, 00:45 #11
C++
1
cout << name.c_str() << endl;
std::string как бэ можно выводить в поток напрямую.
C++
1
2
3
4
5
Cplayer::Cplayer() {
}
 
Cplayer::~Cplayer() {
}
Зачем их вообще писать, раз они пустые? Засоряет код.
C++
1
2
3
Chuman::Chuman() {
    life = 3; // жизни человека
}
Лучше использовать список инициализации. Лучше определить данный метод прямо в классе.
C++
1
city.erase(it); // данный город больше использовать нельзя
В цикле удалять содержимое мапы ТАК не стоит, ибо http://en.cppreference.com/w/cpp/con...multimap/erase
References and iterators to the erased elements are invalidated.
1
Van111
кодер с++
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
20.07.2013, 12:48  [ТС] #12
Цитата Сообщение от BigLow Посмотреть сообщение
и в чем смысл этой функции?)
на стадии разработки её случайно написал, удалю.

Добавлено через 7 минут
Цитата Сообщение от ForEveR Посмотреть сообщение
В цикле удалять содержимое мапы ТАК не стоит, ибо
C++
1
2
for (int i = 0; i < count; i++) // выберем случайный элемент на заданную букву
            it++;
я не в цикле удаляю , к циклу относится только одно выражение

всем спасибо, буду исправлять

Добавлено через 25 минут
Цитата Сообщение от ForEveR Посмотреть сообщение
city.erase(it); // данный город больше использовать нельзя
я посмотрел не из того метода, да это выражение используется в цикле, но ведь цикл сразу прекращается после удаления, и даже при работе рекурсии если произошло удаление слова, больше ничего из МАПа не удалится

Добавлено через 12 минут
переделал
main.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
// ---------------------------------------------------------------------------
#pragma hdrstop
#include <iostream>
 
#include <string>
#include "AI_city.h"
#include <direct.h>
#include <vector>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
 
using namespace std;
 
int main() {
 
    // установка параметров
    int human_player = 1;
    int computer_player = 3;
 
    for (int i = 0; i < 16; i++) {
        for (int j = 0; j < 16; j++)
            cout << char(i * 16 + j) << " ";
        cout << endl;
    }
 
    cout << "ўўҐ¤ЁвҐ Є®«ЁзҐбвў® ЁЈа®Є®ў - «о¤Ґ©" << endl;
    cin >> human_player;
    cout << "ўўҐ¤ЁвҐ Є®«ЁзҐбвў® ЁЈа®Є®ў - Є®¬ЇмовҐа®ў" << endl;
    cin >> computer_player;
    // // установка параметров
    // иницилизация
    char buffer[256];
    vector<Cplayer*>player;
 
    string patch_data = getcwd(buffer, 255);
    patch_data += "\\data\\words.txt";
    srand(time(0));
 
    string name;
    char number[10];
    Cplayer *tmp_player_ptr;
    for (int i = 0, c_h = human_player; i < human_player; i++) {
 
        tmp_player_ptr = new Chuman;
        c_h--; // уменьшение вакансий человека
        name = "祫®ўҐЄ N ";
        itoa(human_player - c_h, number, 10); // формирование номера
        name += number; ; // присвоение номера
        tmp_player_ptr->SetName((char*)name.c_str()); // присвоение имени
        player.push_back(tmp_player_ptr); // добавление игрока
    }
 
    for (int i = 0, c_c = computer_player; i < computer_player; i++) {
        tmp_player_ptr = new Ccomputer;
        c_c--;
        name = "Є®¬ЇмовҐа N ";
        itoa(computer_player - c_c, number, 10);
        name += number; ;
        tmp_player_ptr->SetName((char*)name.c_str());
        player.push_back(tmp_player_ptr); // добавление игрока
    }
 
    for (int i = 0, r1, r2; i < (human_player + computer_player) / 2; i++) {
        r1 = rand() % player.size();
        r2 = rand() % player.size();
        Cplayer *tmp_player_ptr;
        tmp_player_ptr = player[r1];
        player[r1] = player[r2];
        player[r2] = tmp_player_ptr; // обмен
    }
    player[0]->init(patch_data); // загрузка слов
    // иницилизация
 
    string command;
 
    cout << "**з*«® ЁЈал, ЇҐаўл© Ј®а®¤ : "; // начало игры
    unsigned char last_letter = player[0]->first();
    vector<Cplayer*>::iterator ip = player.begin();
    while (player.size() > 1) {
        if (ip == player.end())
            ip = player.begin(); // закольцевание
 
        last_letter = ip[0]->stroke(last_letter); // получение буквы на которую должно начинатся следующее слово
        SetConsoleTextAttribute(hSTDOut,
            FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
        // графический режим
        if (!last_letter) {
            delete ip._Myptr[0];
            player.erase(ip); // удаляем игрока
            cout << "®бв*«®бм ";
            cout << player.size();
            cout << " ЁЈа®Є®ў" << endl; // пишем сколько осталось игроков
            if (player.size() == 1)
                break;
            cout << "ўлЎ®а б«гз*©*®Ј® Ј®а®¤*, **§ў**ЁҐ Ј®а®¤* : ";
            last_letter = player[0]->first();
            Sleep(2000); // задерживаем время в случаи удаления игрока
        }
        else
            ip++;
    }
    player[0]->win(); // победа
 
    system("pause");
    return 0;
}
// ---------------------------------------------------------------------------

AI_city.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
// ---------------------------------------------------------------------------
 
#ifndef AI_cityH
#define AI_cityH
 
 
#include <string>
#include <windows.h>
using std::string;
 
static HANDLE hSTDOut = GetStdHandle(STD_OUTPUT_HANDLE);
inline char toupper_doc(unsigned char c) {
    return c < 16 * 13 ? c - 32 : c - 80; // борьба с кодировкой доса
}
// после 13 ряда (по 16 символов в каждом) у нас вместо продолжение строчных русских букв идёт абракадабра
//абракадабра продолжается три ряда, далее идут остальные строчные русские бувы
// растояния между одной группой строчных букв до заглавных равно $ - 32 (2 ряда)
// растояния между второй группой строчных букв до заглавных равно $ - 80 (2 + 3 ряда)
// знак "$" позаимствовал у ассемблера, он означает текущий адресс на который указывает IP
// игрок
class Cplayer {
protected:
    string name;
 
public:
    Cplayer(){}
    virtual ~Cplayer(){}
    void SetName(string name_);
    char first();
    bool init(string name_file);
    virtual char stroke(char l){return true;}// возвращаю значение дабы избежать предупреждения
    void win();
};
// игрок человек
class Chuman : public Cplayer {
protected:
    int life;
public:
    Chuman();    // присваивается количество жизней
    virtual ~Chuman(){}
    virtual char stroke(char l); // игровой ход
};
// игрок компьютер
class Ccomputer : public Cplayer {
 
public:
    Ccomputer(){}
    virtual ~Ccomputer(){}
    virtual char stroke(char l);   // игровой ход
 
};
 
// ---------------------------------------------------------------------------
#endif

AI_city.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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// ---------------------------------------------------------------------------
 
#pragma hdrstop
#include <string>
#include <map>
#include <iostream>
#include <fstream>
 
#include "AI_city.h"
 
using namespace std;
 
static multimap<char, string>city;
static bool init_true;
 
void Cplayer::SetName(string name_) { // установка имени игрока
    name = name_;
}
 
void Cplayer::win() {
    cout << "Ї®ЎҐ¤Ё« ЁЈа®Є : ";
    cout << name.c_str() << endl;
}
 
char Cplayer::first() { // выбор первого элемента в контейнере
    multimap<char, string>::iterator it = city.begin();
    cout << it->second.c_str() << endl << endl;
    char letter = it->second[it->second.size() - 1];
    letter = toupper_doc(letter); // преобразуем в верхний регистр
    city.erase(it); // данный город больше использовать нельзя
    return letter;
}
 
bool Cplayer::init(string name_file) { // загрузка слов
    fstream file;
    string tmp_city;
    file.open(name_file.c_str(), ios::in); // мой компилятор не хочут чтобы функция open принимала переменную типа string
    if (file.good()) {
        while (!file.eof()) {
            getline(file, tmp_city); // чтение города
            city.insert(pair<char, string>(tmp_city[0], tmp_city));
            // запись города
        }
        return true;
    }
    return false;
}
 
Chuman::Chuman() {
    life = 3; // жизни человека
}
 
char Chuman::stroke(char l) {  // ход человека
    SetConsoleTextAttribute(hSTDOut, FOREGROUND_GREEN);
 
    string command;
    unsigned char r;
    cout << "ЁЈа®Є : ";
    cout << name.c_str() << " ";
    cout << "®вўҐз*Ґв : ";
    cin >> command; // запрос города
    r = command[command.size() - 1]; // установка последней буквы
 
    multimap<char, string>::iterator it = city.find(l);
 
    int count = city.count(l); // количество слов на заданную букву
    for (int i = 0; i < count; i++, it++) {
        if (it->second == command) { // проверим еслть ли слово игрока в списке
            city.erase(it); // данный город больше использовать нельзя
            cout << "б«Ґ¤гойЁ© Ј®а®¤ ¤®«¦Ґ* **зЁ**rвбп ** ЎгЄўг : ";
            r = toupper_doc(r); // к верхнему регистру
            cout << r << endl << endl;
            return r;
        }
    }
    cout << "ЌҐв в*Є®Ј® б«®ў* «ЁЎ® ®*® 㦥 ЁбЇ®«м§®ў*«®бм " << endl;
    // даём ещё шанс
    life--;
    if (life) { // пока не кончатся  жизни
        cout << "“ ў*б ®бв*«®бм " << life << " ¦Ё§*Ґ©, " << "Ї®Їа®Ўг©вҐ Ґйс" <<
        endl;
        r = stroke(l); // так мы можем судить об успехе рекурсии
        return r;
    }
    cout << "ЁЈа®Є " << name << " Їа®ЁЈа*«, ®* г¤*«с* Ё§ ЁЈал" << endl;
    // нас удалили
    return 0;
 
}
 
char Ccomputer::stroke(char l) {  // ход компьютера
    SetConsoleTextAttribute(hSTDOut, FOREGROUND_GREEN | FOREGROUND_RED);
    unsigned char r;
    int count = city.count(l);
    if (count) { // компьютер знает город
        count = rand() % count;
        multimap<char, string>::iterator it = city.find(l);
        for (int i = 0; i < count; i++) // выберем случайный элемент на заданную букву
            it++;
 
        cout << "ЁЈа®Є : ";
        cout << name.c_str() << " ";
        cout << "®вўҐз*Ґв : "; // "игрок № отвечает "
 
        cout << it->second.c_str() << endl; // ответ
        cout << "б«Ґ¤гойЁ© Ј®а®¤ ¤®«¦Ґ* **зЁ**вбп ** ЎгЄўг : ";
        r = it->second[it->second.size() - 1]; // установка последней буквы
        r = toupper_doc(r); // преобразуем в верхний регистр
        cout << r << endl;
 
        city.erase(it); // данный город больше использовать нельзя
 
    }
    else { // компьютер не знает город
        SetConsoleTextAttribute(hSTDOut, FOREGROUND_RED);
        // устанавливаем красный режим
        cout << "ЁЈа®Є : ";
        cout << name.c_str();
        cout << " *Ґ §**Ґв **§ў**Ёп Ј®а®¤* ** ЎгЄўг ";
        cout << (char)(l);
        cout << " ®*  г¤*«с* Ё§ ЁЈал " << endl; // игрок выбыл
        r = 0; // код удаления
    }
    cout << endl;
    return r;
 
}
 
// --------------------------------------------------------------------------
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
20.07.2013, 13:02 #13
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Van111, Cplayer::stroke будет когда-нибудь вызываться? Мб вместо заглушки return true правильнее будет метод сделать чисто виртуальным?

Добавлено через 2 минуты
void Cplayer::SetName(string name_) -> void Cplayer::SetName(const string& name_)
Бывают игроки без имени вообще?

Добавлено через 3 минуты
Глобальная переменная с городами, которую заполняет игрок из файла - ну совсем нелогично.
Была бы отдельная сущность - список городов, указателем на которую владеет каждый игрок, например.

Добавлено через 1 минуту
Далее - не нравится, что ввод-вывод перемешан с логикой. Разнести бы все по разным частям.
1
bgm123
39 / 39 / 16
Регистрация: 29.01.2013
Сообщений: 277
20.07.2013, 13:19 #14
Цитата Сообщение от Jupiter Посмотреть сообщение
в хедер файле так лучше не делать
Почему?
0
Van111
кодер с++
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
20.07.2013, 13:25  [ТС] #15
Цитата Сообщение от 0x10 Посмотреть сообщение
void Cplayer::SetName(string name_) -> void Cplayer::SetName(const string& name_)
заменил

далее изменил
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Cplayer::Cplayer() {
    if (!init_true) {
        char buffer[256];
        string patch_data = getcwd(buffer, 255);
        patch_data += "\\data\\words.txt";
        init(patch_data);
        init_true = true;
    }
}
Chuman::Chuman() {
    life = 3; // жизни человека
    Cplayer::Cplayer();
}
 
Ccomputer::Ccomputer() {
    Cplayer::Cplayer();
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2013, 13:25
Привет! Вот еще темы с ответами:

Чайник жаждет критики - Web-дизайн
Прогаммирую в облаcти WEB недавно... Буду очень признателен за подсказки и критику этих работ особенно в плане дизайна.. ссылка...

Ищу критики по сборке - Домашний компьютер
http://www.citilink.ru/configurator/q3274911/ + думаю монитор взять http://www.citilink.ru/catalog/computer_peripherals/monitors/719285/ ...

Прошу вашей критики - HTML, CSS
Народ, всем привет, в общем я только начал изучать верстку. Взял шаблон вот тут: Хотел сделать резиновую верстку, но остановился...

Прошу критики и рекомендаций - MS Access
Уважаемые форумчане! Выношу на ваш суд свою БД. Раньше я никогда не занималась созданием баз, но рискнула взять на себя такую...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.07.2013, 13:25
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru