28.12.2014, 17:08 |
Auf diesen Beitrag antworten » |
Haevelin |
Zugriff verweigert
Zur Zeit programmiere ich das Spiel Vier gewinnt in C#.
Dazu habe ich ein Feld feld erstellt mit 6 mal 7 Größe für das Spielfeld. Für die Überprüfung, ob vier Felder zusammenhängen, habe ich ein Interface geschrieben mit:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
|
using System;
using System.Collections.Generic;
using System.Linq; using System.Text;
using System.Threading.Tasks;
namespace VierGewinntSpiel
{ public interface IVierer
{ Koordinate Eins();
Koordinate Zwei();
Koordinate Drei();
Koordinate Vier();
}
} |
|
Für die HorizontalenVierer bspw. folgenden Code:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VierGewinntSpiel
{
struct HorizontalerVierer : IVierer
{ private readonly int x;
private readonly int y;
public HorizontalerVierer(int x, int y)
{ this.x = x; this.y = y; }
public Koordinate Eins()
{ return new Koordinate(x, y); }
public Koordinate Zwei()
{ return new Koordinate(x+1, y); }
public Koordinate Drei()
{ return new Koordinate(x+2, y); }
public Koordinate Vier()
{
return new Koordinate(x+3, y);
}
}
} |
|
Wenn ich jetzt die Felder prüfen will schalte ich folgenden Code:
code: |
1:
2:
3:
4:
5:
6:
|
public Boolean SelbeFarbe(ArrayList liste, int[,] feld)
{ foreach (var viere in liste){
HorizontalerVierer vier = (HorizontalerVierer)viere; if ((feld[vier.Eins.x,vier.Eins.y]!=0)&&(feld[vier.Eins.X,vier.Eins.Y]==feld[vier.Zwei.X,vier.Zwei.Y]) &&(feld[vier.Eins.X,vier.Eins.Y]==feld[vier.Drei.X,vier.Drei.Y])&& (feld[vier.Eins.X, vier.Eins.Y] == feld[vier.Vier.X, vier.Vier.Y])) { return true; }
} return false; }
|
|
Jetzt erhalte ich die Fehlermeldung, dass Eins eine Methode ist und ich deshalb nicht auf Feldkoordinaten zurückgreifen kann!
Was ich auch ärgerlich finde ist, dass ich die Zeile
HorizontalerVierer vier = (HorizontalerVierer)viere;
nicht ersetzen kann durch IVierer vier = (IVierer)viere;
so bleibt mein Code begrenzt auf die HorizontalerVierer und ich kann das Interface nicht nutzen um andere Klassen, wie bspw. DiagonaleVierer darüber laufen zu lassen.
Wie löse ich das Problem? |
28.12.2014, 18:28 |
Auf diesen Beitrag antworten » |
Haevelin |
RE: Zugriff verweigert
Habe jetzt eine funktionsfähige Verbesserung.
Das Interface IVierer ist jetzt:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VierGewinntSpiel
{
interface IVierer
{ Koordinate Eins { get; }
Koordinate Zwei { get; }
Koordinate Drei { get; }
Koordinate Vier { get; }
}
} |
|
Und eine Klasse die es instantiiert ist HorizontalerVierer mit:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VierGewinntSpiel
{
struct HorizontalerVierer : IVierer
{ private readonly int x;
private readonly int y;
public HorizontalerVierer(int x, int y)
{ this.x = x; this.y = y; }
public Koordinate Eins
{ get {return new Koordinate(x, y);} }
public Koordinate Zwei
{ get { return new Koordinate(x + 1, y); } }
public Koordinate Drei
{ get { return new Koordinate(x + 2, y); } }
public Koordinate Vier
{ get { return new Koordinate(x + 3, y); } }
}
} |
|
Auch das Casting in IVierer funktioniert. |