0

私はここで少し機知に富んでいます.どんな助けでも大歓迎です.

私の問題 (C# がかなり不慣れであることは別として) は、ショット戦略関数を繰り返し呼び出しているように見える Get Shot 関数にあるため、stratlist. 問題の解決策だけが欲しいのではなく、なぜこれが起こっているのか、どうすれば回避できるのかを概念的に理解したい. 他のスタイルの提案やヒントも大歓迎です。エチケットの違反について事前にお詫び申し上げます...これは私の最初の投稿された質問です。

2 番目の読み取りでは、これは少しあいまいなので、明確にしようとします。

get shot 関数は、shot という名前の Point を宣言します。次に、保持リストから (50 個の値から) ランダムな値を取得することによって派生したショットに値を割り当てます。このショットをいくつかの方法で評価します。次に get shot 関数を使用して 2 行目に到達すると、リストのサイズが 2 倍になり、どこを見ても理由が​​わかりません。

コードは次のとおりです。

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

機能は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 に答える
0

shotstrategy他の場所で呼び出されていないことを確認していますか? で問題ないようですのでGetShot。リストのサイズを大きくできる唯一のコード部分はshotstrategy関数です。その呼び出しを詳しく調べる必要があります。

于 2013-10-02T09:45:26.040 に答える