Hello I made the following program for someone on this site that had requested the game. I didn't have a problem making it. During some tests I conducted I ran into a problem, at least what had seemed like a problem.
Player 1 will win on average 90-96% of the time. This test is based on executing 9000 'plays' per execution of the program its self. I've ran 5 instances of the program each executing 9000 plays and they all have the same result.
My question is why does Player 1 always win? I mean are not the numbers supposed to be random? It doesn't seem that the Random class isn't truly being random. Also I do know that the Random class is based upon a seed to generate the numbers. I tried using a static version of Random as mentioned in an article on the internet somewhere. The article states that making the Random Class static that it will produce truly random numbers. I also looked at generating Random Numbers with the Cryptographic.RNG(something) method. But I've found that that only generates a random string and not a number.
So if anyone has any ideas to make this game a bit more 'balanced' then that would be great.
EDIT:I found the problem Line#77 resets nRolls2 to 2. Its amazing the simple mistakes that can ruin a program.
Without further ado here is the code:
using System;
using System.Collections.Generic;
using System.Text;
namespace Dice_Golf_Game
{
using System;
using System.IO;
using System.Security.Cryptography;
namespace Dice_Golf_Game
{
class Program
{
static void Main(string[] args)
{
SaveConsoleData e = new SaveConsoleData();
PlayerData p = new PlayerData();
Random r = new Random();
int nHoles1 = 1, nHoles2 = 1;
int nRolls1 = 1, nRolls2 = 1;
int nScore1 = 0, nScore2 = 0;
int plays = 1, maxplays = 0;
int p1Won = 0, p2Won = 0;
string sPlayer1, sPlayer2;
Console.Title = "Dice Golf Game : Created By: Jd_Logic(Poab9200)";
Console.WriteLine("Dice Golf Game : Created By: Jd_Logic(Poab9200)\n\n");
Console.Write("Enter a name for Player 1 : ");
sPlayer1 = Console.ReadLine();
Console.Write("Enter a name for Player 2 : ");
sPlayer2 = Console.ReadLine();
Console.Write("How many games to play? : ");
maxplays = Convert.ToInt32(Console.ReadLine());
while (true)
{
Console.WriteLine("\n\nCurrent Hole : {0}", nHoles1);
while (nHoles1 != 19)
{
int nDice1 = r.Next(1, 6);
int nDice2 = r.Next(1, 6);
int nDice3 = r.Next(1, 6);
Console.WriteLine("Roll #{3}: {0} {1} {2}", nDice1, nDice2, nDice3, nRolls1);
if (nDice1 == nDice2 || nDice1 == nDice3 || nDice2 == nDice3)
{
nScore1 += nRolls1;
nHoles1++;
nRolls1 = 1;
if (nHoles1 == 19)
{
p.PlayerScore(sPlayer1, nScore1, false);
break;
}
else
{
Console.WriteLine("\nCurrent Hole : {0}", nHoles1);
}
}
else
{
nRolls1++;
}
}
Console.WriteLine("\n\nCurrent Hole : {0}", nHoles2);
while (nHoles2 != 19)
{
int nDice1 = r.Next(1, 6);
int nDice2 = r.Next(1, 6);
int nDice3 = r.Next(1, 6);
Console.WriteLine("Roll #{3}: {0} {1} {2}", nDice1, nDice2, nDice3, nRolls2);
if (nDice1 == nDice2 || nDice1 == nDice3 || nDice2 == nDice3)
{
nScore2 += nRolls2;
nHoles2++;
nRolls2 = 2;
if (nHoles2 == 19)
{
p.PlayerScore(sPlayer2, nScore2, false);
break;
}
else
{
Console.WriteLine("\nCurrent Hole : {0}", nHoles2);
}
}
else
{
nRolls2++;
}
}
// Display how many times each player has won
p.PlayerScoreTotal(sPlayer1, sPlayer2, nScore1, nScore2, false);
decimal mAvga = Convert.ToDecimal(nScore1) / 18M;
decimal mAvgb = Convert.ToDecimal(nScore2) / 18M;
if (mAvga < mAvgb)
{
p1Won++;
string ss1 = string.Format("{0} has won game {1}.\n", sPlayer1, plays);
e.WriteLine(ss1);
}
else
{
p2Won++;
string ss2 = string.Format("{0} has won game {1}.\n", sPlayer2, plays);
e.WriteLine(ss2);
}
if (plays == maxplays)
{
p.PlayerWinTotal(p1Won, p2Won);
Console.WriteLine("\nThank you for playing Jd_Logic's Dice Golf");
break;
}
else
{
nHoles1 = 1;
nHoles2 = 1;
nRolls1 = 1;
nRolls2 = 1;
nScore1 = 0;
nScore2 = 0;
plays++;
}
}
Console.Read();
}
}
class SaveConsoleData
{
public void WriteLine(string text)
{
Console.WriteLine(text);
if (!File.Exists(@"test.txt"))
{
using (StreamWriter sw = File.CreateText(@"test.txt"))
{
if (text.Contains("\n") || text.Contains("\n\n") || text.Contains("\n\n\n"))
{
text.Replace("\n", "");
sw.WriteLine();
}
sw.WriteLine(text);
}
}
using (StreamWriter sw = File.AppendText(@"test.txt"))
{
if (text.Contains("\n") || text.Contains("\n\n") || text.Contains("\n\n\n"))
{
text.Replace("\n", "");
sw.WriteLine();
}
sw.WriteLine(text);
}
}
}
class PlayerData
{
public void PlayerWinTotal(int p1win, int p2win)
{
Console.WriteLine("\n\nPlayer 1 has won {0} games", p1win);
Console.WriteLine("Player 2 has won {0} games", p2win);
}
public void PlayerScore(string playername, int score, bool write)
{
SaveConsoleData e = new SaveConsoleData();
decimal mAvg = Convert.ToDecimal(score) / 18M;
string s1 = string.Format("\n\n {0}'s Score", playername);
string s2 = string.Format("---------------------------------");
string s3 = string.Format(" Your Score Is : {0}", score);
string s4 = string.Format(" Your Average Is : {0:F3}", mAvg);
string s5 = string.Format("---------------------------------\n\n");
if (write)
{
e.WriteLine(s1);
e.WriteLine(s2);
e.WriteLine(s3);
e.WriteLine(s4);
e.WriteLine(s5);
}
else
{
Console.WriteLine(s1);
Console.WriteLine(s2);
Console.WriteLine(s3);
Console.WriteLine(s4);
Console.WriteLine(s5);
}
}
public void PlayerScoreTotal(string playername1, string playername2, int score1, int score2, bool write)
{
SaveConsoleData e = new SaveConsoleData();
decimal mAvg1 = Convert.ToDecimal(score1) / 18M;
decimal mAvg2 = Convert.ToDecimal(score2) / 18M;
string s1 = string.Format("\n Score Totals");
string s2 = string.Format("---------------------------------");
string s3 = string.Format("{0}'s Score : {1}", playername1, score1);
string s4 = string.Format("{0}'s Average : {1:F3}", playername1, mAvg1);
string s5 = string.Format("{0}'s Score : {1}", playername2, score2);
string s6 = string.Format("{0}'s Average : {1:F3}", playername2, mAvg2);
string s7 = string.Format("---------------------------------\n\n\n");
if (write)
{
e.WriteLine(s1);
e.WriteLine(s2);
e.WriteLine(s3);
e.WriteLine(s4);
e.WriteLine(s5);
e.WriteLine(s6);
e.WriteLine(s7);
}
else
{
Console.WriteLine(s1);
Console.WriteLine(s2);
Console.WriteLine(s3);
Console.WriteLine(s4);
Console.WriteLine(s5);
Console.WriteLine(s6);
Console.WriteLine(s7);
}
}
}
}
}