//handle the next frame operation
 public void NextFrame(Frame[] frameArry)
 {
     int curFrame = FrameNum;
     if (curFrame < MAXFRAME - 1)
     {
         int nexFrame = frameArry[FrameNum + 1].FrameNum;
         NextBall = frameArry[nexFrame].BallOne;
     }
     // Console.WriteLine(NextBall + " FOR DEBUG");
     // Console.WriteLine("GET NEXT BALL FROM FRAME #" + (nexFrame+1) + " Which is: " + NextBall);
 }
        //handle next frame operation for strike (next 2 balls)
        public void NextFrame(Frame[] frameArry)
        {
            int curFrame = FrameNum;
            int nexFrame = frameArry[FrameNum + 1].FrameNum;
            NextBall1 = frameArry[nexFrame].BallOne;
            //Console.WriteLine("GET NEXT BALL FROM FRAME #" + (nexFrame + 1) + " Which is: " + NextBall1);
            //handle special case if first ball is strike go to next frame
            if (NextBall1 == TEN)
            {
                if (nexFrame + 1 < MAXFRAME - 1)
                {
                    NextBall2 = frameArry[nexFrame + 1].BallOne;
                }
                else if (nexFrame + 1 == MAXFRAME - 1)
                {
                    NextBall2 = frameArry[nexFrame + 1].BallOne;
                }
                else if (nexFrame == MAXFRAME - 1)
                {
                    NextBall2 = frameArry[nexFrame].BallTwo;
                }

            }
            else
            {
                NextBall2 = frameArry[nexFrame].BallTwo;
                //Console.WriteLine("AND " + NextBall2);
            }
        }
        static void Main(string[] args)
        {
            //vars
            string fileName = "";
            int curBall = 0;
            int prevBall = 0;
            int counter = 0;
            int subcnt = 0;
            bool start = true;
            bool strike = false;
            bool spare = false;
            int totalScore = 0;

            Frame[] frameList = new Frame[MAXFRAME];
            Strike[] strikeList = new Strike[MAXFRAME];
            Spare[] spareList = new Spare[MAXFRAME];

            for (int i = 0; i < MAXFRAME; i++)
            {
                frameList[i] = new Frame()
                {
                    FrameNum = i,
                    BallOne = 0,
                    BallTwo = 0,
                    Filled = false
                };
                strikeList[i] = new Strike()
                {
                    FrameNum = 0,
                    BallOne = 0,
                    BallTwo = 0,
                    Filled = false
                };

                spareList[i] = new Spare()
                {
                    FrameNum = 0,
                    BallOne = 0,
                    BallTwo = 0,
                    Filled = false
                };
            }

            List<string> list = new List<string>();
            List<int> numList = new List<int>();
            string line;
            do
            {
                line = Console.ReadLine();
                if (line != "END")
                {
                    bool check = int.TryParse(line, out curBall);
                    if (check == true)
                    {
                        numList.Add(curBall);
                        //Console.WriteLine(curBall);
                    }

                }
            } while (line != "END");

            Console.WriteLine("---------------------------------------");
            //go through each item in list and assign to frame objects
            foreach (int item in numList)
            {
                //Console.WriteLine(item);
                if (counter > MAXFRAME - 1)
                {

                    break;
                }

                //Console.WriteLine(item);
                curBall = item;
                //for bonus frame stuff
                if (counter == MAXFRAME - 1)
                {
                    if (subcnt == 0)
                    {
                        frameList[counter].FrameNum = counter;
                        frameList[counter].BallOne = curBall;
                        subcnt++;

                    }
                    else if (subcnt == 1 && frameList[counter].Filled == true)
                    {
                        frameList[counter].BallTwo = curBall;
                        counter++;
                    }
                    if (counter == MAXFRAME - 1)
                        frameList[counter].Filled = true;
                }
                //normal 10 frames
                if (counter < MAXFRAME - 1)
                {

                    //handle strike scenario
                    if (item == TEN)
                    {
                        //Console.WriteLine("strike");

                        if (strikeList[counter].Filled == false)
                        {
                            strikeList[counter].FrameNum = counter;
                            strikeList[counter].BallOne = curBall;
                            strikeList[counter].Filled = true;
                            // Console.WriteLine("FRAME #" + (strikeList[counter].FrameNum+1) + " BALL IN FRAME " + strikeList[counter].BallOne);
                            strike = true;
                            //get frame list of all frames
                            frameList[counter].FrameNum = counter;
                            frameList[counter].BallOne = curBall;
                            frameList[counter].BallTwo = 0;
                            frameList[counter].Filled = true;
                            counter++;

                        }

                    }
                    //handle spare scenario
                    else if (prevBall + curBall == TEN && strike == false)
                    {
                        //Console.WriteLine("Spare!");
                        if (spareList[counter].Filled == false)
                        {
                            spareList[counter].FrameNum = counter;
                            spareList[counter].BallOne = prevBall;
                            spareList[counter].BallTwo = curBall;
                            spareList[counter].Filled = true;
                            //Console.WriteLine("FRAME #" + (spareList[counter].FrameNum+1) + " BALLS IN FRAME " + spareList[counter].BallOne + " " + spareList[counter].BallTwo);

                            spare = true;
                            //fill framelist with ALL frames
                            frameList[counter].FrameNum = counter;
                            frameList[counter].BallOne = prevBall;
                            frameList[counter].BallTwo = curBall;
                            frameList[counter].Filled = true;

                            counter++;

                        }

                    }
                    //handle normal frame(non strike/spare) scenario
                    else
                    {
                        if (frameList[counter].Filled == false && start == false && strike == false && spare == false && curBall + prevBall < TEN)
                        {
                            frameList[counter].FrameNum = counter;
                            frameList[counter].BallOne = prevBall;
                            frameList[counter].BallTwo = curBall;
                            frameList[counter].Filled = true;
                            if (frameList[counter].FrameNum + 1 == MAXFRAME)
                            {
                                // Console.WriteLine("BONUS FRAME #" + (frameList[counter].FrameNum + 1) + " BALLS IN FRAME " + frameList[counter].BallOne + " " + frameList[counter].BallTwo);
                            }
                            else
                                // Console.WriteLine("FRAME #" + (frameList[counter].FrameNum+1) + " BALLS IN FRAME " + frameList[counter].BallOne + " " + frameList[counter].BallTwo);

                                counter++;

                        }
                    }
                    prevBall = item;
                    start = false;
                    spare = false;
                    strike = false;
                }
            }
            //loop through the list and do score/nextball stuff
            for (int i = 0; i < MAXFRAME; i++)
            {
                //calc spare scores
                if (spareList[i].Filled == true)
                {
                    //handle score stuff
                    spareList[i].NextFrame(frameList);
                    spareList[i].calcScore();
                    frameList[i].FrameScore = spareList[i].FrameScore;

                }
                //calc strike scores
                if (strikeList[i].Filled == true)
                {
                    if (i == MAXFRAME - 1)
                    {
                        break;
                    }
                    //handle score stuff
                    strikeList[i].NextFrame(frameList);
                    strikeList[i].calcScore();
                    frameList[i].FrameScore = strikeList[i].FrameScore;
                }
                else
                {
                    //calc normal scores
                    if (spareList[i].Filled == false && strikeList[i].Filled == false)
                        frameList[i].calcScore();
                }
            }

            //display results
            for (int i = 0; i < MAXFRAME; i++)
            {
                if (strikeList[i].Filled == true)
                {
                    totalScore += frameList[i].FrameScore;
                    Console.WriteLine("Frame #" + (i + 1) + " Strike! FrameScore: " + frameList[i].FrameScore + " Total Score: " + totalScore);
                }
                if (spareList[i].Filled == true)
                {
                    totalScore += frameList[i].FrameScore;
                    Console.WriteLine("Frame #" + (i + 1) + " Spare! Ball1:" + frameList[i].BallOne + " Ball2:" + frameList[i].BallTwo + " FrameScore: " + frameList[i].FrameScore + " Total Score: " + totalScore);

                }
                else
                {
                    if (frameList[i].FrameNum == MAXFRAME - 1)
                    {
                        Console.WriteLine("BONUS Frame #" + (i + 1) + " Ball1:" + frameList[i].BallOne + " Ball2:" + frameList[i].BallTwo + " FrameScore: " + frameList[i].FrameScore + " Total Score: " + totalScore);
                        break;
                    }
                    if (strikeList[i].Filled == false && spareList[i].Filled == false)
                    {
                        totalScore += frameList[i].FrameScore;
                        Console.WriteLine("Frame #" + (i + 1) + " Ball1:" + frameList[i].BallOne + " Ball2:" + frameList[i].BallTwo + " FrameScore: " + frameList[i].FrameScore + " Total Score: " + totalScore);

                    }
                }

                Console.WriteLine("---------------------------------------------");
            }
            Console.WriteLine("Hit Enter To EXIT");
            Console.ReadLine();
        }