私はここで少し機知に富んでいます.どんな助けでも大歓迎です.
私の問題 (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() { }
}
}
}