- #1
M
Michael_B
Bekanntes Mitglied
Themenersteller
- Dabei seit
- 21.09.2002
- Beiträge
- 860
- Reaktionspunkte
- 0
- Ort
- Köln
Hiho,
ich programmiere gerade in PHP ein Schiebepuzzle (ihr kennt doch noch diese kleinen Dinger mit 4x4 oder 5x5 Feldern, wobei eines freigelassen wurde, und man nun die Felder hin und her schieben musste, bis sich das Bild korrekt zusammenfügt).
Um ein wenig fitter in Objektorientierung unter PHP zu werden, wollte ich das direkt mit 2 klassen (Spiel und Feld) realisieren.
Habe nun die Funktionalität soweit implementiert, dass ein paar Testausgaben möglich wären. Dabei meldet er aber immer Fatal error: Call to a member function on a non-object in ...\spiel.php on line 94. Zeile 94 in spiel.php ist die Zeile if($feld->getRow() > 1) array_push($nachbarn, $this->getFeldByPosition($feld->getRow()-1, $feld->getCol())); in der Methode getNeighbors($feld).
Ich vermute mal, dass der Interpreter davon ausgeht, dass das übergebene Element ($feld) kein Objekt der Klasse Feld ist. Wie kann ich dem das nun klarmachen?
Zur Erläuterung: Wenn ein Spiel-Objekt erzeugt wird, wird im Konstruktor ein File mit bestimmten Parametern ausgelesen. Unter anderem auch die Startaufstellung der Felder. Im Spiel-Konstruktor werden also auch direkt Feld-Objekte angelegt und in einem dem Spiel-Objekt zugehörigen Array abgespeichert. Beim Verschieben der Felder (im Spielverlauf) werden lediglich die Inhalte der den entsprechenden Feld-Objekten zugehörigen $content-Variablen vertauscht.
Sorry, ist vielleicht ein bisschen viel. Aber hier steh ich voll aufm Schlauch. Das ist doch bei JAVA wesentlich einfacher... ???
THX in advance
M.
Edit: Gibts in PHP vielleicht auch sowas wie ein Typecast. So könnte ich an dieser Stelle vielleicht nochmal extra erwähnen, dass es sich um ein Feld-Objekt handelt.
Mein Testskript (index.php) ist folgendes:
Die Klasse Feld (feld.php) sieht so aus:
und Spiel (spiel.php) so:
ich programmiere gerade in PHP ein Schiebepuzzle (ihr kennt doch noch diese kleinen Dinger mit 4x4 oder 5x5 Feldern, wobei eines freigelassen wurde, und man nun die Felder hin und her schieben musste, bis sich das Bild korrekt zusammenfügt).
Um ein wenig fitter in Objektorientierung unter PHP zu werden, wollte ich das direkt mit 2 klassen (Spiel und Feld) realisieren.
Habe nun die Funktionalität soweit implementiert, dass ein paar Testausgaben möglich wären. Dabei meldet er aber immer Fatal error: Call to a member function on a non-object in ...\spiel.php on line 94. Zeile 94 in spiel.php ist die Zeile if($feld->getRow() > 1) array_push($nachbarn, $this->getFeldByPosition($feld->getRow()-1, $feld->getCol())); in der Methode getNeighbors($feld).
Ich vermute mal, dass der Interpreter davon ausgeht, dass das übergebene Element ($feld) kein Objekt der Klasse Feld ist. Wie kann ich dem das nun klarmachen?
Zur Erläuterung: Wenn ein Spiel-Objekt erzeugt wird, wird im Konstruktor ein File mit bestimmten Parametern ausgelesen. Unter anderem auch die Startaufstellung der Felder. Im Spiel-Konstruktor werden also auch direkt Feld-Objekte angelegt und in einem dem Spiel-Objekt zugehörigen Array abgespeichert. Beim Verschieben der Felder (im Spielverlauf) werden lediglich die Inhalte der den entsprechenden Feld-Objekten zugehörigen $content-Variablen vertauscht.
Sorry, ist vielleicht ein bisschen viel. Aber hier steh ich voll aufm Schlauch. Das ist doch bei JAVA wesentlich einfacher... ???
THX in advance
M.
Edit: Gibts in PHP vielleicht auch sowas wie ein Typecast. So könnte ich an dieser Stelle vielleicht nochmal extra erwähnen, dass es sich um ein Feld-Objekt handelt.
Mein Testskript (index.php) ist folgendes:
Code:
include(spiel.php);
include(feld.php);
session_save_path(../../tmp);
session_start();
if(!isset($move)) $spiel=new Spiel();
else {
$spiel=$_SESSION[spiel];
$feld1 = $spiel->getFieldById($move);
$feld2 = $spiel->getFreeField();
$spiel->exchangeContents($feld1, $feld2);
}
$spiel->out();
$_SESSION[spiel]=$spiel;
Die Klasse Feld (feld.php) sieht so aus:
Code:
class Feld {
var $id;
var $row;
var $col;
var $position;
var $content;
function Feld($id, $row, $col, $content) {
$this->id=$id;
$this->row=$row;
$this->col=$col;
$this->content=$content;
$this->position=$row.$col;
}
function getId() {
return $this->id;
}
function getRow() {
return $this->row;
}
function getCol() {
return $this->col;
}
function getPosition() {
return $this->position;
}
function getContent() {
return $this->content;
}
function setContent($content) {
$this->content=$content;
}
function isFree() {
return ($this->content==free);
}
function out($isMovable) {
$s=;
if($this->isFree()) {
$s.= ;
}
else {
if($isMovable) $s.=<a href=\.$PHP_SELF.?move=.($this->getId()).\><img src=\.($this->getContent()).\ border=\0\></a>;
else $s.=<img src=\.($this->getContent()).\ border=\0\>;
}
return $s;
}
}
und Spiel (spiel.php) so:
Code:
class Spiel {
var $felder;
var $counter;
var $game;
var $rows;
var $cols;
var $width;
var $height;
var $file_pre;
var $file_suf;
function Spiel($game=jc, $counter=0) {
$this->game=$game;
$this->counter=$counter;
#Daten für das $game einlesen und array parat machen
if(file_exists($game..cfg)) {
$f = fopen($game..cfg, r);
while(!feof($f)) {
$zeile = fgets($f, 256);
if(substr($zeile, 0, 1)==#) continue;
if(strstr($zeile, =)) {
#Parameter
$parval = explode(=, $zeile);
switch($parval[0]) {
case rows: $this->rows=$parval[1]; break;
case cols: $this->cols=$parval[1]; break;
case width: $this->width=$parval[1]; break;
case height: $this->height=$parval[1]; break;
case file_pre: $this->file_pre=$parval[1]; break;
case file_suf: $this->file_suf=$parval[1]; break;
}
}
else {
#Startaufstellung
$c=1;
for($i=1; $i<=$this->rows; $i++) {
for($k=1; $k<=$this->rows; $k++) {
if($zeile==free) $this->felder[$i][$k]=new Feld($c++, $i, $k, $zeile);
else $this->felder[$i][$k]=new Feld($c++, $i, $k, $this->file_pre.$zeile.$this->file_suf);
}
}
}
}
fclose($f);
}
}
function getFields() {
return $this->felder;
}
function getGameParameters() {
return GAME: .$this->game.<br>ROWS: .$this->rows.<br>COLS: .$this->cols.<br>WIDTH: .$this->width.<br>HEIGHT: .$this->height.<br>FILE_PRE: .$this->file_pre.<br>FILE_SUF: .$this->file_suf;
}
function getFieldByPosition($row, $col) {
return $this->felder[$i][$k];
return null;
}
function getFieldByContent($content) {
for($i=1; $i<=$this->rows; $i++) {
for($k=1; $k<=$this->cols; $k++) if($felder[$i][$k]->getContent()==$content) return $felder[$i][$k];
}
return null;
}
function getFieldById($id) {
for($i=1; $i<=$this->rows; $i++) {
for($k=1; $k<=$this->cols; $k++) if($felder[$i][$k]->getId()==$id) return $felder[$i][$k];
}
return null;
}
function getFreeField() {
return getFieldByContent(free);
}
function exchangeContents($feld1, $feld2) {
$content_tmp = $feld2->getContent();
$feld2->setContent($feld1->getContent());
$feld1->setContent($content_tmp);
}
function getNeighbors($feld) {
$nachbarn=array();
#eine Zeile über dem Feld nachgucken
if($feld->getRow() > 1) array_push($nachbarn, $this->getFeldByPosition($feld->getRow()-1, $feld->getCol()));
#eine Zeile unter dem Feld nachgucken
if($feld->getRow() < $this->rows) array_push($nachbarn, getFeldByPosition($feld->getRow()+1, $feld->getCol()));
#links von dem Feld nachgucken
if($feld->getCol() > 1) array_push($nachbarn, getFeldByPosition($feld->getRow(), $feld->getCol()-1));
#rechts von dem Feld nachgucken
if($feld->getCol() < $this->cols) array_push($nachbarn, getFeldByPosition($feld->getRow(), $feld->getCol()+1));
return $nachbarn;
}
function areNeighbors($feld1, $feld2) {
$nachbarn = getNeighbors($feld1);
for($i=0; $i<count($nachbarn); $i++) {
if($nachbarn[$i]->getId==$feld2->getid()) return true;
}
return false;
}
function isMovable($feld) {
$nachbarn = $this->getNeighbors($feld);
for ($i=0; $i<count($nachbarn); $i++) if($nachbarn[$i]->isFree()) return true;
return false;
}
function out() {
$s = <table width=\.($this->width*$this->cols).\ height=\.($this->height*$this->rows).\ cellpadding=\0\ cellspacing=\0\ border=\1\>\n;
for($i=1; $i<=$this->rows; $i++) {
$s.= <tr>\n;
for($k=1; $k<=$this->cols; $i++) {
$s.= <td width=\.$this->width.\ height=\.$this->height.\>\n;
$s.= .$this->felder[$i][$k]->out($this->isMovable($felder[$i][$k]));
$s.= </td>\n;
}
$s.= </tr>\n;
}
$s.= </table>\n;
return $s;
}
}