2014-02-12 2 views
0

Мне нужно создать игровой автомат для моего первого класса C++, и я должен использовать нумерованный тип данных и массив для барабанов. Моя программа в настоящее время выбирает все три барабана случайных кадров, но для жизни меня, я не могу придумать способ сделать ее более компактной. Мне нужно сохранить все значения барабанов, чтобы я мог создать результат выигрыша или потери с помощью утверждений if. Есть ли способ сгруппировать каждую переменную через один и тот же переключатель?Отправка разных переменных с помощью одного оператора switch

#include <iostream> 
#include <cstdlib> 
#include <ctime> 
using namespace std; 

enum frameType {PETROLEUM=1, COAL, NATURAL_GAS, URANIUM, GLOBAL_WARMING,NUCLEAR_DISASTER, DIRT}; 
enum outcomeType {PETROLEUM_WIN, COAL_WIN, NATURAL_GAS_WIN, URANIUM_WIN, LOSS, DRAW}; 

int main() 
{ 
    srand(time(NULL)); 

    frameType frm1; 


    int frameReel1[] = {1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,4,4,5,5,6,7,7,7,7,7}; 
    int frameReel2[] = {1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,4,4,5,5,6,7,7,7,7,7}; 
    int frameReel3[] = {1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,4,4,5,5,6,7,7,7,7,7}; 

    int RandIndex1 = rand() % 25; 
    int RandIndex2 = rand() % 25; 
    int RandIndex3 = rand() % 25; 

    int a = frameReel1[RandIndex1]; 
    int b = frameReel2[RandIndex2]; 
    int c = frameReel3[RandIndex3]; 

    switch (a) 
    { 
    case PETROLEUM: 
    cout << "[petroleum]n"; 
    break; 
    case COAL: 
    cout << "[coal]"; 
    break; 
    case NATURAL_GAS: 
    cout << "[natural gas]"; 
    break; 
    case URANIUM: 
    cout << "[uranium]"; 
    break; 
    case GLOBAL_WARMING: 
    cout << "[global warming]"; 
    break; 
    case NUCLEAR_DISASTER: 
    cout << "[nuclear disaster]"; 
    break; 
    case DIRT: 
    cout << "[dirt]"; 
    break; 
} 

switch (b) 
{ 
case PETROLEUM: 
    cout << "[petroleum]"; 
    break; 
case COAL: 
    cout << "[coal]"; 
    break; 
case NATURAL_GAS: 
    cout << "[natural gas]"; 
    break; 
case URANIUM: 
    cout << "[uranium]"; 
    break; 
case GLOBAL_WARMING: 
    cout << "[global warming]"; 
    break; 
case NUCLEAR_DISASTER: 
    cout << "[nuclear disaster]"; 
    break; 
case DIRT: 
    cout << "[dirt]"; 
    break; 
} 

switch (c) 
{ 
case PETROLEUM: 
    cout << "[petroleum]"; 
    break; 
case COAL: 
    cout << "[coal]\n"; 
    break; 
case NATURAL_GAS: 
    cout << "[natural gas]"; 
    break; 
case URANIUM: 
    cout << "[uranium]"; 
    break; 
case GLOBAL_WARMING: 
    cout << "[global warming]"; 
    break; 
case NUCLEAR_DISASTER: 
    cout << "[nuclear disaster]"; 
    break; 
case DIRT: 
    cout << "[dirt]"; 
    break; 
} 
} // end main 

ответ

1

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

#include <iostream> 
#include <cstdlib> 
#include <ctime> 
using namespace std; 

enum frameType {PETROLEUM=1, COAL, NATURAL_GAS, URANIUM, GLOBAL_WARMING,NUCLEAR_DISASTER, DIRT}; 
enum outcomeType {PETROLEUM_WIN, COAL_WIN, NATURAL_GAS_WIN, URANIUM_WIN, LOSS, DRAW}; 


void printFrameType(int a) 
{ 
    switch (a) 
    { 
    case PETROLEUM: 
     cout << "[petroleum]n"; 
     break; 
    case COAL: 
     cout << "[coal]"; 
     break; 
    case NATURAL_GAS: 
     cout << "[natural gas]"; 
     break; 
    case URANIUM: 
     cout << "[uranium]"; 
     break; 
    case GLOBAL_WARMING: 
     cout << "[global warming]"; 
     break; 
    case NUCLEAR_DISASTER: 
     cout << "[nuclear disaster]"; 
     break; 
    case DIRT: 
     cout << "[dirt]"; 
     break; 
    } 
} 


int main() 
{ 
    srand(time(NULL)); 

    frameType frm1; 

    int frameReel1[] = {1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,4,4,5,5,6,7,7,7,7,7}; 
    int frameReel2[] = {1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,4,4,5,5,6,7,7,7,7,7}; 
    int frameReel3[] = {1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,4,4,5,5,6,7,7,7,7,7}; 

    int RandIndex1 = rand() % 25; 
    int RandIndex2 = rand() % 25; 
    int RandIndex3 = rand() % 25; 

    int a = frameReel1[RandIndex1]; 
    int b = frameReel2[RandIndex2]; 
    int c = frameReel3[RandIndex3]; 

    printFrameType(a); 
    printFrameType(b); 
    printFrameType(c); 
} // end main 

Есть другие способы, чтобы улучшить этот код, но вы сказали, что это ваш первый класс C++, так что я не накроет вас с новой информацией. Начиная с frameReel1, frameReel2 и frameReel3 - то же самое, почему бы не просто один и назвать его frameReel?

Вместо того, чтобы использовать функцию, чтобы сократить код, вы можете также использовать цикл как это:

for(int i = 0; i < 3; i++) 
{ 
    any code you put in here will run three times, so 
    if you put the random choice and the switch statement 
    in here, it will print 3 random frame types 
} 

Вы узнаете, что означает for(int i = 0; i < 3; i++) позже, но вы можете рассматривать его как магия сейчас. Измените 3 на другой номер, если вы хотите, чтобы он запускался разное количество раз.

Ответы Tony D's и LeonardBlunderbuss лучше, но включают более сложные концепции.

0

Вы можете написать многоразовые вспомогательные функции:

std::ostream& operator<<(std::ostream& os, frameType x) 
{ 
    switch (a) 
    { 
     case PETROLEUM:  return os << "[petroleum]n"; 
     case COAL:    return os << "[coal]"; 
     case NATURAL_GAS:  return os << "[natural gas]"; 
     case URANIUM:   return os << "[uranium]"; 
     case GLOBAL_WARMING: return os << "[global warming]"; 
     case NUCLEAR_DISASTER: return os << "[nuclear disaster]"; 
     case DIRT:    return os << "[dirt]"; 
     default:    return os << "<invalid>"; // or throw? 
    } 
} 

Тогда:

frameType a = static_cast<frameType>(frameReel1[RandIndex1]); 
... 

std::cout << a << b << c; 

(Вы должны действительно хранения frameType с в frameReel1/2/3

1
.

попробуйте этот код:

int outcomes[3] = {frameReel1[RandIndex1], frameReel2[RandIndex2], frameReel3[RandIndex3]}; 
for(int i=0; i<3; i++) 
    switch(outcomes[i]) 
    // Cases... 
Смежные вопросы