C: игра в кости / кости - PullRequest
       14

C: игра в кости / кости

0 голосов
/ 08 февраля 2012

Цель этого кода: смоделировать 100 игр CRAPS и записать количество потерь в первом раунде, побед в первом раунде, потерь во втором раунде ПЛЮСы и выигрыши во втором раунде ПЛЮСЫ.

Те из вас, кто не знаком с правилами CRAPS; вы в основном бросаете два кубика, если в результате ничего, кроме 2, 3 или 12, вы снова бросаете (число, которое вы бросили в этом ходу, сохраняется и добавляется к вашим очкам). Если вы бросаете 7 или 11, вы автоматически выигрываете.

Вот где я сейчас нахожусь:

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

int main ()
{
int i,d1,d2,sumd,sumd2;
double winf = 0, lostf = 0, winp = 0, lostp = 0;
printf("This program will simulate the game of craps for 100 times.\n");

for (i=0; i<100; i++) {
    d1 = rand()%6+1;
    d2 = rand()%6+1;
    sumd = d1 + d2;

    if (sumd==7 || sumd==11) {
        printf("You rolled a 7 or an 11, you win.\n");
        winf++;
    }
    if (sumd==2 || sumd==3 || sumd==12) {
        printf("You rolled a 12, a 3, or a 2, you lose.\n");
        lostf++;
    }
    if (sumd==4 || sumd==5 || sumd==6 || sumd==8 || sumd==9 || sumd==10) {
        while (1) {
            d1 = rand()%6+1;
            d2 = rand()%6+1;
            sumd2 = d1 + d2;

            if (sumd2==sumd){ 
                printf("You rolled your points, you win.\n");
                winp++;
            break;}
            if (sumd==7){ 
                printf("You rolled a 7, you lose.\n");
                lostp++;
            break;}
        }
    }
}

printf("First roll wins: %lf, First roll loses: %lf, Second roll wins: %lf, Second roll loses: %lf. ", winf, lostf, winp, lostp);
}

Все, что я прошу у вас, это чтобы вы дали мне варианты того, как я могу сохранить эти точки для печати в конце ??

Более того, я чувствую, что мой код может быть написан лучше и менее излишне, предложения?

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

int main ()
{
int i,d1,d2,sumd,sumd2;
double winf = 0, lostf = 0, winp = 0, lostp = 0;

printf("This program will simulate the game of craps for 100 times. Press any key to continue.\n");
//getchar();

for (i=0; i<100; i++) {
    d1 = rand()%6+1;
    d2 = rand()%6+1;
    sumd = d1 + d2;

switch(sumd){
    case 7:
    case 11:
        printf("You rolled %d, you win.\n", sumd);
        winf++;
        break;
    case 2:
    case 3:
    case 12:
        printf("You rolled %d, you lose.\n", sumd);
        lostf++;
        break;
    default:
        while (1) {
            d1 = rand()%6+1;
            d2 = rand()%6+1;
            sumd2 = d1 + d2;

            if (sumd2==sumd){ 
                printf("You rolled your points(%d), you win.\n",sumd);
                winp++;
            break;}
            if (sumd2==7){ 
                printf("You rolled a 7, you lose.\n");
                lostp++;
            break;}
        }
}

}
printf("First roll wins: %lf, First roll loses: %lf, Second roll wins: %lf, Second roll loses: %lf. \n", winf, lostf, winp, lostp);
}

Ответы [ 2 ]

2 голосов
/ 08 февраля 2012

Вы можете довольно легко уплотнить оба вхождения

d1 = rand()%6+1;
d2 = rand()%6+1;
sumd2 = d1 + d2;

в функцию:

int rolldice(){
    int d1,d2;
    d1 = rand()%6+1;
    d2 = rand()%6+1;
    return d1 + d2;
}

Или в виде однострочного:

int rolldice(){
    return (rand()%6)+(rand()%6)+2;
}

Тогда вы будете писать

sumd = rolldice();
1 голос
/ 08 февраля 2012

Ваше решение поместить результаты в целые числа для печати в конце выглядит разумным. Если я правильно понял вопрос, кажется, что winp и lostp должны добавить sumd2 вместо простого увеличения. Или это уже работает нормально, и я неправильно читаю вопрос?

Возможно, вы захотите взглянуть на оператор switch:

switch(sumd){
    case 7:
    case 11:
        //existing code goes here
        break;

    case 2:
    case 3:
    case 12:
        //more existing code
        break;

    default:
        //code for games that don't end on the first turn
        break;
}
...