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

Игра "Угадай число" - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.60
SmiThUa
0 / 0 / 0
Регистрация: 15.10.2009
Сообщений: 8
18.04.2010, 13:37     Игра "Угадай число" #1
Нужно доделать код программы... (Желательно до 24-го числа.. но можно и позже)

Задание:
напишите программу, которая будет уметь играть (за кого-либо из игроков) в такую игру. Один игрок загадывает натуральное число от 1 до N, другой должен его угадать, задавая вопрос вида "Это число ...?" и получая один из ответов "да", "загаданное число больше" или "загаданное число меньше. Программа должна играть оптимально (угадывать за наименьшее количество вопросов, то есть нужно применить бинарный поиск. Программа должна работать правильно, независимо от того, оптимальным образом ставит вопрос игрок-человек дал ссуперечни ответа (например, один раз сказал, что число больше 100, а через несколько ходов - что меньше 101), программа должна подробно об этом рассказать.

Вот мои наработки, но тут не все предусмотрено..

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
#include <iostream>
#include <time.h>
 
using namespace std;
 
int main()
{
    srand(time(NULL));
    int number = rand() % 100 + 1;
    int num;
    int points = 10;
    cout << "I know a number (1..100)" << endl;
m1:
    cout << "Enter this number: ";
    cin >> num;
    if (num == number)
    {
        cout << "You are WINNER!!! You have "
            << points << " points!" << endl;
        goto m2;
    }
    else
    {
        if (num < number)
            cout << "Your number is too small("
            << points << " points)" << endl;
        else
            cout << "Your number is too big("
            << points << " points)" << endl;
}
    if (points == 0)
    {
        cout << "You are loser..." << endl;
        goto m2;
    }
    goto m1;
m2:
    system("PAUSE");
    return 0;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2010, 13:37     Игра "Угадай число"
Посмотрите здесь:

Игра "Угадай число" C++
Game "Угадай число" как зделать запрет на "букви" ???? C++
C++ Игра "Угадай число"!
Игра "Угадай слова" через массивы! C++
C++ Игра "Угадай число"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,694
18.04.2010, 13:41     Игра "Угадай число" #2
Первое же замечание, старайтесь не использовать оператор goto.
Ведь, всегда можно вместо него воспользоваться, к примеру, break/continue, или чем-то еще.
Когда вернусь домой, напишу вам без goto, если меня никто не опередит.
broDiaga_cpp
 Аватар для broDiaga_cpp
19 / 9 / 1
Регистрация: 20.02.2010
Сообщений: 180
18.04.2010, 14:05     Игра "Угадай число" #3
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
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
int main()
{ 
    int k;
    bool done;
    char c;
            //cout << rand() << endl;
            //cout << i << endl;
    cout << "GAME" << endl;
    int x;
        for ( ; ; )
        {   
            srand(time(0));
            int i = rand()%100;
            cout << "Ya zagadal chislo, ti ego otgaday!" << endl;
        //do 
        //{   
            {for ( ; ; )
            {
            cin >> x;
            if (x<i)
            cout << "Moe chislo bolshe!" << endl;
            else
            {if (x>i)
            cout << "Moe chislo men'she!"<< endl;
            else
                {cout << "Ti ugadal!" << endl;
                break;}
            }
            }
            }
        cout << "Prodolshit?" << endl << "1 - YES" << endl << "2 - NO" << endl;
        cin >> k;
                if (k == 1)
                    continue;
                else
                    break;
        }
}
Что-то типа того) соответственно сам можешь диапазоны в этой строке поменять(int i = rand()%100
А neske совершенно прав, не используй лучше goto. Вещь такая заразная, с моей точки зрения тупеешь с ним. Сначала тупеешь, а потом запутываешься в своей проге так, что начинаешь её с нуля писать)
Morfiy
 Аватар для Morfiy
5 / 5 / 0
Регистрация: 16.04.2010
Сообщений: 64
18.04.2010, 14:13     Игра "Угадай число" #4
ну я когдато делал подобную програму у меня она осталась но там число задаетса автоматичиски а пользователь его угадует
сотри сам мож ищо добавить вариант задать самому число или пусть задаетса автоматом)
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
#include<iostream.h>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
main(){
clrscr();
float a,b;
int i=0;
randomize();
a=random(100)+1;
  do
  {
  cout<<"vvesti b=";
  cin>>b;
  i++;
  if(b>a)cout<<"menshe vvedi\n";
  if(b<a)cout<<"bolshe vedi\n";
  }
while(b-a);
cout<<"you are right\n";
cout<<"zatra4eno poputok>"<<i;
 
getch();
return 0;
}
да кстати тут от 1 до 100 думаю тебе ета прога будет хорошым примером чоб самому розобраса
SmiThUa
0 / 0 / 0
Регистрация: 15.10.2009
Сообщений: 8
18.04.2010, 14:14  [ТС]     Игра "Угадай число" #5
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
Что-то типа того) соответственно сам можешь диапазоны в этой строке поменять(int i = rand()%100
А neske совершенно прав, не используй лучше goto. Вещь такая заразная, с моей точки зрения тупеешь с ним. Сначала тупеешь, а потом запутываешься в своей проге так, что начинаешь её с нуля писать)
Ок, приму к сведенью! ))
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
18.04.2010, 15:57     Игра "Угадай число" #6
Цитата Сообщение от broDiaga_cpp Посмотреть сообщение
А neske совершенно прав, не используй лучше goto

Не по теме:

Если человек имеет желание самому писать программу - так пусть хоть всё обтыкает goto'ами. Для начала он научится писать "хоть как-то", а потом по мере совершенства своих знаний будет писать более оптимально. А если посмотреть на код SmiThUa, то все goto очень понятно сделаны и сразу видно, что да как работает. А если посмотреть твой код, то надо сидеть и курить, как устроена логика программы (ибо в этих break'ах и continue'ах без поллитры одним взглядом не разобраться). Просто вопрос про goto поднимался не раз, а тут образовался наглядный конкретный пример, когда умеренное использование goto гораздо предпочтительнее (по крайней мере на мой взгляд), чем break'и и continue'ы

neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,694
18.04.2010, 17:01     Игра "Угадай число" #7
Этот код к первому посту, без goto:
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
#include <iostream>
#include <time.h>
 
int main ()
{
    setlocale( LC_ALL,"Russian" );
    
    int player_num=-1;
    int computer_num;
    size_t attempts=0; // попытки.
    
        std::cout << "Игра началась, удачи!\n";
        srand(time(0));
        computer_num=rand()%100;
 
        while (computer_num!=player_num)
        {
                        std::cout << "Введите число: ";
            std::cin >> player_num;
            if (computer_num>player_num) std::cout << "Загаданное число больше!\n";
            else std::cout << "Загаданное число меньше!\n";
            ++attempts;
        }
 
        std::cout << "Поздравляю! Вы выиграли!\n";
        std::cout << "Попытки: " << attempts << "\n";
 
    system("pause");
    return 0;
}

Evg, может-быть и так, но я все же останусь при своем мнении.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
18.04.2010, 18:04     Игра "Угадай число" #8
neske, опять-таки оффтоп, но применительно к твоему случаю концептуально более правильным было бы использовать цикл do-while вместо while-do. Потому как надо "вводить числа до тех пор пока не угадали". А вот "пока не угадали, вводить числа" - это немного неправильно, ибо числа сначала вводятся и лишь потом проверяются.

Т.е. (схематически) вместо:

C++
1
2
3
4
5
6
player_num=-1; // <--- хак, чтобы при первом сравнении ушли вовнутрь цикла
computer_num=rand()%100;
while (computer_num!=player_num)
{
  cin >> player_num;
}
было бы идеологически правильно:

C++
1
2
3
4
5
6
// хак не нужен
computer_num=rand()%100;
do
{
  cin >> player_num;
} while (computer_num!=player_num)
Но это так, лирическое отступление. Уж коль скоро речь зашла о том, как правильно, а как нет

Добавлено через 1 минуту
По поводу goto. Я сравнивал коды из постов #1 и #3. И код из поста #3 выглядит более запутанным, чем код из поста #1. Твой код из поста #7, разумеется, написан "хорошо" (т.е. более предпочтителен, чем код с goto)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.04.2010, 18:46     Игра "Угадай число"
Еще ссылки по теме:

Игра "Угадай число" C++
Игра "Угадай число" C++
Игра "Угадай число" C++

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

Или воспользуйтесь поиском по форуму:
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,694
18.04.2010, 18:46     Игра "Угадай число" #9
Evg, ты прав, do/while было бы логичнее использовать
Yandex
Объявления
18.04.2010, 18:46     Игра "Угадай число"
Ответ Создать тему
Опции темы

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