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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.81
jambas92
58 / 57 / 3
Регистрация: 18.11.2010
Сообщений: 315
#1

игра (с++) - C++

01.12.2010, 18:00. Просмотров 4166. Ответов 56
Метки нет (Все метки)

Здравствуйте! Нужно составить игру про шарики. Если в линии встречаются 3 или больше одинаковых цветов шарико, то нужно этот ряд шаров удалить. Задача состоит в том что бы посчитать сколько шариков удалилось. Цвета шариков это номера от 1 до 9. Тест такой:

ввод1:
5
1 3 3 3 2
вывод1:
3

ввод2:
10
3 3 2 1 1 1 2 2 3 3
вывод2:
10
я думаю что можно решить эту задачу с помощью стэка, но никак не получается... Если есть какие нибудь идеи или решали такие задачи то напишите. Заранее спасибо!!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.12.2010, 18:00     игра (с++)
Посмотрите здесь:

Игра - C++
Помогите решить следующую задачу: Написать программу, которая отгадывает задуманное число в интервале за n вопросов типа "Ваше число,...

2Д-игра - C++
Здравствуйте, хочу создать 2D игру. Раньше такие игры писал на C++ Builder, но больше не хочу (не серьёзно это ка-кто). Изучаю OpenGL, но...

Игра на C++ - C++
Нужно написать какую-небуть не особо сложную игру на C++. В голову приходять разные арканоиды/танчики/бомбермены, но для них, насколько я...

Игра - C++
Доброе время суток! Хочу написать свою первую, простую игру на С++. Посоветуйте с чего начать.

Игра на C++ - C++
Господа эксперты, допустим что у меня в графическом режиме есть некий статический обьект. Как мне им управлять с клавиатуры?...

Игра - C++
Есть вопрос, но не знаю даже как правильно спросить. Написал логику игры "Змейка". Теперь переношу на WinApi (писал на консоль). ...

Игра - C++
Создать программу со структурой player. Структура должна содержать поля level - для сохранения уровня игрока (начальное значение 1), ХР -...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
02.12.2010, 18:56     игра (с++) #41
jambas92, Вы напишите при каком вводе данных она появляется, я ее тоже поищу.
Hardcore
4 / 4 / 0
Регистрация: 24.10.2010
Сообщений: 200
02.12.2010, 20:04     игра (с++) #42
сделал такой тест
9
1 3 5 3 3 1 1 5 5
0
Для продолжения нажмите любую клавишу . . .
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
02.12.2010, 20:06     игра (с++) #43
Цитата Сообщение от Hardcore Посмотреть сообщение
сделал такой тест
9
1 3 5 3 3 1 1 5 5
0
Для продолжения нажмите любую клавишу . . .
Значит все правильно вывела программа.
jambas92
58 / 57 / 3
Регистрация: 18.11.2010
Сообщений: 315
02.12.2010, 20:06  [ТС]     игра (с++) #44
да правильно вывело!!!!
asics
Freelance
Эксперт C++
2846 / 1783 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
02.12.2010, 20:13     игра (с++) #45
valeriikozlov, Если не сложно, могли б Вы прокоментрировать свой код, а то в алогоритм не вежджаю.
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
02.12.2010, 20:57     игра (с++) #46
asics, можно:
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>
using namespace std;
 
int main()
{
        int N, *a, i, j, *b, temp, a_i=0, b_i=0, col=0;
        cin>>N;
        a=new int[N];// этот массив создаем для считывания номеров шариков
        b=new int[N];// этот будет работать как стек
        for(i=0; i<N; i++)// вводим номера шариков в массив a[]
        {
                cout<<"->";
                cin>>a[i];
        }
        for(i=0; i<N; i++)// основной цикл (здесь все вычисления), перебираем все номера шариков, которые находятся в массиве a[]
        {
                b[b_i++]=a[a_i++];// каждый очередной элемент из массива a[] заносим в массив b[]
                temp=0;
                for(j=b_i-1; temp<3 && j>=0; j--)// в этом цикле перебираем в глубь (учитывая глубину) номера шариков в стеке (в массиве b[]), если одинаковых подряд шариков вглубь станет 3, то останавливаем цикл. Так же цикл останавливаем, если 3 одинаковых подряд шарика не оказалось
                {
                        if(b[j]==b[b_i-1])
                                temp++;
                        else break;
                }
                if(temp==3)// если оказалось подряд одинаковых шариков в стеке 3
                {
                        temp=0;
                        while(a[a_i]==b[b_i-1] && b_i<N)// идем дальше по массиву a[] в поисках подряд идущих таких же шариков, увеличивая при этом col на кол-во этих шариков, а также переменную a_i - текущий индекс массива a[].
                        {
                                col++;
                                a_i++;
                        }
                        col+=3;// добавляем 3, -  кол-во этих же шариков в стеке (в массиве b[])
                        b_i-=3;// выкидываем из стека 3 одинаковых шарика
                }
        }
        cout<<"Count delete balls: "<<col<<endl;
    return 0;
}
Добавлено через 29 минут
Кстати никто не заметил, но правильнее будет так:
строку:
for(i=0; i<N; i++)// основной цикл (здесь все вычисления), перебираем все номера шариков, которые находятся в массиве a[]
заменить на:
C++
1
        while(a_i<N)// основной цикл (здесь все вычисления), перебираем все номера шариков, которые находятся в массиве a[]
Mr.X
Эксперт С++
3042 / 1687 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
02.12.2010, 23:06     игра (с++) #47
С понятным алгоритмом:
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
//////////////////////////////////////////////////////////////////////////////////////
//Нужно составить игру про шарики. Если в линии встречаются 3 или больше одинаковых 
//цветов шарико, то нужно этот ряд шаров удалить. Задача состоит в том что бы посчитать 
//сколько шариков удалилось. Цвета шариков это номера от 1 до 9. Тест такой:
//
//ввод1:
//5
//1 3 3 3 2
//вывод1:
//3
//
//ввод2:
//10
//3 3 2 1 1 1 2 2 3 3
//вывод2:
//10
//////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <iostream>
#include <list>
#include <stack>
//////////////////////////////////////////////////////////////////////////////////////
typedef int                T_ball;
typedef std::list<T_ball>  T_balls;
//////////////////////////////////////////////////////////////////////////////////////
int  removed_balls_count(T_balls  balls)
{    
    size_t  size_start = balls.size();
    T_balls::iterator  beg_series_it;
    T_balls::iterator  end_series_it = balls.begin();
    
    while((beg_series_it 
           = std::adjacent_find(end_series_it, balls.end())) != balls.end())
    {       
        end_series_it 
            = std::find_if(beg_series_it, balls.end(), 
                           std::not1(std::bind2nd(std::equal_to<T_ball>(), *beg_series_it)));
 
        if(std::distance(beg_series_it, end_series_it) < 3) continue;
        
        balls.erase(beg_series_it, end_series_it);
        end_series_it = balls.begin();
    }    
    return  size_start - balls.size();
}
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
 
    std::cout << "Введите количество шариков: ";
    int n = 0; 
    std::cin >> n;
 
    struct T_input_ball
    {
        void operator() (T_ball&  ball)
        {
            std::cout << "->";
            std::cin >> ball;            
        }
    };
 
    T_balls  balls(n);
    std::for_each(balls.begin(), balls.end(), T_input_ball());
 
    std::cout << "Удалено "
              << removed_balls_count(balls)
              << " шариков."
              << std::endl;
}
lemegeton
2918 / 1347 / 134
Регистрация: 29.11.2010
Сообщений: 2,721
03.12.2010, 17:22     игра (с++) #48
Крутатенюшка.

Не по теме:

"1113331"
Сколько шариков будет удалено?
Шесть. Останется 1. Оптимизация?

Mr.X
Эксперт С++
3042 / 1687 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
03.12.2010, 18:44     игра (с++) #49
Цитата Сообщение от lemegeton Посмотреть сообщение
Крутатенюшка.

Не по теме:

"1113331"
Сколько шариков будет удалено?
Шесть. Останется 1. Оптимизация?

Да, вы правы, в последнем моем варианте алгоритм ошибочный.

Добавлено через 14 минут
А вообще-то этот тест ни одна из приведенных в этой теме программ не проходит.
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
03.12.2010, 19:16     игра (с++) #50
Mr.X,
Да, вы правы, в последнем моем варианте алгоритм ошибочный.
Это не правильно Вы пишите, потому что самое главное в задании:
Цитата Сообщение от jambas92 Посмотреть сообщение
Если в линии встречаются 3 или больше одинаковых цветов шарико, то нужно этот ряд шаров удалить.
Я вообще-то уже думал над подобным вариантом (в введенной последовательности может несколько вариантов удаления 3-х или более шариков, и самое главное кол-во всего удаленных шариков очень зависит от выбранного варианта). Но автор темы выбрал простой путь:
Цитата Сообщение от jambas92 Посмотреть сообщение
Если в линии встречаются 3 или больше одинаковых цветов шарико, то нужно этот ряд шаров удалить.
Следуем этому варианту, иначе нужно решать совсем по-другому.
Mr.X
Эксперт С++
3042 / 1687 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
03.12.2010, 19:22     игра (с++) #51
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Mr.X, Это не правильно Вы пишите, потому что самое главное в задании:


Я вообще-то уже думал над подобным вариантом (в введенной последовательности может несколько вариантов удаления 3-х или более шариков, и самое главное кол-во всего удаленных шариков очень зависит от выбранного варианта). Но автор темы выбрал простой путь:
Следуем этому варианту, иначе нужно решать совсем по-другому.
Да, поиск самого оптимального варианта (т.е. удаляющего максимальное количество шариков) - это задача более сложная.
jambas92
58 / 57 / 3
Регистрация: 18.11.2010
Сообщений: 315
03.12.2010, 22:43  [ТС]     игра (с++) #52
Не по теме:
"1113331"
Сколько шариков будет удалено?
Шесть. Останется 1. Оптимизация?
как автор этой темы заявляю что ответом будет 6!!! так как от 0 до 9 являются цветами определенных шариков, с начало встречаются 111 и они удаляются с линии, затем 333, и в конце остается 1. это задача на реализацию игры ZUMA
lemegeton
2918 / 1347 / 134
Регистрация: 29.11.2010
Сообщений: 2,721
03.12.2010, 22:53     игра (с++) #53
Ну тогда однозначно алгоритм и реализация Mr.X самые толковые.
jambas92
58 / 57 / 3
Регистрация: 18.11.2010
Сообщений: 315
03.12.2010, 22:56  [ТС]     игра (с++) #54
мда , респект мистеру Mr.X
shocoladka
7 / 7 / 0
Регистрация: 02.12.2010
Сообщений: 71
03.12.2010, 23:29     игра (с++) #55
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>
int main ()
{
    int b,c,d,n,i,j;
    cin>>n;
    b=0;
    int a[n];
    for(i=1;i<=n;i++)
    cin>>a[i];
    for(i=1;i<=(n-2);i++)
    {
    if(a[i]==a[i+1] && a[i+1]==a[i+2])
    {
    b+=3;
    for(j=i+2;j<=n;j++)
    if(a[j]==a[j+1])
    {
        b++;
        i++;
    }
    else
    break;
    }
    }
    cout<<b;
}
jambas92
58 / 57 / 3
Регистрация: 18.11.2010
Сообщений: 315
04.12.2010, 10:54  [ТС]     игра (с++) #56
shocoladka, задача не то что не верно считывает, но он даже офрмлен не правильно, например вот в этой строке

C++
1
int a[n];
динамический массив таким образом не создается
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2010, 10:57     игра (с++)
Еще ссылки по теме:

Игра на С++ - C++
Ну в общем нужна вам или нет, но всё равно выложу:) Это крестики-нолики. #include &lt;graphics.h&gt; #include &lt;stdlib.h&gt; #include...

Игра в города - C++
Нужно реализовать в С++ Игра в города Условие задачи: Всем известны правила игры &quot;в города&quot;: первый игрок называет произвольный...

Игра Scrabble - C++
Создать программу для решения задачи построения слова из некоторого множества букв (игра Scrabble) используя алгоритмы поиска в глубину и в...

Карточная игра - C++
Здравствуйте! Есть карточная игра, нужно сделать программу для игры на компьютере и далее, чтобы можно было играть в интернете в нее...

Игра Лабиринт - C++
Пишу простейшую игру лабиринт.Поле загружаю из файла, курсор двигаю клавишами через SetConsoleCursorPosition, как сделать ограничение на...


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

Или воспользуйтесь поиском по форуму:
jambas92
58 / 57 / 3
Регистрация: 18.11.2010
Сообщений: 315
04.12.2010, 10:57  [ТС]     игра (с++) #57
вот синтаксический исправленный вариант
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
#include <iostream>
using namespace std;
int main ()
{
    int b,c,d,n,i,j;
    cin>>n;
    b=0;
    int *a;
    a=new int [n];
    for(i=1;i<=n;i++)
    cin>>a[i];
    for(i=1;i<=(n-2);i++)
    {
    if(a[i]==a[i+1] && a[i+1]==a[i+2])
    {
    b+=3;
    for(j=i+2;j<=n;j++)
    if(a[j]==a[j+1])
    {
        b++;
        i++;
    }
    else
    break;
    }
    }
    cout<<b;
}
Yandex
Объявления
04.12.2010, 10:57     игра (с++)
Ответ Создать тему
Опции темы

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