Simple Lotto Game

I have developed a Lotto Game in C for my Assignment, it allows a user to enter one of the 6 menu options.

From the menu the user would be able to view the numbers they have chosen, another option would sort the numbers in ascending order, in this case I used bubble sort.

What it does in the 1st menu is read the 6 numbers that the user has entered from the keyboard. The number must range from 1-42 and if the user enters any number out of bounds it will give an error message. It also gives an error message if the user enters a number that they has entered already.

Another option will compare the users numbers with the winning numbers and see if they match.

It will also display how many times a number has been entered, for example if the user entered 5 twice from 4 games it will display Number 5 has been selected 2 times. without exiting the program. This can be selected from the menu too.

Last but not least, the last option from the menu exits the program.

I added key features such as displaying the menu after finishing with the current option from the menu and options 2,3,4 and 5 only to be selected if option 1 has been selected from the menu.

Please take a look and let me know how this code could be improved to make this a better Lotto Game.

Here is the code:

#include <stdio.h>
#include <stdlib.h>
#define SIZE 6           // Size of the array as only 6 numbers are entered.
#define MAXOUT 43       // For Frequency use when displaying the numbers.
#define ZERO 0         // Replacing 0 with Zero.
#define ARRAYSIZE 500 // Storing the frequency, 500 should be enough.

/*Prototypes*/

//For Option 1
//

//For Option 2
//

//For Option 3
//

//For Option 4
//

//For Option 5
//

//For Option 6
//

//Ninja fix for entering the number twice.
//
int error_dubhandle(int *user_lottonumber);

//Out of bound error fix
//
void error_handle1();

//Main
//
int main(void)
{
//Main Variables.
//
int start; // Used to select from the menu.
int loop; // To display the menu over and over.

loop = ZERO; // To display the menu over and over in the do while loop.

//User error checking select 1 before selecting other options.
//
int selectOnefirst = 0;

//Where the user numbers are stored.
//
int user_lottonumber[SIZE];

//The winning numbers.
//
int winning_numbers[SIZE] = {1,3,5,7,9,11};

//Frequency array storage
//
int frequencyChecker[ARRAYSIZE] = {ZERO};

//The loop for the main to be displayed over and over
//Until the program ends.
//
do
{
//Printing out the menu. With a nice boarder around it.
//
printf("\n--------------------------------------------Gabriel Grimberg---------------------------------------------------");
printf("\n***************************************************************************************************************");
printf("\n* 1. - Enter your numbers in to play.                                                                         *");
printf("\n* 2. - Display the numbers you enters.                                                                        *");
printf("\n* 3. - Sort your numbers in an increasing order.                                                              *");
printf("\n*      (This is mandatory, it will sort the numbers you entered in an increasing order.)                      *");
printf("\n* 4. - See if you won the lotto!                                                                              *");
printf("\n* 5. - Display the frequency of the numbers. (Record of times a number has been selected.)                    *");
printf("\n* 6. - Exit the Lotto Game.                                                                                   *");
printf("\n***************************************************************************************************************\n\n");

//Letting the user know to press 1 before pressing 2-5.
//
printf("You must complete option 1 from the menu before moving on.");

//
scanf("%d", &start);

fpurge(stdin); //Clears the buffer of given stream.

//Making sure the user can only select the options from 1-6 from the menu.
//
if(start > 6)
{
error_handle1();
}

//Calling the function to allow the user to enter the numbers.
//
if(start == 1)
{
selectOnefirst++;
}

//Calling the function to show the user entered numbers.
//
if(start == 2 && selectOnefirst == 1)
{
}

//Calling the function to sort the numbers in an increasing order.
//
if(start == 3 && selectOnefirst == 1)
{
}

//Calling the function to see if the user won the lotto.
//
if(start == 4 && selectOnefirst == 1)
{
}

//Calling the function to see the frequency of numbers
//
if(start == 5 && selectOnefirst == 1)
{
selectOnefirst--;
}

//Calling the function to exit the program.
//
if(start == 6)
{
}

}
while (loop == ZERO); //end loop

}//End Int Main()

/*Implementing Functions*/

//Getting the users numbers
//
{
//Declaring the Variables.
//
int i;
int number_checker;
number_checker = 1;

//Resetting the Array to 0.
//
for(i = ZERO; i < SIZE; i++)
{
*(user_lottonumber + i) = ZERO;
}

//Displaying to the user the information.
//
printf("Welcome to the Lotto Game! Time to pick your numbers.\n");

printf("Note: You must pick from 1-42\n\n"); //Telling the user to pick from 1-42.

for(i = ZERO; i < SIZE; i++)
{
do
{
number_checker = 1;

//Telling the user to enter in their 6 numbers.
//
scanf("%d", user_lottonumber + i);

fpurge(stdin); //Clears the buffer of given stream.

//Error checking.
//
if(error_dubhandle(user_lottonumber) || (!(*(user_lottonumber + i) > ZERO && *(user_lottonumber + i) < 43) ))
{
number_checker = ZERO;
printf("\nThe number you have selected is either already selected or invalid.\n");
printf("\nPlease select a number between 1-42 also don't select the same number again.\n");
}

//Calculating the Frequency.
//
if(number_checker == 1)
{
//Checking the numbers entered on against the numbers on the frequencyChecker.
//
*(frequencyChecker + *(user_lottonumber + i)) = *(frequencyChecker + *(user_lottonumber + i)) + 1;
}

}//End do

while(!number_checker); //While not 0 run the code.

}//End for

//Displaying the user entered numbers.
//
{
//Declaring the Variables.
//
int i;

printf("Here are the numbers that you have selected: \n");

for(i = ZERO; i < SIZE; i++)
{
printf("%d ",*(user_lottonumber+i));
}

}//End main2()

//Organising the User Lotto numbers.
//
{
//Declaring the Variables.
//
int n;
int m;
int place;

//Sorting using Bubble Sort.
//
for(n = ZERO; n < SIZE; n++)
{
for(m = n; m < SIZE; m++)
{
if(*(user_lottonumber+n) > *(user_lottonumber+m)) //Sorting in an ascending order.
{
place = *(user_lottonumber+n);
*(user_lottonumber+n) = *(user_lottonumber+m);
*(user_lottonumber+m) = place;

}//End if.

}//End for.

}//End for.

//Displaying the ordered numbers.
//
printf("Here are your numbers ordered: \n");

for(n = ZERO; n < SIZE; n++)
{
printf("%d ", *(user_lottonumber+n) );
}

}//End main3()

//Seeing if the user won
//
{
//Declaring the Variables.
//
int i;
int c;
int compareNum;
int bonusNum;
int bonusCount;
bonusNum   = 42; //Setting the bonus number.
bonusCount = ZERO;
compareNum = ZERO;

//The counter that checks if the user matches the winning numbers.
//
for(i = ZERO; i < SIZE; i++)
{
for(c = ZERO; c < SIZE; c++)
{
if(*(user_lottonumber+i) == *(winning_numbers+c))
{
compareNum++; //Incrementing.
}
}
}

//The counter that checks if the user has the bonus number
//
for(i = ZERO; i < SIZE; i++)
{
if(*(user_lottonumber) == bonusNum)
{
bonusCount++; //Incrementing.
}
}

//If 6 numbers match the user wins this.
//
if(compareNum == 6)
{
printf("Congratulations, You have won the Jackpot!");
}

//If 5 numbers and the bonus matches, the user wins this.
//
if(compareNum == 5 && bonusCount == 1)
{
printf("Congratulations, You have won a Car!");
}

//If 5 numbers match the user wins this.
//
if(compareNum == 5)
{
printf("Congratulations, You have won a Holiday!");
}

//If 4 numbers and the bonus matches, the user wins this.
//
if(compareNum == 4 && bonusCount == 1)
{
printf("Congratulations, You have won a Weekend Away!");
}

//If 4 numbers match the user wins this.
//
if(compareNum == 4)
{
printf("Congratulations, You have won a Night Out!");
}

//If 3 numbers and the bonus matches,c the user wins this.
//
if(compareNum == 3 && bonusCount == 1)
{
printf("Congratulations, You have won a Cinema Ticket!");
}

//If the none of the numbers the user entered match, the user doesn't win anything.
//
if(compareNum == ZERO || compareNum == 1 || compareNum == 2 || compareNum == 3)
{
printf("Hard luck, you have not won anything.");
}

//Frequency of numbers.
//
{
//Declaring the Variables.
//
int i;
int j;

//Prints the frequency of each element.
//
for(i = ZERO; i < MAXOUT; i++)
{
if(*(frequencyChecker+i) != ZERO)
{
printf("Number %d has been selected %d times.\n", i, *(frequencyChecker+i) );
}
}

//Exiting the program
//
{
//Displaying an exit message.
//
printf("\nYou have chosen to exit the program. Thanks for playing the Lotto Game!\n");

//Terminating the code.
//
exit(ZERO);

//Error Checking making sure the user doesn't enter the same number in again.
//
int error_dubhandle(int *user_lottonumber)
{
//Declaring the Variables.
//
int atk;

{
for (atk = adding + 1; atk < SIZE; atk++)
{
//Checks if the array has any duplicates.
//
if (*(user_lottonumber + adding) == *(user_lottonumber + atk) && *(user_lottonumber + atk) != ZERO)
{
return(1); //If there is a duplicate then return 1.

}//End if.

}//End second for.

}//End first for.

return(ZERO); //If there is no duplicate return 0.

}//End error_dubhandle();

//Out of bound error fixer
//
void error_handle1()
{
//Showing the user the problem, in this case if the user doesn't select
//between 1-6 from the menu then this will show up.
//
printf("\n-->You are now going to be shown the menu again, please select appropriately.<--\n");

}//End error_handle1()


Comments should tell the reader why you're doing something, not what you're doing. Comments like this are redundant:

//For Option 6
//


Method Naming

Consider giving your functions more meaningful names that describe what they do. Using the example above, menu_6. Unless you already have the menu in your head the name is meaningless. A better name might be menu_exit_game.

Magic Numbers Vs Defines

Replacing magic numbers with meaningful constants is a good thing, however simply replacing a magic number with it's word value adds little value. Consider:

#define ZERO 0


What should ZERO be used for? You're using it as a direct replacement for 0 in your code, but not always:

int selectOnefirst = 0;


Another example is SIZE, SIZE of what? NUM_LOTTERY_NUMBERS perhaps? Naming is hard, however if you get it right it makes your programs a lot more expressive.

Unused variables

If you change your plan for your program, don't forget to clean up after yourself. For example in menu_5, you're declaring two variables that you're not using (j and adder).

Expressive names

Consider how much easier this would be to read with more expressive names and meaningful constants:

//If 6 numbers match the user wins this.
//
if(compareNum == 6)
{
printf("Congratulations, You have won the Jackpot!");
}
//If 5 numbers and the bonus matches, the user wins this.
//
if(compareNum == 5 && bonusCount == 1)
{
printf("Congratulations, You have won a Car!");
}


becomes:

if(matched_numbers == NUM_LOTTERY_NUMBERS)
{
printf("Congratulations, You have won the Jackpot!");
}
if(matched_numbers == (NUM_LOTTERY_NUMBERS - 1) && matched_bonus)
{
printf("Congratulations, You have won a Car!");
}


Be Consistent

Your using different conventions for naming your variables. You've got both selectOnefirst and user_lottonumber. Pick a naming strategy and be consistent throughout the program.

Bug when matching 3 numbers and 1 bonus

You're not returning from your matches and you're not using ifs, so if compareNum == 3, both of these if clauses are matched:

if(compareNum == 3 && bonusCount == 1)
{
printf("Congratulations, You have won a Cinema Ticket!");
}

if(compareNum == ZERO || compareNum == 1 || compareNum == 2 || compareNum == 3)
{
printf("Hard luck, you have not won anything.");
}


You could either update your code flow, or change the final if to something like:

if(compareNum <= 2 || (compareNum == 3 && !bonusCount))