0

我有点不知所措...任何帮助将不胜感激:此代码用于此论坛上举办的战舰AI竞赛,然后被分配为AI类的项目

我的问题(除了在 C# 方面相当无能)出在 Get Shot 函数中,它似乎重复调用了 shot strategy 函数,从而增加了我的stratlist. 我不想只是解决我的问题,而是想从概念上理解为什么会发生这种情况,以及如何避免它。任何其他风格的建议或提示也将非常受欢迎。提前为任何违反礼节的行为道歉......这是我第一个发布的问题。

在第二次阅读时,这有点模糊,所以我会尝试清除它:

get shot 函数声明了一个名为 shot 的 Point;然后,它通过从持有列表中获取一个随机值(50 个值中的值)为得到的镜头分配一个值。它继续以几种方式评估这个镜头。下次我们使用 get shot 功能并到达第二行时,我的列表大小增加了两倍,无论我怎么看或在哪里看,我都无法弄清楚为什么。

这是代码:

namespace Battleship
{
    using System;
    using System.Collections.ObjectModel;
    using System.Drawing;
    using System.Collections.Generic;
    using System.Linq;

    public class Potemkin : IBattleshipOpponent
    {
        public string Name { get { return "Potemkin"; } }
        public Version Version { get { return this.version; } }

        Random rand = new Random();
        Version version = new Version(1, 1);
        Size gameSize;
        bool shotstat = false;
        List<Point> stratlist = new List<Point>();
        List<Point> aimlist = new List<Point>();

        public void NewGame(Size size, TimeSpan timeSpan)
        {
            this.gameSize = size;
            shotstrategy();            
        }

        public void PlaceShips(ReadOnlyCollection<Ship> ships)
        {
            foreach (Ship s in ships)
            {
                s.Place(
                    new Point(
                        rand.Next(this.gameSize.Width),
                        rand.Next(this.gameSize.Height)),
                    (ShipOrientation)rand.Next(2));
            }
        }

        private void shotstrategy()
        { 
            for (int x = 0; x < gameSize.Width; x++)
                for(int y = 0; y < gameSize.Height; y++)
                    if ((x + y) % 2 == 0)
                    {
                        stratlist.Add(new Point(x, y));
                    }
        }

        public Point GetShot()
        {
            Point shot;
            shot = this.stratlist[rand.Next(stratlist.Count())];
            if (shotstat == true)
            {
                if (aimlist.Count == 0)
                {
                    fillaimlist(shot);
                }
                while (aimlist.Count > 0)
                {
                    shot = aimlist[0];
                    aimlist.RemoveAt(0);
                    return shot;
                }
            }

            return shot;

        }

        public void NewMatch(string opponent) { }
        public void OpponentShot(Point shot) { }
        public void fillaimlist(Point shot)
        {
            aimlist.Add(new Point(shot.X, shot.Y + 1));
            aimlist.Add(new Point(shot.X, shot.Y - 1));
            aimlist.Add(new Point(shot.X + 1, shot.Y));
            aimlist.Add(new Point(shot.X - 1, shot.Y));        
        }
        public void ShotHit(Point shot, bool sunk)
        {   
            if (!sunk)
            {
                shotstat = true;
            }
            else
            {
                shotstat = false;
            }  
        }
        public void ShotMiss(Point shot) { }
        public void GameWon() { }
        public void GameLost() { }
        public void MatchOver() { }
    }
}


}
4

2 回答 2

0

你确定这shotstrategy不是在其他地方被调用吗?因为似乎没有问题GetShot。您的代码中唯一可以增加列表大小的部分是shotstrategy函数。你需要仔细看看它的调用。

于 2013-10-02T09:45:26.040 回答
0

GetShot()功能似乎没有增加stratlist。只有shotstrategy()功能会增加价值。

你的问题可能是这条线

stratlist.Add(new Point(x, y));

每次新游戏开始时,您都会增加更多积分。例如,在 8 x 8 的网格中,您将有 32 个方格作为目标。在下一场比赛中;这将添加另一个 32 等等。

您可以通过重置函数stratlist中的值来解决此问题NewGame

public void NewGame(Size size, TimeSpan timeSpan)
{
    stratlist = new List<Point>
    this.gameSize = size;
    shotstrategy();
}
于 2013-10-02T09:58:45.347 回答