2012-01-18 11 views
4

私はGame of Lifeのクローンで作業中です(wikiはリンクできません)。基本的な機能は実行されますが、自分のルールを定義するオプションもユーザーに与えたいと思います。ライフルールの標準的なゲームは次のとおりです。動的if文?

2人または3人の隣人がいる細胞は生き続ける。

0-1および4-8隣接セルが消滅します。

3つ隣の死細胞が生き残ります。

これは2つのif文で簡単に実行できます。しかし、ユーザーは次のようなものを定義することもできます。

1-3または5-7近傍のセルが存続します。

別の番号のセルが死ぬ。

2または4近傍の死細胞が生き残ります。

これをif文でどのように実装できますか?チェックするために何らかの種類のリストを使うことはできますか?

編集:私はここでいくつかの素晴らしい解決策を見ています。自分のコードに最も適したものを判断する必要があります。まだ答えている人のために:私は適切にユーザーの入力を処理することができます、それについて心配しないでください;)

私はおそらくHow many neighbors to stay alive?How many neighbours to become alive when dead?、いくつかのテキストボックスを求めるウィンドウがあります。これらは、入力が有効であるかどうかもチェックします。

(これはUnity3DでC#の場合)

+0

いくつのオプションを定義できますか?それはオプションの数が制限されているか無制限ですか? – CloudyMarble

+0

ウィキペディアはダウンしています。サイトの英語版のみです。別のバージョン(スペイン語版)でアクセスし、Google Chromeの翻訳機能を使用して表示することができます。別の方法として、Googleのキャッシュシステムを使用して、英語ページの数日前のキャッシュバージョンにアクセスできます。最後に、ブラウザでJavaScriptを無効にすると、英語版にもアクセスできます。 –

+1

@ O.D:オプションは限られています。すべてのセルに8つの隣人があり、ルールはこれらの8つのうちのいくつかが生存しているかどうかに基づいています。 –

答えて

1

私は唯一の細胞が死んなるだろうそれらの条件をチェックします。ユーザーは無制限あなたは翻訳、およびユーザー定義を検証し、クラスを含むC#のコードファイルを作成する必要があるかもしれませんルールの数、および実行を定義することが許可されている場合

まあ
bool CalculateIfDead(Cell c, int[] deadlyCountRules) 
{  
    foreach(int n in deadlyCountRules) 
    { 
     if(c.NeighbourCount == n) 
     { 
     return true; 
     } 
    } 
    return false; 
} 
+0

また、伝播するかどうかを決めるもう一つの方法が必要です。隣人は両方の機能を真と評価した。 –

1

私は、値Propogateと列挙型を定義するダイ、NOCHANGEと思います。

次に、可能性のあるネイバー(0〜8)の数ごとにそのタイプの要素を持つリスト/配列を作成します。ユーザーはこのリストをいくつかの方法で設定することができます(例えば、カンマで区切られた列挙型の列のリスト、分割され、列挙型にキャストされます)。

あなたがしていることは、隣人を数えてルックアップを実行し、それに応じて行動することだけです。

var UserActionList = 
    "Die, Die, NoChange, NoChange, Propogate, Propogate, Die, Die, Die" 
    .Split(',').Select(s => Enum.Parse(typeof(CellAction), s).ToArray(); 

// Count neighbours 

swtich(UserActionList[NeighboursCount]) 
{ 
    case Die: 
    ///// 

    case Propogate: 
    ///// 
} 
+0

すてきな解決策。最初の行が毎回電話をかけるのはやや控えめです。 – rekire

+0

これはユーザー入力の例としてだけあります。ユーザーの入力が変更されたときに、エラーチェックなどで配列を作成します。 –

+0

これはちょうど私の最初の考えでした。 – rekire

0

はあなたが持っている、おそらくすべきどのようなクラス

class DyingRule 
{ 

    enum RuleResult{ Neutral , Death , Lives}; 

    //evaluates if according to this rule 
    //death occurs.. pass parameter as needed 
    RuleResult Evaluate(); 
} 

そしてどこかにあなたのコードにあなたがそれらのベクトルを維持するようなものです。ユーザーは自由にベクトルを追加し、独自のルールを追加できます。

foreach (currentRule in Rules) 
    { 
      RuleResult r = currentRule.Evaluate(); 
      if (r == Death) 
      { 
       ProcessDeath(); 
       break; 
      } 
      else if (r == Lives) 
      { 
       ProcessLiving(); 
       break; 
      } 
    } 

はオプションで、ルールの優先度を持っていると、ルールが他の

0

まあを優先した場合に応じて、それらを並べ替えることができますよう

あなたがそれらを評価、主な問題は、別の番号_と「セルである "節。それには2つの選択肢があります。

- その句を使用できないようにして、ユーザーが何を何にするのかを正確に指定させます。

- 最後に特別な場合として、現在割り当てられていない値を割り当てます。

私が実装する方法は#neighbours => IAction(IActionは同じ、キルまたはグロースのいずれか)の配列で実装されます。あなたは非常に限られた数の可能なネイバーカウントしか持っていないので、与えられたデータからマップを簡単に取り込むことができます。そしてifステートメントも必要ありません。現在の近隣人数と比較します。

1

解決策を試してください。

bool life[] = new bool[] {false, false, true, true, false, false, false, false, false}; 
bool die[] = new bool[] {true, true, false, false, true, true, true, true, true}; 
bool alive[] = new bool[] {false, false, false, true, false, false, false, false, false}; 

bool shouldLife=live[count]; 
bool shouldDie=die[count]; 
bool getAlive=alive[count]; 
0

:私はラインに沿って私の機能を構造化するだろうそれはC#用のCodeDomプロバイダを介して、アセンブリにコンパイルして実行します。このファイルは、User定義から生成されたすべてのstatetmentsのresulktを返すべきです。

オプションの数が限られている場合は、Vectorを保存するファイルを保存することができます。このファイルには、死んでしまうすべての組み合わせのバイナリ配列が含まれています。