ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 乒乓球 – OutofRange例外

2019-06-29 03:55:28  阅读:355  来源: 互联网

标签:c exception pong


我在计算机上创建了这个Ping Pong游戏,但是我遇到了问题.一切正常,但每当球触及其中一个墙时,它就会显示我超出范围错误,即使我已将其设置为无法退出控制台.问题只发生在两面墙上,而其他墙面工作正常!我也有一个分数系统,如果我不解决这个问题,我无法检查它是否有效.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace Ping_Pong
{
    class Program
    {
        static int firstplayerpadsize = 4;
        static int secondplayerpadsize = 4;
        static int ballpositionx = 0;
        static int ballpositiony = 0;
        static bool balldirectionup = true;
        static bool balldirectionright = false;
        static int firstplayerposition = 0;
        static int secondplayerposition = 0;
        static int firstplayerresult = 0;
        static int secondplayerresult = 0;
        static Random randomGenerator = new Random();

        static void RemoveScrollbars()
        {
             Console.ForegroundColor = ConsoleColor.Yellow;
             Console.BufferHeight = Console.WindowHeight;
             Console.BufferWidth = Console.WindowWidth;
        }

        static void DrawFirstPlayer()
        {
            for (int y = firstplayerposition; y < firstplayerposition + firstplayerpadsize; y++)
            {
                PrintAtPosition(0, y, '|');
                PrintAtPosition(1, y, '|');
            }
        }

        static void PrintAtPosition(int x, int y, char symbol)
        {
            Console.SetCursorPosition(x, y);
            Console.Write(symbol);
        }

        static void DrawSecondPlayer()
        {
            for (int y = secondplayerposition; y < secondplayerposition + secondplayerpadsize; y++)
            {
                PrintAtPosition(Console.WindowWidth - 1, y, '|');
                PrintAtPosition(Console.WindowWidth - 2, y, '|');
            }
        }

        static void SetInitialsPoints()
        {
            firstplayerposition = Console.WindowHeight / 2 - firstplayerpadsize / 2;
            secondplayerposition = Console.WindowHeight / 2 - secondplayerpadsize / 2;
            SetBall();
        }

        static void SetBall()
        {
            ballpositionx = Console.WindowWidth / 2;
            ballpositiony = Console.WindowHeight / 2;
        }

        static void DrawBall()
        {
            PrintAtPosition(ballpositionx, ballpositiony, '@');
        }

        static void PrintResult()
        {
            Console.SetCursorPosition(Console.WindowWidth / 2 - 1, 0);
            Console.WriteLine("{0}-{1}", firstplayerresult, secondplayerresult);
        }

        static void MoveFirstPlayerDown()
        {
            if (firstplayerposition < Console.WindowHeight - firstplayerpadsize)
            {
                firstplayerposition++;
            }
        }

        static void MoveFirstPlayerUp()
        {
            if (firstplayerposition > 0)
            {
                firstplayerposition--;
            }
        }

        static void MoveSecondPlayerDown()
        {
            if (secondplayerposition < Console.WindowHeight - secondplayerpadsize)
            {
                secondplayerposition++;
            }
        }

        static void MoveSecondPlayerUp()
        {
            if (secondplayerposition > 0)
            {
                secondplayerposition--;
            }
        }

        static void SecondPlayerAIMove()
    {
        //int randomNumber = randomGenerator.Next(0, 2);
        //    if (randomNumber == 0)
        //    {
        //        MoveSecondPlayerUp();
        //    }
        //    if (randomNumber == 1)
        //    {
        //        MoveSecondPlayerDown();
        //    }

       // if (randomNumber == 0)
       // {
            if (balldirectionup == true)
            {
                MoveSecondPlayerUp();
            }
            else
            {
                MoveSecondPlayerDown();
            }
        }
   // }

        static void MoveBall()
        {
            if (ballpositiony == 0)
            {
                balldirectionup = false;
            }
            if (ballpositiony == Console.WindowHeight - 1)
            {
                balldirectionup = true;
            }
            if (ballpositionx == Console.WindowWidth - 1)
            {
                SetBall();
                balldirectionright = false;
                balldirectionup = true;
                firstplayerresult++;
                Console.SetCursorPosition(Console.WindowHeight / 2, Console.WindowWidth / 2);
                Console.WriteLine("Score for player 1.");
                Console.ReadKey();
            }
            if (ballpositionx == 0)
            {
                SetBall();
                balldirectionright = true;
                balldirectionup = true;
                secondplayerresult++;
                Console.SetCursorPosition(Console.WindowHeight / 2, Console.WindowWidth / 2);
                Console.WriteLine("Score for player 2.");
                Console.ReadKey();
            }

            if (ballpositionx < 3)
            {
                if (ballpositiony >= firstplayerposition && ballpositiony < firstplayerposition 
                   + firstplayerpadsize)
                {
                    balldirectionright = true;
                }
            }


            if (ballpositionx >= Console.WindowWidth - 3 - 1)
            {
                if (ballpositiony >= secondplayerposition && ballpositiony < secondplayerposition + secondplayerpadsize)
                {
                    balldirectionright = false;
                }
            }
            if (balldirectionup)
            {
                ballpositiony--;
            }
            else
            {
                ballpositiony++;
            }

            if (balldirectionright)
            {
                ballpositionx++;
            }
            else
            {
                ballpositionx--;
            }
        }

        static void Main(string[] args)
        {
            RemoveScrollbars();
            SetInitialsPoints();
            while (true)
            {
                if (Console.KeyAvailable)
                {
                    ConsoleKeyInfo keyInfo = Console.ReadKey();
                    if (keyInfo.Key == ConsoleKey.UpArrow)
                    {
                        MoveFirstPlayerUp();
                    }
                    if (keyInfo.Key == ConsoleKey.DownArrow)
                    {
                        MoveFirstPlayerDown();
                    }
                }
                SecondPlayerAIMove();
                MoveBall();
                Console.Clear();
                DrawFirstPlayer();
                DrawSecondPlayer();
                DrawBall();
                PrintResult();
                Thread.Sleep(60);
            }
        }
    }
}

解决方法:

在方法MoveBall中,您将SetCursorPosition参数反转.
第一个是距离左边界的距离,第二个是距离顶边的距离.

Console.SetCursorPosition(Console.WindowWidth / 2, Console.WindowHeight / 2);

这会导致错误,因为y值的最大值为24,您传递40.

标签:c,exception,pong
来源: https://codeday.me/bug/20190629/1322562.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有