Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [С|С++]BlackJeck 
:(
    Опции темы
Ufyljy
  Дата 10.12.2007, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 5.10.2007

Репутация: нет
Всего: 1



Кто-нибудь может написать карточную игру BlackJeck?
(или в народе 21 очко)
PM MAIL   Вверх
DonJuansMagicPants
Дата 10.12.2007, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 16.7.2007

Репутация: -1
Всего: -1



я могу , а что мне за это будет ?  smile 
PM MAIL   Вверх
zkv
Дата 11.12.2007, 03:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 21
Всего: 92



Цитата(Ufyljy @  10.12.2007,  09:54 Найти цитируемый пост)
Кто-нибудь может написать карточную игру BlackJeck?


Ufyljy, ты бы пошире требования расписал. Операционная система, компилятор, оконное приложение или консольное, и т.п. 
Но в любом случае задача трудоемкая, за так вряд ли кто возьмется.
PM MAIL   Вверх
Ufyljy
  Дата 11.12.2007, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 5.10.2007

Репутация: нет
Всего: 1



Windows XP SP2. Компилятор DevCpp. Приложение консольное.

Я сейчас сам ее пишу, мне интересно как вы ее реализуете.

Например, можно не писать программу, а алгоритм.
PM MAIL   Вверх
Ufyljy
Дата 12.12.2007, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 5.10.2007

Репутация: нет
Всего: 1



Уже какую-то часть сделал.
Вопросы:
1) Как сделать так, чтобы после каждого прохода цикла вверху количество карт в колоде и количество очков обновлялось? // Панель
2) Два цикла, которые управляют ходом игры... можно поступить более рационально?  // Кто ходит первым

Благодарности: wils0n, DjoNIK, FREEDEV, Kuvaldis, Lazin, Optimus =2, SergeCpp, archimed7592 =5, FiMa1 =2, zkv =2, bsa, Ln78, Dov =2

Код

#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>

#define br putchar('\n');
#define p br; br;
#define ln putchar('\r');
#define back putchar('\b');
#define tab putchar('\t');

main()
{
      int a[9]={2,3,4,6,7,8,9,10,11}; 
      
      char c[4]={'B','P','C','T'};      
      
      int b[36];
      
      char d[36];
      
      int i, j, k, n, s=0, r=0, temp;

      int *g, *h;
      
      int card; g=&card; card=36;
      
      int your_points=0, cpu_points=0; 
      
      int motion=0;
      
      long int x=100000000;
      
      
      

      srand((unsigned)time(NULL));
      
      for(k=0; k < 4; k++)
      {
                for(i=0; i<9; i++)
                {
                         b[i+r]=a[i];
                }
                
                r+=9;
      }
      
      r=0;
      
      for(k=0; k<4; k++)
      {
               for(i=0+r; i<9+r; i++)
               {
                          j=(rand()%9)+r;
                          
                          temp=b[i]; b[i]=b[j]; b[j]=temp;
               }
               
               r+=9;
      }
      /*
      for(i=0; i<36; i++)
      {
               if(i%9==0){br;}
               printf("%d ",b[i]);
               
      }
      */

      for(k=0; k < 9; k++)
      {
                for(i=0; i<4; i++)
                {
                         d[i+s]=c[i];
                }
                
                s+=4;
      }            

      
      s=0;
      
      for(k=0; k<9; k++)
      {
               for(i=0+s; i<4+s; i++)
               {
                          j=(rand()%4)+s;
                          
                          temp=d[i]; d[i]=d[j]; d[j]=temp;
               }
               
               s+=4;
      }
      
      /* for(i=0; i<36; i++)
      {
               if(i%4==0){br;}
               printf("%c ",d[i]);
               
      }
      */
      
      // Переворачиваем колоду
      for(i = 36; i > 0; i--)
      {
            b[i]=b[36-i];
            d[i]=d[36-i];
      }   

      // Вывеска
      tab; tab; tab;
      printf(">>>>>"); printf(" BlackJeck "); printf("<<<<<");
      
      p; p;

      // Панель
      printf("Cards in a deck: %d / Your amount of points: %d / ",*g,your_points);

      p; br;
      
      int you, cpu;

               if(i==0)
               {
                       // Кто ходит первым
                       if(rand()%2==1)
                       {
                                      you=1;
                       }
                       else cpu=1;
               }
               
               if(you==1)
               {
                         for(i=0; i<18; i++)
                         {
                                  motion+=1;
                                  printf("[%d motion] ",motion); br;
                                  
                                  // Ваш ход
                                  printf("YOU turn: "); 
                                  printf("Vi berete kartu ");
                                  #include "deck.cpp"
                                  your_points+=b[i];
                                  printf(" +%d",b[i]);
                                  
                                  br;
                                  
                                  // Ход компьютера
                                  printf("CPU turn: "); cpu_points+=b[i+1];
                                  for(n=0; n<2*x; n++); printf("wait ");
                                  for(n=0; n<x; n++){if(n%(x/10)==0){printf(".");}}
                                  printf(" Has turned");
                                     
                                  p;
                                  
                                  /*
                                  if(your_points > 21){printf("YOU LOSE");}
                                  if(cpu_points > 21){printf("YOU WIN");}
                                  if(your_points > cpu_points && your_points >= 0 && your_points <= 21)
                                  {
                                                 printf("YOU WIN");
                                  }
                                  if(cpu_points > your_points && cpu_points >= 0 && cpu_points <= 21)
                                  {
                                                 printf("YOU LOSE");
                                  }
         */
                         }
         }
         
               if(cpu==1)
               {
                         for(i=0; i<18; i++)
                         {
                                  motion+=1;
                                  printf("[%d motion] ",motion); br;
                                  
                                  // Ход компьютера
                                  printf("CPU turn: "); cpu_points+=b[i+1];
                                  for(n=0; n<2*x; n++); printf("wait ");
                                  for(n=0; n<x; n++){if(n%(x/10)==0){printf(".");}}
                                  printf(" Has turned");
                                  
                                  br;

                                  // Ваш ход
                                  printf("YOU turn: "); 
                                  printf("Vi berete kartu ");
                                  #include "deck.cpp"
                                  your_points+=b[i];
                                  printf(" +%d",b[i]);
                                  
                                  p; 
                          }
         }
               getch();
}



Это сообщение отредактировал(а) Ufyljy - 12.12.2007, 18:27
PM MAIL   Вверх
zkv
Дата 13.12.2007, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 21
Всего: 92



Цитата(Ufyljy @  12.12.2007,  18:26 Найти цитируемый пост)
1) Как сделать так, чтобы после каждого прохода цикла вверху количество карт в колоде и количество очков обновлялось? // Панель

Цитата(Ufyljy @  12.12.2007,  18:26 Найти цитируемый пост)
2) Два цикла, которые управляют ходом игры... можно поступить более рационально?  // Кто ходит первым

начинать нужно с правильного проектирования, для твоей задачи подошла бы модель документ/представление (паттерн "наблюдатель" вроде)
в твой код даже смотреть не стал. Ты в курсе о существовании в языке такой штуки как функция. Сейчас понять, что происходит в этой портянке более чем неудобно.
PM MAIL   Вверх
Ufyljy
Дата 13.12.2007, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 5.10.2007

Репутация: нет
Всего: 1



Функции,  спасибо!
PM MAIL   Вверх
Ufyljy
  Дата 15.12.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 5.10.2007

Репутация: нет
Всего: 1



Код

#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>

#define br putchar('\n');
#define p br; br;
#define t printf("\t\t");
#define back putchar('\r');

// Блок переменных
int a[9]={2,3,4,6,7,8,9,10,11}, d[36], e[21]; 
char c[4]={'B','P','C','T'}, b[36], que;      
int i, j, k, n, h, r=0, s=rand()/1000, temp, your_points, cpu_points=0;
long int x=20000000;

void conv(void)
{
     if(d[i]==11){printf("Tuz ");}
     if(d[i]==10){printf("Desyatka ");}
     if(d[i]==9){printf("Devyatka ");}
     if(d[i]==8){printf("Vosmerka ");}
     if(d[i]==7){printf("Semerka ");}
     if(d[i]==6){printf("Shesterka ");}
     if(d[i]==4){printf("Korol' ");}
     if(d[i]==3){printf("Dama ");}
     if(d[i]==2){printf("Valet ");}
                                  
     if(b[i]=='B'){printf("\004");}
     if(b[i]=='C'){printf("\003");}
     if(b[i]=='P'){printf("\006");}
     if(b[i]=='T'){printf("\005");}

}          
void stat(void)
{
     printf("Vashe koli4estvo o4kov: %d",your_points);
}

void card(void)
{
     printf("Vi vzyali kartu ");
     conv();
     printf(" +%d",d[i]);
     br;
}

void wait(void)
{
     for(i=0; i<10*x; i++)
     {
              if(i%x==0)
              {
                          printf(".");
              }
     }
     
     back;
     
}

main()
{
      srand((unsigned)time(NULL));
      t; t; printf(">>>>> 21 <<<<<");
      
      // Массив d[36] заполняется значениями из a[9]
      for(k=0; k<4; k++)
      {
                for(i=0; i<9; i++)
                {
                         d[i+r]=a[i];
                }
                r+=9;
      }
      
      r=0;

      // Массив b[36] заполняется значениями из c[4]      
      for(k=0; k<9; k++)
      {
               for(i=0; i<4; i++)
               {
                        b[i+r]=c[i];
               }
               r+=4;
      }
      
      r=0;
      
      // Случайно меняем местами элементы массива d[36]
      for(k=0; k<4; k++)
      {
               for(i=0+r; i<9+r; i++)
               {
                          j=(rand()%9)+r;
                          temp=d[j]; d[j]=d[i]; d[i]=temp;
               }
               r+=9;
      }
      
      r=0;
 
      // Случайно меняем местами элементы массива b[36]     
      for(k=0; k<9; k++)
      {
               for(i=0+r; i<4+r; i++)
               {
                          j=(rand()%4)+r;
                          temp=b[i]; b[i]=b[j]; b[j]=temp;
               }
               r+=4;
      }
      
      p;
      
      // Раздача карт
      puts("Vi berete karti"); wait();
      for(i=0; i<2; i++)
      {
               your_points+=d[i]; cpu_points+=d[i+2];
               card();
               if(i==1)
               {
                       stat(); p;
                       puts("CPU beret karti ");
                       wait();
                       puts("Ok, razdacha zavershena");
                       
                       p;
               }
      }
      
      
      for(i=4; i<36; i++)
      {
               printf("Vam nujno vzyat eshe kartu? "); scanf("%s",&que);
               
               if(que == 'y' || que == 'Y')
               {
                           card(); your_points+=d[i]; stat();
                           p;
               }
               
               if(que == 'n' || que == 'N')
               {
                      break;
               }
               
      }

      br;
      printf("CPU dumaet: brat' li emu eshe kartu ");
      wait();
       
      r=0; h=rand()/1000;
      
      cpu_points=1; // СДЕЛАНО ДЛЯ ТОГО, ЧТОБЫ ВАМ ПОКАЗАТЬ ЛУЧШЕ ПРОБЛЕМУ
      
      if(cpu_points < h+r)
      while((cpu_points < h+r) && (i != 36))
      {
                       br;
                       puts("CPU beret kartu"); cpu_points+=d[i];
                       i++;
      }
      br;
      
      if(r==0)
      {
              printf("CPU otkazalcya brat' karti");
      } 
      
      printf("GAME OVER");
      
      
getch();


Особенно обратите внимание на вот это:
Код

 r=0; h=rand()/1000;
      
      cpu_points=1; // СДЕЛАНО ДЛЯ ТОГО, ЧТОБЫ ВАМ ПОКАЗАТЬ ЛУЧШЕ ПРОБЛЕМУ
      
      if(cpu_points < h+r)
      while((cpu_points < h+r) && (i != 36))
      {
                       br;
                       puts("CPU beret kartu"); cpu_points+=d[i];
                       i++;
      }
      br;
      
      if(r==0)
      {
              printf("CPU otkazalcya brat' karti");
      } 
      
      printf("GAME OVER");


Когда cpu_points увеличивает значение на d[i], программа вылетает
PM MAIL   Вверх
zkv
Дата 15.12.2007, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 21
Всего: 92



Ufyljy, ты получил результат своего плохого стиля.
если бы ты прошелся по своей проге отладчиком, то заметил бы, что в строке 
Код

                       puts("CPU beret kartu"); cpu_points+=d[i];

значение переменной i равно 20000000 (немного выходит за пределы массива, не так ли?) - такое значение она получает в твоем wait цикле.

Замеченные мною недостатки твоей программы:
1. Переменные нужно объявлять как можно ближе к месту использования. Глобальные переменные нужно заводить только когда они нужны. Счетчик цикла - глобальная переменная - это нечто...
2. Слишком большие функции. Попробуй ограничить себя строк по 30 на функцию.
3. Имена переменных должны отражать их суть. Имена h, r, d мне ни о чем не говорят.
4.  s=rand()/1000 - всегда будет генерить одно и тоже значение, т.к. инициализация глобальных переменных происходит до начала выполнения программы, те до вызова srand().
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1414 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.