| Autor |
Beitrag |
Sinic
Hält's aus hier
Beiträge: 8
Win XP Home
D3 Prof, D6 Pers
|
Verfasst: Do 17.02.05 12:58
Ich muss für die Schule Schiffe versenken programmieren und mir stehen dafür 2 Objektklassen zur Verfügung:
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: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52:
| unit UObjklSpielQuadrat;
interface uses extctrls,graphics; Type TSpielQuadrat = class(TObject) private besetzt : Boolean; x,y:Integer; Breite:Integer; farbe:LongWord; public Constructor Erzeugen(px,py,pl:Integer); Procedure Zeichnen(img:TImage); Procedure Belegen; Procedure Befreien; Property IstBelegt:Boolean read besetzt; end; implementation Constructor TSpielQuadrat.Erzeugen(px,py,pl:Integer); Begin besetzt:= false; x:=px;y:=py;Breite:=pl; farbe:=clgray; End; Procedure TSpielQuadrat.Zeichnen(img:TImage); Begin with img.canvas do begin brush.color := farbe; rectangle(x,y,x+Breite,y+Breite); end; End; Procedure TSpielQuadrat.Belegen; Begin besetzt := True; farbe:=clred; End; Procedure TSpielQuadrat.Befreien; Begin besetzt := False; farbe := clgray; End;
end. |
und
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: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163:
| unit UObjklSpielfeld;
interface uses uobjklSpielQuadrat,classes,extctrls;
Type TSpielFeld = class(TObject) private x,y : Integer; qBreite : Integer; qAnzahl : Integer; liste : TList; public Constructor Erzeugen(img:TImage;px,py,pAnzahl:Integer); Procedure Zeichnen(img:TImage); Procedure SetzeZufallsgeneration; Procedure NaechsteGeneration(sf:TSpielfeld); Procedure Belege(pi:Integer); Procedure Befreie(pi:Integer); Function IstBesetzt(pi:Integer):Boolean; Function AnzahlDerNachbarn(pi:Integer):Integer; Function QuadratNummer(px,py:Integer):Integer; Function Spalte(pi:Integer):Integer; Function Zeile (pi:Integer):Integer; Function QuadratIndex(pZeile,pSpalte:Integer):Integer; Function AnzahlIndividuen:Integer; end; implementation
Constructor TSpielFeld.Erzeugen(img:TImage;px,py,pAnzahl:Integer); VAR i,j:Integer; q:TSpielQuadrat; Begin x:=px; y:=py; qAnzahl := pAnzahl; qBreite := img.Height div round(sqrt(qAnzahl)); liste := TList.Create; For i:=1 to round(sqrt(qAnzahl)) do FOR j:=1 to round(sqrt(qAnzahl)) do Begin q:=TSpielQuadrat.Erzeugen(x+(j-1)*qBreite,y+(i-1)*qBreite,qBreite); liste.Add(q); End; End; Procedure TSpielFeld.zeichnen(img:TImage); VAR i:Integer; q:TSpielQuadrat; Begin For i:=0 to qAnzahl-1 do Begin q:=liste.items[i]; q.zeichnen(img) End; End;
Procedure TSpielfeld.SetzeZufallsgeneration; VAR i:Integer; Begin Randomize; For i:=0 to qAnzahl-1 do if Random(3) = 0 Then Belege(i); End;
Procedure TSpielfeld.NaechsteGeneration(sf:TSpielfeld); var i:Integer; Begin For i:=0 to liste.count-1 do begin if sf.IstBesetzt(i) and ((sf.AnzahlDerNachbarn(i)=2) or (sf.AnzahlderNachbarn(i)=3)) then belege(i); if not sf.IstBesetzt(i) and (sf.AnzahlderNachbarn(i)=3) then belege(i); end; End;
Procedure TSpielFeld.Belege(pi:Integer); VAR q:TSpielQuadrat; Begin q:=liste.items[pi]; q.Belegen; End;
Procedure TSpielFeld.Befreie(pi:Integer); VAR q:TSpielQuadrat; Begin q:=liste.items[pi]; q.Befreien; End;
Function TSpielfeld.IstBesetzt(pi:Integer):Boolean; VAR q:TSpielQuadrat; Begin q:=liste.items[pi]; IstBesetzt:=q.IstBelegt; End;
Function TSpielfeld.AnzahlDerNachbarn(pi:Integer):Integer; VAR a,b,i,j,qi,BelegtAnzahl:Integer; q:TSpielQuadrat; Begin BelegtAnzahl:=0; a:=zeile(pi);b:=spalte(pi); For i:= a-1 to a+1 do For j:= b-1 to b+1 do if (i>0) and (i<=round(sqrt(qAnzahl)))and (j>0) and (j<=round(sqrt(qAnzahl)))and ((i<>a) or (j<>b)) Then Begin qi:=QuadratIndex(i,j); q:=liste.items[qi]; if q.Istbelegt Then inc(BelegtAnzahl); End; result:=BelegtAnzahl; End;
Function TSpielfeld.QuadratNummer(px,py:Integer):Integer; VAR anzZeilen,anzSpalten:Integer; Begin anzZeilen:=(py DiV qBreite)+1; anzSpalten:=(px DIV qBreite)+1; result := (anzZeilen-1)*round(sqrt(qAnzahl))+anzSpalten -1; End;
Function TSpielfeld.Spalte(pi:Integer):Integer; Begin result:=pi mod round(sqrt(qAnzahl))+1; End;
Function TSpielFeld.Zeile (pi:Integer):Integer; Begin result:=pi div round(sqrt(qAnzahl))+1 End;
Function TSPielfeld.QuadratIndex(pZeile,pSpalte:Integer):Integer; Begin result:=(pZeile-1)*round(sqrt(qAnzahl))+pSpalte-1; End;
Function TSpielfeld.AnzahlIndividuen:Integer; VAR q:TSpielQuadrat; i,anz:Integer; Begin anz:=0; For i:=0 to qAnzahl-1 do Begin q:=liste.items[i]; if q.IstBelegt Then inc(anz); End; result:=anz; End; end. |
Ich habe jetzt Probleme mit dem Mousedown im 2. Spielfeld. Das sieht bei mir so aus
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin sf2.Belege(sf2.QuadratNummer(x,y)); sf2.Zeichnen(image1); if sf1.IstBesetzt(sf1.QuadratNummer(x,y)) then sf2.Befreie(sf2.QuadratNummer(x,y)); |
aber wenn ich auf ein Quadrat klicke soll das in 2. spielfeld angezeigt werden und falls es ein treffer ist auch im 1. spielfeld
wie mach ich das? 
|
|
mimi
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Sa 19.02.05 20:01
Ich würde das anders machen nämlich mit einer liste und dann wird sie zweimal dagestellt
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
Sinic 
Hält's aus hier
Beiträge: 8
Win XP Home
D3 Prof, D6 Pers
|
Verfasst: Do 24.02.05 19:07
ich hab das mittlerweile schon hingekriegt
aber habt ihr ne idee, wie ich das für 2 spieler machen könnte? ich wollte es so machen, das ein spieler in dem einen spielfeld ein paar kästchen anklicken kann und dass die dann durch buttonklick wieder grau angezeigt werden und das der andere dann im anderen spielfeld suchen muss. wie programmier ich das, das die vom ersten spieler angeklickten kästchen die der andere suchen muss, wieder verdeckt werden? (Ich muss die beiden Objektklassen benutzen, da es ein Projekt für die Schule ist und wir noch nichts anderes gemacht haben...)
|
|
Demon
Hält's aus hier
Beiträge: 6
Win 2000 Pro
D6
|
Verfasst: Mi 02.03.05 17:29
Moje!
Hast du es geschaft? Läuft schiffeversenken jetzt bei dir einwandfrei?
Habe folgendes Problem: Wollte schon seit längerer Zeit auch das Spiel programieren, bin aber nie dazu gekommen. und jetzt muss ich das auch in der schule machen. kannst du mir irgentwie helfen oder mir am besten eine demo oder ähnliches schicken, damit ich einen ansatz habe, wie ich anfangen soll. Meine e-mail adrresse hast du ja, schreib mir bitte so schnell wie möglich zurück.
demon
|
|
|