Суббота, 21 Декабря 2024, 15:52

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Консольное казино // пара вопросов
maXimBestUAДата: Вторник, 03 Апреля 2012, 23:29 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Здраствуйте
Давно мечтал создавать свои игры, пытался что то делать на Game Maker, но в основном, после скачки кучи исходников различных игр, все заканчивалось ничем. Вот месяц назад решил серьезно занятся программированием, уж очень привлекает меня создание различных приложений и игр.

Написал свой первый и самый сложный (естественно для меня) проект - консольное казино. Выложил я его сюда для того чтобы опытные программисты оценили то, чего я добился за месяц самостоятельного обучения, указали на ошибки, и дали свои советы.

Вообщем игра состоит из четырех игр
1.Рулетка
2.Угадай число
3.Однорукий бандит
4.Открой сейф

Вы выбираете игру, делаете ставку (кроме второй игры, там ставка всегда одинакова), после чего играете, если вы выиграли ставка умножается вдвое, если же проиграли то ставка отнимается.

Я попытался сделать максимально много проверок таких как проверка не поставил ли игрок больше монет чем у него имеется.
Вообщем вод сам код:

Code

#include <iostream>    
#include <stdlib.h>    
#include <time.h>    

using namespace std;

int money=100;  //Деньги
int game1(int&, int&);
int game2(int&, int&);
int game3(int&);
int game4(int&);

int main (void)
{
setlocale(LC_ALL, "Russian");
int c;          //Переменная для хранения чисел введеных игроком в играх 1 и 2.
int x;   //Переменная для выбора игры.

int i=1;  //Если равно 1, программа начинает работу заново

     do
     {

     int b;    //Переменная для хранения введеной ставки

       //===Получение ставки и проверка на коректность===//
       do
       {
       cout<<"+----------------МЕНЮ---------------------+\n";
      cout<<"У вас в кармане "<<money<<" монет\n\n";
      cout<<"  Выберите игру\n";
      cout<<"1.Рулетка\n";
      cout<<"2.Угадай число\n";
      cout<<"3.Однорукий бандит\n";
      cout<<"4.Открой сейф!\n";
       cout<<"+-----------------------------------------+\n";
      cin>>x;
      if(x<1 || x>4)
      {
       cout<<"+--------------WARNING-------------------+\n";
       cout<<"Вы ввели некоректные данные, повторите.\n";
       cout<<"+----------------------------------------+\n";
       x=0;
      }
       }while(x<1 || x>4);
         
                          

       //Если вы выбрали НЕ игру №3, у вас попросит ввести ставку, и проверит коректность введеной ставки.
       if(x!=3)
       {
       do
       {
       cout<<"Сделайте вашу ставку:\n";
       cin>>b;
       if(b>money)
       {
       cout<<"+--------------WARNING-------------------+\n";
       cout<<"\aУ вас не хватает монет для ставви!\n";
       cout<<"+-----------------------------------------+\n";
       }
       else
       {
       if(b<1)
       {
       cout<<"+--------------WARNING-------------------+\n";
       cout<<"Вы должны поставить хотябы одну монету.\n";
       cout<<"+-----------------------------------------+\n";
       }
       }
       }while(b>money||b<1);
       }
                  
               //функции с играми, вызывается в зависимости значения переменной int x.
      switch (x)
      {
      case 1: game1(c, b); break;
      case 2: game2(c, b); break;
      case 3: game3(b);    break;
      case 4: game4(b);  break;
      }

      //Запрос, продолжит ли игрок игру или же выйдет, и проверка коректности введеных данных.
      do
      {
     cout<<"+-----------------------------------------+\n";
     cout<<"У вас "<<money<<" монет\n";
     cout<<"Введите 0: для выхода\n"<<"Введите 1: чтобы продолжить игру\n";
     cout<<"+-----------------------------------------+\n";
     cin>>i;
       if(i<0||i>1)
     {
      cout<<"+--------------WARNING-------------------+\n";
      cout<<"Вы ввели некоректные данные, повторите.\n";
      cout<<"+-----------------------------------------+\n";
     }
      }while(i<0||i>1);
     }while(i==1);

return 0;
}

inline int game1(int &c, int &b)
{
    srand (time(0));
    int a;
    a=rand()%15;

       //===Получение числа, проверка на коректность введеного числа===//
    do
    {
       cout<<"Введите число от 1 до 15\n";
    cin>>c;

        //Проверка коректности введеного игроком числа.
     if(c>15)
     {
      cout<<"+--------------WARNING-------------------+\n";
      cout<<"Вы ввели слишком большое число, повторите\n";
      cout<<"+----------------------------------------+\n";
     }
     else
     {
     if(c<1)
     {
      cout<<"+--------------WARNING-------------------+\n";
      cout<<"Вы ввели слишком маленькое число, повторите\n";
      cout<<"+-----------------------------------------+\n";
     }
     }
    }while(c>15||c<1);

       //Определение победил ли игрок, и сколько он выиграл.
    if(c==a)
     {
     cout<<"+--------------ПОБЕДА-------------------+\n";
     cout<<"Поздравляю, вы выиграли! Компьютер загадал "<<a<<"\n";
     b*=2;
     money+=b;
     cout<<"Вы получили"<<b<<"\n";
     cout<<"+---------------------------------------+\n";
     }
    else
     {
     cout<<"+--------------ПОБЕДА-------------------+\n";
     cout<<"Вы проиграли, выпало число "<<a<<"\n";
     cout<<"+---------------------------------------+\n";
     money-=b;
     }

return 0;
}

inline int game2 (int &c, int &b)
{

    srand (time(0));
    int a;
    a=rand()%50;
    int x=10;

    do
    {
    cout<<"Угадайте число с 10 попыток\n";
       cout<<"Введите число от 1 до 50\n";
    cin>>c;    

        //Подсказки, больше или меньше введеное игроком число.
     if(c>a)
     {

      cout<<"Вы ввели слишком большое число, у вас осталось "<<x<<" попыток\n";
      x--;
     }
     else
     {
     if(c<a)
     {
      cout<<"Вы ввели слишком маленькое число, у вас осталось "<<x<<" попыток\n";
      x--;
     }
     }

     //Определение победил ли игрок, и сколько он выиграл.
     if(c==a)
     {
      cout<<"+--------------ПОБЕДА-------------------+\n";
      cout<<"Молодец ты угадал!\n";
      x=0;
      b*=2;
      cout<<"Вы получили "<<b<<"\n";
      money+=b;
      cout<<"+---------------------------------------+\n";
      break;
         
     }
     else
     {
     if(x==0)
     {
      cout<<"+--------------ПРОИГРЫШ-----------------+\n";
       cout<<"Жаль, но ты проиграл.\n";
      cout<<"+---------------------------------------+\n";
       money-=b;
       break;
     }
     }
    }while(x!=0);
         
         
return 0;
}

int game3 (int &b)
{
    srand (time(0));
    int c[3];  //Массив хранения выпадающих чисел.
    int x;     //Переменная для хранения варианта продолжение игры либо выход.
    int d;     //Переменная для определения начала игры (дергание за ручку).
    do
    {
     for(int i=0;i<3;i++)
     {
     int a;
     a=rand()%10;

     c[i]=a;
     }

      do
     {
     cout<<"Дернуть за ручку (введите \"1\")\n";
     cin>>d;
     if(d<1||d>1)
     {
      cout<<"+--------------WARNING-------------------+\n";
      cout<<"Вы ввели некоректные данные, повторите.\n";
      cout<<"+-----------------------------------------+\n";
     }
     }while(d<1||d>1);
     money-=5;

    cout<<"+---------------------------------------+\n";
    cout<<"|"<<c[0]<<"|"<<c[1]<<"|"<<c[2]<<"| \n";
    cout<<"+---------------------------------------+\n";

        //Определение победил ли игрок, и сколько он выиграл.
     if(c[0]==c[1]&&c[0]==c[2]&&c[1]==c[2])
      {
       cout<<"+--------------ДжекПот-------------------+\n";
       cout<<"Поздравляю вы выиграли ДжекПот\n";
       b=5*10;
       money+=b;
       cout<<"Ваш выиграш составил "<<b<<" монет.\n";
       cout<<"Ваш баланс"<<money<<"\n";
       cout<<"+-----------------------------------------+\n";
      }
      else
      {
      if(c[0]==c[1]||c[0]==c[2]||c[1]==c[2])
      {
       cout<<"+--------------Выиграш-------------------+\n";
       cout<<"Поздравляю, совпало 2 цыфры!\n";
       b=5*5;
       money+=b;
       cout<<"Ваш выиграш составил "<<b<<" монет.\n";
       cout<<"Ваш баланс "<<money<<"\n";
       cout<<"+----------------------------------------+\n";
      }
      else
      {
       cout<<"Вы ничего не выиграли.\n";
       cout<<"Ваш баланс "<<money<<"\n";
      }
     }

     //Запрос повторения игры или выход в меню.
     do
     {
      cout<<"Повторить игру (Введите \"0\")\n";
      cout<<"Выйти из игры (Введите \"1\")\n";
      cin>>x;
      if(x<0||x>1)
      {
      cout<<"+--------------WARNING-------------------+\n";
      cout<<"Вы ввели некоректные данные, повторите.\n";
      cout<<"+-----------------------------------------+\n";
      }
     }while(x<0||x>1);
    }while(x==0);

return 0;
}

int game4(int &b)
{

srand(time(0));
int e=0;               //Переменная для подсчета количества угаданых чисел.
int w=1;              //Переменная для определения желает ли игрок повторить игру сначала.
int q=0;             //Переменная для подсчета совпадения цыфр в пароле.
int x=5;            //Переменная для хранения количества попыток.
int seif [4];
int pass [4];

//Заполнение массива (пароли сейфа)
do          //Цыкл всей гры(если равен w==0 то игра повторяется)
{

cout<<"\t\t+-------------------------------------------------+\n";
cout<<"\t\t|                    СЕЙФ                         |\n";
cout<<"\t\t+-------------------------------------------------+\n";

cout<<"*Компьютер загадывает 4 цыфры (пароль)\n";
cout<<"*Вы должны отгадать все 4 цыфры с 5 попыток\n";
cout<<"*Компьютер вам выдает подсказки, сколько цыфр совпало, и сколько из \n совпавших цыфр на своих местах\n";

for(int i=0;i<4;i++)
{
    int a;
    a=rand()%10;
    seif[i]=a;
}

//=======================================
//for(int i=0;i<4;i++)
//{
//  cout<<seif[i];
//}
//cout<<"\n";

for(int i=0;i<4;i++)
{
    seif[i];
}

do         //Цыкл для проверки количества попыток (int x)
{
if(x!=0)
{
for(int i=0;i<4;i++)
{
    cout<<"Введите "<<i+1<<" цыфру\n";
    cin>>pass[i];
}

for(int i=0;i<4;i++)
{
    cout<<pass[i];
}
cout<<"\n";

for(int i=0;i<4;i++)
{
    for(int j=0;j<4;j++)
    {
          if(pass[i]==seif[j])
       {
       e++;
       }
    }
}

//+===========Если pass==seif значит цыфра введена равильно и она стоит на своем месте.=======+
for(int i=0;i<4;i++)
{
    if(pass[i]==seif[i])
    q++;
}
//+===========================================================================================+

x--;

if(q!=4)
{
    cout<<"Вы угадали "<<e<<" цыфр, "<<q<<" из них на своих местах\n";
    cout<<"У вас осталось "<<x<<" попыток\n";
    q=0;
    e=0;
}
else
{
if(q==4)
{
    x=0;             //Если все цыфры совпали, обнуляем счетчик попыток для выхода из цыкла.
}
}
}
}while(x!=0);

if(q==4)
{
    cout<<"+--------------ПОБЕДА-------------------+\n";
    cout<<"Ура, вы открыли сейф\n";
    cout<<"+---------------------------------------+\n";
    money=b*2;
}
else
{
    cout<<"+--------------ПРОИГРЫШ-----------------+\n";
    cout<<"Вы не сумели открыть сейф, вы проиграли\n";
    cout<<"Правильный ответ:\n";
    for(int i=0;i<4;i++)
    {
     cout<<seif[i]<<"\n";
    }
    cout<<"+---------------------------------------+\n";
    money-=b;
}
x=5;         //Возвращение баланса попыток на прежний уровень.

      do
      {
      cout<<"Повторить игру (Введите \"0\")\n";
      cout<<"Выйти из игры (Введите \"1\")\n";
      cin>>w;
      if(w<0||w>1)
      {
      cout<<"+--------------WARNING-------------------+\n";
      cout<<"Вы ввели некоректные данные, повторите.\n";
      cout<<"+-----------------------------------------+\n";
      }
      }while(w<0||w>1);

}while (w==0);

    return 0;
}

Уточню что писал игру не заглядывая в уроки.

А вот папка со всей программой вместе с исходниками.
Консольное казино.

Попрошу оценить плод моих стараний, указать на ошибки, дать советы.
И возможно ли с такими знаниями переходить с консольных на оконные приложения?


Сообщение отредактировал maXimBestUA - Вторник, 03 Апреля 2012, 23:39
ZweifxДата: Среда, 04 Апреля 2012, 01:52 | Сообщение # 2
был не раз
Сейчас нет на сайте
Здравствуй maXimBestUA, посмотрел игру, вижу ты все таки постарался!

Но чувствуется, что ты пока не умеешь правильно оформлять код (Сравнивая со своим, когда начинал учить С++), но главное что все работает!

Так вот, начнем с проверок, их можно было сделать как функции (См. мой прим.), к тому же ты используешь много циклов (Возникают проблемы с чтением твоего кода), в main можно было бы обойтись одним циклом while(1).

Вот я немного переделал твой код функции main. Можно конечно написать еще лучше, но пока как есть.
Т.к. использую Code::Blocks, была написана функция для корректного отображения Рус.яз. (coutr(const char* txt)) можешь заменить на привычный для себя (cout).

Code
int state(int num1, int num2, int num3, int num4)
{
               if(num1 < num2 || num3 > num4){
                   coutr("+--------------WARNING-------------------+\n");
                   coutr("Вы ввели некоректные данные, повторите.\n");
                   coutr("+----------------------------------------+\n");
                   return 0x5;
               }
}

int main (void)
{

int c, x, b; // Эти переменные лучше вынести из функции, или инициализировать их нулями.

               while(1)
               {
                   coutr("--------------Menu---------------\n");
                   coutr("1.Рулетка\n");
                   coutr("2.Угадай число\n");
                   coutr("3.Однорукий бандит\n");
                   coutr("4.Открой сейф!\n");
                   cin >> x;

                   if (state(x, 0, x, 4) == 0x5) // Проверка меню x < 0 || x > 4 если да, функция state вернет 0x5
                       continue; // Пропустить остальной код, и начать цикл заного.

                   if (x != 0 & x != 3){
                       coutr("--------------Сделайте вашу ставку---------------\n");
                       coutr("Деньги ");
                       cout << money << endl;
                       cin >> b;

                     if(state(money, b, 1, b) == 0x5) //Проверка money < b || 1 > b если да, функция state вернет 0x5
                           continue; // Пропустить остальной код, и начать цикл заного.
                   }

                   switch (x)
                   {
                       case 1: game1(c, b);
                           break;
                       case 2: game2(c, b);
                           break;
                       case 3: game3(b);
                           break;
                       case 4: game4(b);
                           break;
                       case 0: return 0;
                           break;
                   }
               }
               return 0;
}


Переходить к оконным приложениям тебе еще рано, сейчас тебе лучше научиться правильно оформлять код, переходить к Классам(ООП) иначе будешь путаться (Сам много с этим провозился, понимая суть).

Контуры моей мысли, думаю, тебе понятны.


Если никто не знает, это то же самое, как если бы этого не было вовсе.

Сообщение отредактировал Zweifx - Среда, 04 Апреля 2012, 04:04
maXimBestUAДата: Среда, 04 Апреля 2012, 08:02 | Сообщение # 3
почетный гость
Сейчас нет на сайте
Zweifx,
Большое спасибо за советы, вот классы,, структуры я пока начинаю учить.


Сообщение отредактировал maXimBestUA - Среда, 04 Апреля 2012, 08:04
vasua99Дата: Пятница, 06 Апреля 2012, 22:39 | Сообщение # 4
GNU follower
Сейчас нет на сайте
так не плохо,но советую почитать книжку по алгоритмизации,т.к многоие моменты можно было сократить.+ если дойдешь до полиморфизма,тогда попробой сделать с помощью классов(представь каждую игру в виде класса) интересно будет,а вообще удачи тебе в освоении этого непростого языка!)
П.с цИфры пишется через "и".)


Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
maXimBestUAДата: Воскресенье, 08 Апреля 2012, 22:49 | Сообщение # 5
почетный гость
Сейчас нет на сайте
Классы и структуры что то у меня не получается до конца понять sad
VinchensooДата: Понедельник, 09 Апреля 2012, 05:31 | Сообщение # 6
Злобный социопат с комплексом Бога
Сейчас нет на сайте
Код нужно разместить на нормальном хостинге кода, читать его без подсветки синтаксиса- вообще нет желания.

vasua99Дата: Понедельник, 09 Апреля 2012, 12:37 | Сообщение # 7
GNU follower
Сейчас нет на сайте
насчет классов постарась обьяснить - в мире все зуществует в виде обьектов - человек,машина и т.д.Так вот в ООП такая же концепция - там есть обьекты и классы, класс - шаблон по которому создается обьект(например человек состоит из органов,и при этом у каждого человека они свои),а обьект - это отдельный экземпляр класса,у которого свои "органы",т.е класс это "типа" указания каким должен быть обьект,а обьект это в свою очередь отдельный экземплер,построенный по этому "макету",например:
[code]
class Point // указываем что обьекты этого класса имеют две переменные и функции ПолучитьХ и У(если чесстно говорить,то функции одни - на все экземпляры,но это тебе пока ненужно...)
{
private:
int x,y;
public:
int GetX();
int GetY();
};

int main()
{
Point up,down; // две точки,у каждого свои переменные
[\code]


Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
maXimBestUAДата: Понедельник, 09 Апреля 2012, 21:38 | Сообщение # 8
почетный гость
Сейчас нет на сайте
Я понял основное, что структуры и классы это какбы шаблоны которые можно использовать для создания схожих обьектов (к примеру машин с одинаковыми деталями но разными характеристиками)
обьявляются они
class(struct) name
{
int i;
int b;
};
как вызываются тоже кажется понял. Но дальше в классах начали описывать работы с функциями, все както запутано описано, и вот выше написаного больше я ничего не понял.
vasua99Дата: Понедельник, 09 Апреля 2012, 22:00 | Сообщение # 9
GNU follower
Сейчас нет на сайте
ну смотри,у каждого класса могут быть функции,(такие же обычные),но они принадлежат классу,и чаще всего им манипулируют, например
Code

class Mine // Мина
{
   private:
     int damage;
   public:
     void Mine(int d = 50) : damage(d) {} // конструктор,можешь по не заострать на нем,он вызывается при создании обьекта класса
     int blow() // взорвать
     {
       return damage; // возвращаем урон от мины
     }
};

int main()
{
   Mine Ours_mine(100);
   cout << ""Мина взорвалась,и мы получили  << Ours_mine.blow() << " единиц урона";
   return 0;


А вообще не парься,со временем все поймешь,у меня например проблемма,что я не очень люблю использовать стандартные функции(точнее особо их не знаю)а это хуже чем у тебя проблемма,поверь)


Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
maXimBestUAДата: Понедельник, 09 Апреля 2012, 22:19 | Сообщение # 10
почетный гость
Сейчас нет на сайте
Надеюсь что все пойму.
Вот хочу последнее спросить: то есть функция в классе выполняет туже роль что и во всем коде, просто разбивает класс на части выполняющие определенную роль?


Сообщение отредактировал maXimBestUA - Понедельник, 09 Апреля 2012, 22:20
vasua99Дата: Вторник, 10 Апреля 2012, 09:16 | Сообщение # 11
GNU follower
Сейчас нет на сайте
ну типа да,но она не разбивает а предоставляет какие то действия над обьектом

Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
maXimBestUAДата: Вторник, 10 Апреля 2012, 19:27 | Сообщение # 12
почетный гость
Сейчас нет на сайте
Quote (vasua99)
доставляет какие то действия над обьектом

Вот этого я не понял.

Добавлено (10.04.2012, 19:27)
---------------------------------------------
И как можно изменить мою программу, использую классы?

vasua99Дата: Вторник, 10 Апреля 2012, 20:07 | Сообщение # 13
GNU follower
Сейчас нет на сайте
ну представь есть машина,мы можем ее завести нажать газ,тормоз,переключить скоростя,так вот "нажать тормоз" и т.д это и есть методы(функции) класса

Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
maXimBestUAДата: Вторник, 10 Апреля 2012, 22:44 | Сообщение # 14
почетный гость
Сейчас нет на сайте
В моем понимании это сложилось так, создана функция для тормоза, и эту функцию как и переменную можно применять как шаблон для разных обьектов(машин), для создания разных характеристик торможения, хотя бы приблизительно я правильно понял?

И как правильно обьявлять функции класса, так же как и обычные переменные, то есть после точки название функции?
vasua99Дата: Среда, 11 Апреля 2012, 07:57 | Сообщение # 15
GNU follower
Сейчас нет на сайте
нет,не правильно,функция обьявляется в классе, и во всех обьектах одинаковая,а типо того что ты говоришь,это уже полиморфизм.Функция-член класса обьявляется так:
Code

class My
{
   public:
     //тип_возвр_знач имя функции(список параметров)
     // пример:
     void Stop() { cout << "Stop...\n";}
     ...
};

int main()
{
   My test;
   test.Stop();
   return 0;
}


P.S извини за такой вопрос,сколько тебе лет?просто мне сейчас 13,я в 11 начал учить С++,дальше функций не ушел,а сейчас не могу только дг конца понять механизм исключений.. P.P.S если трудно, можешь поучить питон,неплохой и нетрудный язык,потом будешь учить С++,будет легче.Но в питоне мехкнизмы немного другие...


Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
maXimBestUAДата: Среда, 11 Апреля 2012, 16:46 | Сообщение # 16
почетный гость
Сейчас нет на сайте
Хех, мне 16 smile , я как бы нацелился на с++ уже. Но функции в классах всеравно не пойму.
Возможно функция в классе это создание определенного действия, которое можно применять многократно?
BASSДата: Среда, 11 Апреля 2012, 16:52 | Сообщение # 17
independent developer
Сейчас нет на сайте
Как-то так. Вообще, класс - это как конструкция из коробок и верёвок - коробки (поля, свойства) что-то в себе хранят, верёвки (методы) что-то делают. Сами по себе коробки и верёвки бесполезны - можно только повеситься или упаковаться. Но в экземпляре класса, в конструкции, они что-то делают и для чего-то нужны.
Это чисто мои ассоциации, не принимать за Вселенскую Истину.


Будь подобен лезвию бритвы: ярким, блестящим, отточенным, но холодным и не показывающим своего истинного цвета.

Сообщение отредактировал BASS - Среда, 11 Апреля 2012, 16:52
ТритонДата: Понедельник, 16 Апреля 2012, 07:40 | Сообщение # 18
постоянный участник
Сейчас нет на сайте
Quote (maXimBestUA)
Надеюсь что все пойму. Вот хочу последнее спросить: то есть функция в классе выполняет туже роль что и во всем коде, просто разбивает класс на части выполняющие определенную роль?
Да. Но есть одна особенность: функции-члены классов вызываются через объекты по точечной нотации:
Code
mine1.brow();
, где mine1 указывает, какую именно мину надо взорвать. Но при этом в теле самой функции не надо заниматься поиском этой мины, все члены класса (поля (члены-данные, "органы") и методы (функции-члены)) класса внутри этой функции доступны, как обычные переменные и функции.

Добавлено (16.04.2012, 07:40)
---------------------------------------------
Quote (vasua99)
ну типа да,но она не разбивает а предоставляет какие то действия над обьектом
Вообще то всякая подпрограмма есть раздел программы, выполняющий определённые действия. Ну а функции - вид подпрограмм.


Не всё так плохо, как оно есть на самом деле.

Сообщение отредактировал Тритон - Понедельник, 16 Апреля 2012, 07:41
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг