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

Задача: игра "Поймать парасёнка" - C++

Восстановить пароль Регистрация
 
arreke
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 13
20.09.2012, 17:58     Задача: игра "Поймать парасёнка" #1
Описание

"Поймать парасёнка" - один из видов игры в карты.
Допустим за игральным столом 4 игрока.
Ваша задача посчитать итоговый результат этих игроков, следуя правилам подсчёта указанным ниже:
  1. S, H, D, C - соответственно пики, червы, бубны и трефы.
    Цифры от 1 до 13 соответственно A, 2, ..., Q, K.
    Например, H1 это червы A, S13 это пики K.
  2. В конце игры, учитываются лишь козырные карты, к которым относятся, S12 (парасенок), все червы, D11 (ягненок) и C10 (удвоение), итого 16 карт. Всы остальные карты не считаются. Если у игрока нет ни одной из этих 16-ти козырных карт, у него 0 очков.
  3. Если у игрока имеется только одна козырная карта C10, он получает +50 очков. Если кроме C10 есть ещё козырные карты, то сумма очков этих козырных карт удваивается.
  4. Если у игрока на руках не все червы, то за каждую из 13 карт от H1 до H13 у игрока отнимается соответственное колличество очков: -50,-2,-3,-4,-5,-6,-7,-8,-9,-10,-20,-30,-40. А за S12 у игрока отнимается -100, а за D11 игроку прибавляется +400.
  5. Если у игрока на руках все червы от H1 до H13, то ситуация нижеследующая:
  • За все червы он получает +200 очков
  • Если S12, D11, он съедают все его червы, и он получает +500 очков.
  • C10 все также считается по правилу, которое было описано выше.

Пример 1: Ниже приведены козырные карты на руках у игроков:

S12 H3 H5 H13
D11 H8 H9
C10 H1 H2 H4 H6 H7
H10 H11 H12

колличество очков каждого из игроков: -148, +83, -138, -60.

Пример 2: Ниже приведены козырные карты на руках у игроков: (у четвертого игрока нет козырных карт)

H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13
S12 C10
D11

колличество очков каждого из игроков: +200, -200, +100, 0.

Пример 3: Если у одно из игроков все 16 козырей, он получает +1000 очков. У всех остальных игроков по 0 очков.


Input

Может вводится несколько вариантов положения карт у игроков, каждый вариант состоит из 4 строк, 1-ое число каждой строки соответстует колличеству козырных карт этого игрока, остальные вводимые данные - козырные карты этого игрока. Вводимые данные разделяются пробелами. Между вводимыми строками нет пустых строк.
Программа завершается, когда у всех игроков будет по 0 козырей.


Output

Каждая выводимая строка соответствует результату каждой игры, строка состоит из 4 чисел (со знаком плюса или минуса, кроме нуля), числа разделяются пробелом. Между выводимыми строками нет пустых строк.

Например, Input:
4 S12 H3 H5 H13↵
3 D11 H8 H9↵
6 C10 H1 H2 H4 H6 H7↵
3 H10 H11 H12↵
13 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13↵
2 S12 C10↵
1 D11↵
0↵
0↵
0↵
0↵
0↵

Output:
-148 +83 -138 -60↵
+200 -200 +100 0↵


Подскажите, пожалуйста, как решить.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2012, 17:58     Задача: игра "Поймать парасёнка"
Посмотрите здесь:

C++ "Поймать" сообщение от LISTBOX
C++ Карточная игра "Дурак" - Ошибка загрузки dll карт
Небольшой пример. Игра "змейка" - как в ней делают препятствия C++
C++ Игра "Жизнь"; Нужно, чтобы первое поколение задавалось оператором (с клавиатуры)
C++ Игра "Крестики нолики", почему не работает проверка окончания?
Игра "Чёт-Нечет" на поле NxN, перевести с Делфи на С++ C++
C++ Текстовая игра "Кто хочет стать миллионером?" с использованием классов
C++ Игра "Однорукий бандит". Кольцевая очередь. Двусвязный список

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
20.09.2012, 19:24     Задача: игра "Поймать парасёнка" #2
Цитата Сообщение от arreke Посмотреть сообщение
Подскажите, пожалуйста, как решить
Вы чё прикалывайтесь ?
Без ваших наработок ? И что бы кто то за вас это сделал ?
Дааааа !!!! Вам господин во фриланс путёвка заказана .
arreke
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 13
21.09.2012, 19:47  [ТС]     Задача: игра "Поймать парасёнка" #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
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int check ()
{
  int i, j, len[4], Sum[4], l, h[13], C10, S12, D11, H, finish;
  char str[256], p[4][17][5];
  char *pch;
  
// Enter elements 
  
  for (i=0; i<4; i++) {
    scanf("%d", &len[i]); scanf("%[^\n]s", str);  // gets(str);
    //printf ("%d\n%s\n", len[i], str);
    pch = strtok(str, " "); l=0;
    while (pch != NULL)
    {
      //printf ("%s\n",pch);
      sprintf(p[i][l++], "%s", pch);
      pch = strtok (NULL, " ");
    }
    //for (j=0; j<len[i]; j++) printf ("%s\n", p[i][j]);
  }
  
// Check exit
 
  finish=1; for (j=0; j<4; j++) if (len[j]!=0) finish=0;
  if (finish==1) return finish;
  
// Check elements 
 
  for (i=0; i<4; i++) {
    Sum[i]=0; C10=0; S12=0; D11=0; H=1; 
    for (j=0; j<13; j++) { h[j]=0; }
    for (j=0; j<len[i]; j++) {
      //printf ("%s", p[i][j]);
      if (strcmp("C10", p[i][j]) == 0) { C10=1; }
      if (strcmp("S12", p[i][j]) == 0) { S12=1; }
      if (strcmp("D11", p[i][j]) == 0) { D11=1; }
 
      if (strcmp("H1", p[i][j]) == 0) { h[0]=50; }
      if (strcmp("H2", p[i][j]) == 0) { h[1]=2; }
      if (strcmp("H3", p[i][j]) == 0) { h[2]=3; }
      if (strcmp("H4", p[i][j]) == 0) { h[3]=4; }
      if (strcmp("H5", p[i][j]) == 0) { h[4]=5; }
      if (strcmp("H6", p[i][j]) == 0) { h[5]=6; }
      if (strcmp("H7", p[i][j]) == 0) { h[6]=7; }
      if (strcmp("H8", p[i][j]) == 0) { h[7]=8; }
      if (strcmp("H9", p[i][j]) == 0) { h[8]=9; }
      if (strcmp("H10", p[i][j]) == 0) { h[9]=10; }
      if (strcmp("H11", p[i][j]) == 0) { h[10]=20; }
      if (strcmp("H12", p[i][j]) == 0) { h[11]=30; }
      if (strcmp("H13", p[i][j]) == 0) { h[12]=40; }
    }
    
    for (j=0; j<13; j++) if (h[j]==0) { H=0; }
    if (H==1) {
      if ((S12==1) && (D11==1)) Sum[i]+=500; else Sum[i]+=200;
    } else {
      for (j=0; j<13; j++) Sum[i]-=h[j];
      if (S12==1) Sum[i]-=100;
      if (D11==1) Sum[i]+=100;
    }
    if (C10==1) {
      if (len[i]==1) Sum[i]=50; else Sum[i]*=2;
    }
    if (i>0) printf(" ");
    if (Sum[i]>0) printf("+%d", Sum[i]); else printf("%d", Sum[i]);
  }
  printf("\n");
  
  return finish;
}
 
int main() 
{  
  int finish;
  do {
    finish = check();
  } while (finish!=1);
 
  printf("\n");
  system("PAUSE");
  return 0;  
}
Вроде работает, но на одном из вариантов ввода выдаёт неправильный результат. Где может быть ошибка?
Yandex
Объявления
21.09.2012, 19:47     Задача: игра "Поймать парасёнка"
Ответ Создать тему
Опции темы

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