Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/64: Рейтинг темы: голосов - 64, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 24.05.2014
Сообщений: 15
1

Игра "Города" в С++

27.05.2015, 01:13. Показов 12131. Ответов 8
Метки нет (Все метки)

Здравствуйте) Не так давно мне понадобилось написать написать кое-что, аналогичное игре "Города". Код частично скопипасченый, но я его знаю. Проблема в том, что правильность считываемых городов из файла проверяется, и несмотря на то, что файл есть и в нём есть города, мне выдаёт "Город не обнаружен". Подскажите пожалуйста, в чём ошибка?

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
// Goroda.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <stdio.h>
#include <string>
#include <locale>
#include <iostream>
#include <stdlib.h>
#include <iomanip>
#include <vector>
using namespace std;
 
#define _CRT_SECURE_NO_WARNINGS
 
 
struct city {// структура под города пользователя
    char *gorod;
    bool used;
    city(const char* g, bool u) {
        if (g == NULL || strlen(g) == 0)
            cout << "Не верно введен город!\n";
        else {
            gorod = new char[strlen(g) + 1];
            strcpy(gorod, g);
            gorod[strlen(gorod)] = 0;
            used = u;
        }
    }
    ~city() {
        if (gorod != NULL) delete[] gorod;
    }
 
};
 
int FileRead(char* fileName, vector <city*> &vse_goroda) {
    FILE* f;//для хранения всех городов
    f = fopen(fileName, "r"); // FILE -- тип переменной "Файл". fopen -- функция открытия файла для чтения ("r"), перезаписи ("w"),
    if (f == NULL)
    {
        cout << "Файл не найден " << fileName << endl;
        return 0;
    }
    else {
        char* bufCity = new char[50];
        while (fscanf(f, "%s ", bufCity) == 1) {
            vse_goroda.push_back(new city(bufCity, false));
        }
        delete[] bufCity;
    }
    fclose(f);// Закрываем файл.
    return 0;
};
 
bool provCity(char* userCity, vector <city*> &vse_goroda){
    bool znach = false;
    for (int i = 0; i < vse_goroda.size(); i++)
    {
        if (strcmp(vse_goroda.at(i)->gorod, userCity) == 0 && !vse_goroda.at(i)->used)
        {
            vse_goroda.at(i)->used = true;
            znach = true;
            break;
        }
    }
    return znach;
}
 
char posl_Symvol(char* userCity, vector <city*> &vse_goroda)
{
    char symvol_pos = 0;
    for (int i = 0; i<strlen(userCity); i++)//возвращает кол-во симвлов в массиве если выполнится оператор sizeof(string), ответ будет 100, а если — функция strlen(string), ответ 6.
    {
        symvol_pos = userCity[strlen(userCity) - 1];//проверяем посл букву слова пользователя
 
        if (symvol_pos == 'ь' || symvol_pos == 'ы' || symvol_pos == 'й' || symvol_pos == 'ъ')
        {
            symvol_pos = userCity[strlen(userCity) - 2];
        }
    }
    return symvol_pos;
}
 
 
char* findCity_firstSymbol(char symvol_per, vector <city*> &vse_goroda) {
    char* res = 0;
    char symvol_perBig = toupper((unsigned char)symvol_per);
    for (int i = 0; i<vse_goroda.size(); i++)//возвращает количество элементов в векторе, перебираем все города вектора
    {
        if ((vse_goroda.at(i)->gorod[0] == symvol_perBig) && !vse_goroda.at(i)->used)
        {
            vse_goroda.at(i)->used = true;
            res = vse_goroda.at(i)->gorod;
            break;
        }
    }
    return res;
}
 
int main() {
    setlocale(LC_ALL, "Russian");// включаем в консоли русский язык
 
    vector <city*> vse_goroda;
    char* userCity = new char[255];
    char symvol_pos = 0;
    char symvol_per = 0;
    bool znach;
    string lastWord = "";
    char* fileName = "D:\\goroda.txt";// строка для хранения имени файла 
    FileRead(fileName, vse_goroda);
    char* compCity;
    printf("Пожалуйста, введите город: \n");
    while (true)
    {
        scanf("%s", userCity);// считывание города пользователя
        if (provCity(userCity, vse_goroda) == true)
        {
            symvol_pos = posl_Symvol(userCity, vse_goroda);// ход компьютера
            compCity = findCity_firstSymbol(symvol_pos, vse_goroda);
            if (compCity != 0)
            {
                cout << compCity << "\nВаш ход!" << endl;
            }
            else
            {
                cout << "Вы выиграли!" << endl;
                system("pause");
                break;
            }
        }
        else cout << "Такого города нет или его уже называли!" << endl;
    }
    cin.get();
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.05.2015, 01:13
Ответы с готовыми решениями:

Проверка корректности введенного города игра "Города"
Здравствуйте, пишу программку &quot;Города&quot;, т.е. пользователь называет какой-нибудь город, допустим,...

Решить задачу на файловый ввод/вывод (игра "Города")
Не могу понять задачу и решить её на Си!!! Срочно! Дело в том что я сейчас на зачёте, и мне...

Игра "Города" по сети
Как сделать игру &quot;Города&quot; по сети? нужа начинка которая проверяет правильность слова с формы.

Игра "Города"
Очень нужна игра &quot;в города&quot;, на сях написанная. сам в программировании не силен. с меня небольшое...

8
68 / 67 / 59
Регистрация: 14.07.2013
Сообщений: 251
27.05.2015, 02:56 2
Проблема в том что у вас в scanf("%s", userCity);// считывание города пользователя записывается кракозябры а не русские буквы. В консоли они отображаются нормально, но вот внутри программы обрабатываются неправильно

Добавлено через 29 минут
#include <windows.h>
в мейне SetConsoleOutputCP(1251);
SetConsoleCP(1251);
в консоле по рамке окна кликаем правой кнопкой мыши, вкладка шрифты, выбираем Lucid Console. А это убираем setlocale(LC_ALL, "Russian");// включаем в консоли русский язык
0
0 / 0 / 0
Регистрация: 24.05.2014
Сообщений: 15
27.05.2015, 10:08  [ТС] 3
Теперь отображаются кракозябры в консоли как при вводе так и при выводе, а программа выдаёт: вы выиграли, т.е. она не знает слова, начинающегося с последнего символа

Добавлено через 4 минуты
нет, это я просто не включил шрифт который вы сказали включить, извините
но всё-таки программа, когда я ввожу город, выдаёт что такого города нет или его уже называли...
быть может проблема со считыванием из файла...
0
68 / 67 / 59
Регистрация: 14.07.2013
Сообщений: 251
27.05.2015, 10:13 4
Возможно, я запустил вашу прогу. В файле у меня было написано:
Москва
Алмата
Алушта
При вводе Москва, мне прога написала вы выиграли
0
0 / 0 / 0
Регистрация: 24.05.2014
Сообщений: 15
27.05.2015, 10:16  [ТС] 5
Я немного поправил, теперь программа выдаёт: вы выиграли, т.е. она не знает слова, начинающегося с последнего символа
Похоже таки что-то со считыванием из файла в массив

Добавлено через 43 секунды
Да, именно так. Сейчас буду думать
0
68 / 67 / 59
Регистрация: 14.07.2013
Сообщений: 251
27.05.2015, 10:30 6
toupper Проверьте эту функцию, я не думаю что она может русские символы переводить в заглавные
0
0 / 0 / 0
Регистрация: 24.05.2014
Сообщений: 15
27.05.2015, 10:37  [ТС] 7
Да, точно! Я попробовал ввести города в файле с маленькой буквы, и в консоли так же, и игра пошла. Отлично, супер, спасибо! Проблема найдена, осталось её решить
0
68 / 67 / 59
Регистрация: 14.07.2013
Сообщений: 251
27.05.2015, 10:37 8
char symvol_perBig = symvol_per - 32; Вот так все теперь работает
0
0 / 0 / 0
Регистрация: 24.05.2014
Сообщений: 15
27.05.2015, 10:40  [ТС] 9
Да, Вы лучший) Спасибо Вам огромное)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.05.2015, 10:40

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;,...

Консольная "графика", игра "Тетрис". Фигуры перестают прорисовываться на определенном этапе
Доброго времени! Написал на днях тетрис (в консоле) с использованием, кажется это называется...

"Крестики-нолики": проверить, закончена ли игра выигрышем "крестиков"
Клеточное поле размером 5х5 является результатом игры в крестики-нолики. проверить, закончена игра...

Для каждой строки найти слова, которые не имеют ни одного из букв: "l", "k", "r", "s" i "j"
Задано символьные строки. Строка состоит из нескольких слов (наборов символов), которые разделяются...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru