2015-09-30 1 views
0

Я должен сделать программу, которая в основном простая форма блэкджека. Программа произвольно рисует 4 карты из стандартной колоды 52, а номер карты должен отображаться вместе с ее значением карты. (Например, если номер карты равен 43, он имеет значение 4). Стоимость карт 2-10 стоит их стоимости, туз стоит 1, стоят лицевые карты (11-13, домкрат, королева, король) 10. Когда общая сумма превышает 21, программа должна отображать «B» после общей суммы. У меня проблемы с последними двумя частями. Я не могу понять, как получить лицевые карты равными 10 и отобразить «B» без использования логических операторов, реляционных операторов или конструкций выбора, таких как оператор if. Любая помощь будет оценена! Благодаря! Вот код, который я до сих пор:Как бы присвоить значения 11, 12 и 13 всем равным 10 без использования логических операторов, реляционных операторов или конструкций выбора в C?

#include<stdio.h> 
#include<math.h> 
#include<stdlib.h> 

int seedValue(); 
int card(); 
int cardValue(int); 
int cardValue2(int); 
int cardValue3(int); 
int cardValue4(int); 
void printStatements(int, int, int, int, int, int, int, int); 

int main() 
{ 
    int seed; 
    int cardnum1; 
    int cardnum2; 
    int cardnum3; 
    int cardnum4; 
    int value1; 
    int value2; 
    int value3; 
    int value4; 

    seed = seedValue(); 

    srand(seed); 

    cardnum1 = card(); 
    cardnum2 = card(); 
    cardnum3 = card(); 
    cardnum4 = card(); 

    value1 = cardValue(cardnum1); 
    value2 = cardValue2(cardnum2); 
    value3 = cardValue3(cardnum3); 
    value4 = cardValue4(cardnum4); 

    printStatements(cardnum1,cardnum2,cardnum3,cardnum4,value1,value2,value3,value4); 

    return(0); 
} 

int seedValue() 
{ 
    int seed; 

    printf("Enter the seed value: "); 
    scanf("%d",&seed); 

    return(seed); 
} 

int card() 
{ 
    int cardval; 

    cardval = (rand() % 52) + 1; 

    return(cardval); 
} 

int cardValue(int cardnum1) 
{ 
    int val1; 


    val1 = cardnum1 % 13; 

    return(val1); 
} 

int cardValue2(int cardnum2) 
{ 
    int val2; 

    val2 = cardnum2 % 13; 

    return(val2); 
} 

int cardValue3(int cardnum3) 
{ 
    int val3; 

    val3 = cardnum3 % 13; 

    return(val3); 
} 

int cardValue4(int cardnum4) 
{ 
    int val4; 

    val4 = cardnum4 % 13; 

    return(val4); 
} 

void printStatements(int cardnum1, int cardnum2, int cardnum3, int cardnum4, int value1, int value2, int value3, int value4) 
{ 
    printf("1. Card generated: %d Card value: %d\n",cardnum1,value1); 
    printf("2. Card generated: %d Card value: %d\n",cardnum2,value2); 
    printf("3. Card generated: %d Card value: %d\n",cardnum3,value3); 
    printf("4. Card generated: %d Card value: %d\n",cardnum4,value4); 

    printf("Total points generated is: %d\n",value1 + value2 + value3 + value4); 
} 
+7

* "без использования логических операторов, операторов отношения или конструкции выбора, таких как, если заявление «Почему бы не использовать их? Если это назначение, и это ограничение в задании, посмотрите на свою недавнюю работу, и она должна четко указывать на то, что использовать. –

+2

Массив из 13 целых чисел, содержащий значение карты? –

+1

Когда у вас есть переменные типа 'cardnum1',' cardnum2', 'cardnum3',' cardnum4', вы почти наверняка хотите получить массив: 'int cardnum [4]'. –

ответ

-1

, если вы можете использовать%

val - val % 10 
0

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

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

к вашему вопрос о сохранении значений карт, равных 10 для всех лицевых карточек, которые могут быть обработаны в вашей функции cardValue с помощью простого теста после того, как вы уменьшите значение до 1 - 13. Простой if (value >= 10) value = 10; гарантирует, что все лицевые карты имеют значение 10.

С внесенными изменениями, хотя и длительный, он немного короче оригинала. Дайте ему попробовать и дайте мне знать, если у вас есть какие-либо вопросы:

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

#define SUITS 4 

int seedValue(); 
int card(); 
int cardValue(int); 
void printDeal (int *cards, int *values); 

int main() 
{ 
    int cardnum[SUITS] = {0}; 
    int cardval[SUITS] = {0}; 
    int i = SUITS; 

    srand (seedValue()); 

    while (i--) { 
     cardnum[i] = card(); 
     cardval[i] = cardValue (cardnum[i]); 
    } 

    printDeal (cardnum, cardval); 

    return 0; 
} 

int seedValue() 
{ 
    int seed; 

    printf ("Enter the seed value: "); 
    scanf ("%d",&seed); 

    return seed; 
} 

int card() 
{ return (rand() % 52) + 1; } 

int cardValue (int cardnum) 
{ 
    int val = cardnum % 13; 

    return val > 10 ? 10 : val; 
} 

void printDeal (int *cards, int *values) 
{ 
    int i, pts = 0; 

    putchar ('\n'); /* just to make it look nice */ 

    for (i = 0; i < SUITS; i++) { 
     printf (" Card[%2d] : generated: %2d value: %2d\n", 
       i + 1, cards[i], values[i]); 
     pts += values[i]; 
    } 
    printf ("\nTotal points generated : %d\n\n", pts); 
} 

Используйте/Output

$ ./bin/cards 
Enter the seed value: 21 

Card[ 1] : generated: 11 value: 10 
Card[ 2] : generated: 3 value: 3 
Card[ 3] : generated: 52 value: 0 
Card[ 4] : generated: 17 value: 4 

Total points generated : 17