在记忆益智游戏中超出范围异常的争论

时间:2017-05-21 19:22:14

标签: c# ios xamarin.ios

我正在关注udemy的课程,这是一个免费的记忆游戏(https://www.udemy.com/xamarin-native-ios-memory-game-csharp/learn/v4/overview

现在使用随机数发生器方法我遇到了同样超出范围错误的新问题

using System;
using System.Collections;
using System.Collections.Generic;

using UIKit;

namespace iOSMemoryGame
{
    public partial class ViewController : UIViewController
    {
        #region vars

    List<String> imgArr = new List<String>();

    float gameViewWidth;
    int gridSize = 6;

    ArrayList tilesArr = new ArrayList();
    ArrayList coordsArr = new ArrayList();

    #endregion

    public ViewController(IntPtr handle) : base(handle)
    {

    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();
        // Perform any additional setup after loading the view, typically from a nib.
    }

    public override void ViewDidAppear(bool animated)
    {
        base.ViewDidAppear(animated);

        // make sure Game View is Laid Out
        gameView.LayoutIfNeeded();
        gameViewWidth = (float)gameView.Frame.Size.Width;

        // let's load all of our images into an array
        for (int i = 1; i <= 18; i++)
        {
            imgArr.Add("img_" + i.ToString() + ".png");
        }

        // let's make a call to tileMaker
        tileMaker();

        // let's call the randomizer
        randomizer();
    }

    private void randomizer()
    {
        // we are gonna go through our tiles in ORDER
        // and we are gonna assign a new center to them RANDOMLY

        foreach (UIView any in tilesArr)
        {
            // UIImageView thisTile = (UIImageView)tilesArr[i];

            Random myRand = new Random();
            int randomIndex = myRand.Next(0, coordsArr.Count);

            CoreGraphics.CGPoint newRandCenter = (CoreGraphics.CGPoint)coordsArr[randomIndex];
            any.Center = newRandCenter;

            coordsArr.RemoveAt(randomIndex);
        }
    }

    private void tileMaker()
    {
        float tileWidth = gameViewWidth / gridSize;

        float xCenter = tileWidth / 2;
        float yCenter = tileWidth / 2;

        int imgCounter = 0;

        for (int h = 0; h < gridSize; h++)
        {
            for (int v = 0; v < gridSize; v++)
            {
                UIImageView tileImgView = new UIImageView();

                CoreGraphics.CGPoint newCenter = new CoreGraphics.CGPoint(xCenter, yCenter);

                tileImgView.Frame = new CoreGraphics.CGRect(0, 0, tileWidth - 5, tileWidth - 5);

                String imgName = imgArr[imgCounter];
                tileImgView.Image = new UIImage(imgName);
                tileImgView.Center = newCenter;

                // user CAN interact with this image view
                tileImgView.UserInteractionEnabled = true;

                // adding the new image view to the array
                tilesArr.Add(tileImgView);

                gameView.AddSubview(tileImgView);

                xCenter = xCenter + tileWidth;
                imgCounter++;

                if (imgCounter == gridSize * gridSize / 2)
                {
                    imgCounter = 0;
                }
            }

            xCenter = tileWidth / 2;
            yCenter = yCenter + tileWidth;
        }
    }

    public override void DidReceiveMemoryWarning()
    {
        base.DidReceiveMemoryWarning();
        // Release any cached data, images, etc that aren't in use.
    }

    partial void Rst4Button_TouchUpInside(UIButton sender)
    {
        throw new NotImplementedException();
    }

    partial void Rst6Button_TouchUpInside(UIButton sender)
    {
        throw new NotImplementedException();
    }
}

}

随机数发生器方法有问题,但我不知道是什么。

它再次给我一个超出范围的错误。

没有随机函数方法它可以正常工作

Error

1 个答案:

答案 0 :(得分:0)

这一行

for (int i = 1; i < 18; i++)

创建17个图像,而不是以下循环所期望的18个图像。

// 0-5 = 6 loops
for (int h = 0; h < gridSize; h++)
{
    // 0-5 = 6 loops (h*v=18)
    for (int v = 0; v < gridSize; v++)
    {
        ....

你需要写

for (int i = 0; i < 18; i++)
   imgArr.Add("img_" + (i+1).ToString() + ".png");