前回までの状況はこちら。
最新ソースはこちら(gitHub)
https://github.com/takishita2nd/HokkaidoWar
前回は対戦相手を選択する処理を作成したので、
今回は実際にバトルを行う処理を作成します。
class Battle
{
public void NextTurn()
{
if (lastDeffece != null)
{
lastDeffece.ClearPaint();
}
if (lastAttack != null)
{
lastAttack.ClearPaint();
}
var targets = _cities[cityCnt].GetLinkedCities();
var r = Singleton.GetRandom();
int targetIdx = r.Next(0, targets.Count + 1);
lastAttack = _cities[cityCnt];
lastAttack.PaintAttackColor();
var info = Singleton.GetGameProcessInfomation();
if(targetIdx >= targets.Count)
{
info.ShowText(lastAttack.GetPosition(), string.Format("{0} turn {1} / {2} {3}",
turn, cityCnt + 1, _cities.Count, lastAttack.Name));
}
else
{
lastDeffece = targets[targetIdx];
lastDeffece.PaintDeffenceColor();
float attack = lastAttack.Population * (float)(r.Next(5, 30) / 10.0);
float deffence = lastDeffece.Population * (float)(r.Next(5, 30) / 10.0);
if(attack > deffence)
{
info.ShowText(lastAttack.GetPosition(), string.Format("{0} turn {1} / {2} {3}\r\ntarget {4} \r\n{5} vs {6}\r\nwin",
turn, cityCnt + 1, _cities.Count, lastAttack.Name, lastDeffece.Name, (int)attack, (int)deffence));
lastAttack.CombinationCity(lastDeffece);
_cities.Remove(lastDeffece);
lastDeffece = null;
}
else
{
info.ShowText(lastAttack.GetPosition(), string.Format("{0} turn {1} / {2} {3}\r\ntarget {4} \r\n{5} vs {6}\r\nlose",
turn, cityCnt + 1, _cities.Count, lastAttack.Name, lastDeffece.Name, (int)attack, (int)deffence));
}
}
cityCnt++;
if(cityCnt >= _cities.Count)
{
_cities = cityRandomReplace(_cities);
cityCnt = 0;
turn++;
}
}
class City
{
public List<Map> GetMaps()
{
return _maps;
}
public void CombinationCity(City lose)
{
addMaps(lose.GetMaps());
_population += lose.Population;
}
private void addMaps(List<Map> maps)
{
foreach(var m in maps)
{
m.SetCity(this);
}
_maps.AddRange(maps);
}
とりあえず、0.5倍~3倍の乱数で戦力値に補正をかけて勝敗を決めます。
そして、攻撃側が勝利した場合は防御側を吸収合併します。
これで一通り実装は完了したので、実際に大戦を実行しましょう。
札幌の一人勝ちでした。
もうちょっとパラメータを調整しないといけないですね。