This is my code. I am learning this through the microsoft C# for absolute beginners book. I am on chapter 8 on the final soccer program and have no errors. The only problem I have is when I run it. I get $exception {Index was outside the bounds of the Array} on line of code that is stared. I have been trying to figure this out for the past few hours and have no idea on how to fix it.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace FinalSoccerGame
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
setupPlayers();
setupOpp();
SetupGoalies();
}//end constructor
//constants for players
private int GOALIE = 0;
private int FULLBACK = 1;
private int HALFBACK = 2;
private int WING = 3;
private int CENTER = 4;
private int SHOT = 5;
//array for player names
private string[] playerName = {
"Goalie",
"Fullback",
"Halfback",
"Wing",
"Center",
"Shot",
};
//primary game variables
private int playerScore = 0;
private int oppScore = 0;
private int timeLeft = 600;
private int currentPlayer;
private int nextPlayer;
//data structure for likelihood of shot
private double[,] shotChance =
{
{-1, .8, .6, .4, .1, .01},
{.8, -1, .8, .6, .4, .02},
{.8, .8, -1, .8, .6, .03},
{.8, .8, .8, -1, .8, .04},
{.8, .8, .8, .8, -1, .2},
{.8, .8, .8, .8, .8, -1}
};
private PictureBox[] picPlay = new PictureBox[5];
private void setupPlayers()
{
//setting up my own picture boxes
int x;
int y;
//step through the players
for (int i = 0; i < 6; i++)
{
//standard control setup
picPlay[i] = new PictureBox();
picPlay[i].Size = new Size(25, 25);
//start all players in the center of the field
//on the x (horizontal) axis
x = (int)((pnlField.Width - picPlay[i].Width) / 2);
if (i> GOALIE)
{
//move all players but goalie to a Y value
//related to their position (center close to opp),
//fullback close to own goal
y = (int)(pnlField.Height / i);
picPlay[i].Location = new Point(x, y);
}//end if
//set up the image to the yellow no ball player
picPlay[i].Image = myPics.Images[2];
picPlay[i].SizeMode = PictureBoxSizeMode.StretchImage;
//use the tag field to store the player number
picPlay[i].Tag = i.ToString();
//register the event listener
picPlay[i].Click += new EventHandler(clickPlayer);
//add the player to the panel
pnlField.Controls.Add(picPlay[i]);
}//end for loop
}//end setupPlayers
private void setupOpp()
{
//set up opponents
int x;
int y;
for (int i=1; i < 5; i++)
{
picPlay[i] = new PictureBox();
**picPlay[i].Size = new Size(25, 25);**
x = (int)((this.Width - picPlay[i].Width) / 2);
y = (int)(pnlField.Height / i - 30);
picPlay[i].Location = new Point(x, y);
picPlay[i].Image = myPics.Images[0];
picPlay[i].SizeMode = PictureBoxSizeMode.StretchImage;
pnlField.Controls.Add(picPlay[i]);
}//end for loop
}//end setupOpp
private void SetupGoalies()
{
//place goalies more carefully
int x;
int y;
x = (int)((pnlField.Width - picPlay[GOALIE].Width) / 2);
y = pnlField.Height - picPlay[GOALIE].Height - 20;
picPlay[GOALIE].Location = new Point(x, y);
picPlay[SHOT].Location = new Point(x, 0);
picPlay[GOALIE].Image = myPics.Images[5];
picPlay[SHOT].Image = myPics.Images[4];
}//end setupGoalies
private void clickPlayer(Object sender, EventArgs e)
{
//happens whenever you click a player
Random roller = new Random();
double toSucceed;
double myRoll;
//figure out which player was clicked
PictureBox thePic = (PictureBox)sender;
int playerNumber = Convert.ToInt32(thePic.Tag);
nextPlayer = playerNumber;
//figure out how likely success is
toSucceed = shotChance[currentPlayer, nextPlayer];
//roll a random double
myRoll = roller.NextDouble();
//Announce what's going on
string message = "From: " + playerName[currentPlayer];
message += " to: " + playerName[nextPlayer] + " ";
message += toSucceed.ToString();
lblAnnounce.Text = message;
//look for success
if (myRoll < toSucceed)
{
goodShot();
}
else
{
badShot();
}//end 'pass succeeds' if
}//end clickPlayer
public void goodShot()
{
//if the shot succeeded
//check to see if it's a shot on goal
if (nextPlayer == SHOT)
{
playerScore++;
updateScore();
MessageBox.Show("Goooooooooaaaaaalllll!!!!!");
setPlayer(HALFBACK);
} else
{
lblAnnounce.Text = playerName[nextPlayer] + " now has ball";
setPlayer(nextPlayer);
}//end 'scored a goal' if
}//end goodShot
public void badShot()
{
Random roller = new Random();
double toSucceed;
int playerNumber;
lblAnnounce.Text = "Opponent gets ball...";
//check for opponent goal
toSucceed = roller.NextDouble();
//change the following value to alter game difficulty
if (toSucceed < .05)
{
oppScore++;
updateScore();
MessageBox.Show("Opponent Scores!!");
setPlayer(HALFBACK);
}
else
{
playerNumber = roller.Next(5);
lblAnnounce.Text += "recovered by " + playerName[playerNumber];
setPlayer(playerNumber);
}//end opponent scores if
}//end badShot
public void setPlayer(int playerNumber)
{
//given a player number, shows that player as having the ball,
//all others not having the ball
//set up the current player variable
currentPlayer = playerNumber;
//show no player with ball
for (int i = 0; i < 5; i++)
{
picPlay[i].BorderStyle = BorderStyle.None;
picPlay[i].Image = myPics.Images[2];
} // end for loop
//reset goalie image
picPlay[GOALIE].Image = myPics.Images[5];
//show current player holding ball
picPlay[playerNumber].BorderStyle = BorderStyle.FixedSingle;
picPlay[playerNumber].Image = myPics.Images[3];
} // end setPlayer
private void timer1_Tick(object sender, EventArgs e)
{
updateTime();
movePlayers();
moveOpp();
}//end timerTick
private void updateTime()
{
//calculate time left
timeLeft--;
if (timeLeft <= 0)
{
timer1.Enabled = false;
DialogResult playAgain = MessageBox.Show("Game Over. Play Again?", "Soccer", MessageBoxButtons.YesNo);
if (playAgain == DialogResult.Yes)
{
//start over
playerScore = 0;
oppScore = 0;
timeLeft = 600;
currentPlayer = FULLBACK;
updateScore();
timer1.Enabled = true;
}
else
{
//end game
Application.Exit();
}//end playAgain if
}
else
{
double totalSeconds = timeLeft / 10;
int minutes = (int)(totalSeconds / 60);
int seconds = (int)(totalSeconds % 60);
string timeString = minutes.ToString() + ": " + seconds.ToString();
lblTime.Text = timeString;
}//end if
}//end updateTime
private void movePlayers()
{
//move players
int motion;
Random roller = new Random();
for (int i = 1; i < 5; i++)
{
motion = roller.Next(11) - 5;
picPlay[i].Left += motion;
motion = roller.Next(11) - 5;
picPlay[i].Top += motion;
//check for boundaries
if (picPlay[i].Left < 0)
{
picPlay[i].Left = 0;
}
else if (picPlay[i].Left + picPlay[i].Width > pnlField.Width)
{
picPlay[i].Left = pnlField.Width - picPlay[i].Width;
}
else if (picPlay[i].Top < 0)
{
picPlay[i].Top = 0;
}
else if (picPlay[i].Top + picPlay[i].Height > pnlField.Height)
{
picPlay[i].Top = pnlField.Height - picPlay[i].Height;
} // end if
} // end for loop
} // end movePlayers
private void moveOpp()
{
//move opponents
int motion;
Random roller = new Random();
for (int i = 1; i < 5; i++)
{
motion = roller.Next(11) - 5;
picPlay[i].Left = +motion;
motion = roller.Next(11) - 5;
picPlay[i].Top += motion;
//check for boundaries
if (picPlay[i].Left < 0)
{
picPlay[i].Left = 0;
}
else if (picPlay[i].Left + picPlay[i].Width > pnlField.Width)
{
picPlay[i].Left = pnlField.Width - picPlay[i].Width;
}
else if (picPlay[i].Top < 0)
{
picPlay[i].Top = 0;
}
else if (picPlay[i].Top + picPlay[i].Height > pnlField.Height)
{
picPlay[i].Top = pnlField.Height - picPlay[i].Height;
} // end if
} // end for loop
} // end moveOpp
private void updateScore()
{
lblPlScore.Text = "Player: " + playerScore.ToString();
lblOppScore.Text = " Opp: " + oppScore.ToString();
}//end updateScore
}
}