Skip to content

Instantly share code, notes, and snippets.

@CraigRodrigues CraigRodrigues/critical.c
Last active Jun 19, 2016

What would you like to do?
[2016-06-13] Challenge #271 [Easy] Critical Hit
#include <stdio.h>
#include <cs50.h>
#include <math.h>
/* [2016-06-13] Challenge #271 [Easy] Critical Hit
* Critical hits work a bit differently in this RPG. If you roll the maximum value on a die, you
* get to roll the die again and add both dice rolls to get your final score. Critical hits can
* stack indefinitely -- a second max value means you get a third roll, and so on. With enough
* luck, any number of points is possible.
double p = 0;
// probability of a favorable outcome
double probability(double d, double h)
if (d < h)
return ((1/d) * probability(d,(h-d))); // recursive case.
if (d >= h)
return ((d-h)+1)/d; // base case of a favorable outcome in the number of sides is >= hp left
return 0;
int main(void) {
// Disable stdout buffering
setvbuf(stdout, NULL, _IONBF, 0);
// Put the die numbers and hp numbers into arrays
int arrd[] = {4,4,4,4,1,100,8};
int arrh[] = {1,4,5,6,10,200,20};
// Need to loop through arrays to be able to print out the outputs
for (int i = 0; i < 7; i++)
// d and h just look better to me than using the arrd and arrh
double d = arrd[i];
double h = arrh[i];
p = probability(d,h);
printf("d = %i, h = %i, output = %.9f\n", arrd[i], arrh[i], p); //print to 9 decimal places
d = 4, h = 1, output = 1.000000000
d = 4, h = 4, output = 0.250000000
d = 4, h = 5, output = 0.250000000
d = 4, h = 6, output = 0.187500000
d = 1, h = 10, output = 1.000000000
d = 100, h = 200, output = 0.000100000
d = 8, h = 20, output = 0.009765625

This comment has been minimized.

Copy link
Owner Author

CraigRodrigues commented Jun 19, 2016

My solution to this coding problem on reddit:

I am using CS50's library as that is the only programming class I'm taking at the moment and am only on week 4. I am sure there is a way to simplify the probability formula as well.

Biggest hurdle was thinking about what the recursive case and base case would be. The twist is that there is always a chance if you roll the largest number on the die so (1/d) * (the next probability) and so on and so forth.

I am not so good with understanding how to use the data types so I chose double for everything since a lot of division was involved. Also I don't know a good way to format the output. I don't know how to put it into a nice grid or anything like that.

Also I should be dealing with memory allocation and clearing, but I only just learned how in CS50 and haven't implemented it over there yet.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.