Benötige einwenig Hilfe



  • Hi ich programmier gerad Game of Life und habe ein kleines Problem, ich bin mir nicht sicher ob ich alles so richtig implementiert habe aber die eigentlichen Menthoden sollten richtig sein jedenfalls hänge ich an einem Fehler den ich nicht ganz einordnen kann würd mich über jede hilfe freuen Vielen Dank !

    Hier ein paar Bilder / Code von dem Programm

    https://imgur.com/a/VehU2

    #include "abstractgamelogic.h"
    #include <stdlib.h>
    #include <iostream>
    
    	int const x = 0;
    	int const y = 0;
    
    	int const column = 30;
    	int const row = 30;
    
    	bool population[column][row][2];
    
    	  void startGeneration() {
    		 for(int i = 0; i < column; i++){
    			 for(int j = 0; j < row; j++){
    				 if((rand() % RAND_MAX) <= (0.6*RAND_MAX))
    					 population[i][j][0] = true;
    			 }
    		}
    	}
    
    	class Gamelogic{
    	public:
    		Gamelogic();
    		~Gamelogic();
    
    	 void nextFieldGeneration(){
    		for (int i = 0; i < column; i++) {
    			for (int j = 0; j < row; j++) {
    				if (isCellAlive(i, j)) {
    					population[i][j][1] = true;
    				} else if (isCellAlive(i, j) == false) {
    					population[i][j][1] = false;
    				}
    			}
    
    		}
    		for (int i = 0; i < column; i++) {
    			for (int j = 0; j < row; j++) {
    				population[i][j][0] = population[i][j][1];
    			}
    		}
    	 }
    
    		bool isCellAlive(int unsigned x, int unsigned y){
    
    		int neighboursCells[8][2] = { { -1, -1 }, { -1, 0 }, { -1, 1 },
    				{ 0, -1 }, { 0, 1 }, { 1, -1 }, { 1, 0 }, { 1, 1 } };
    		int neighbour = 0;
    
    		for(int i = 0; i < 8; i++) {
    			x = row + neighboursCells[i][0];
    			y = column + neighboursCells[i][1];
    			if (x == -1) {
    				x = column - 1;
    			} else if (x == column) {
    				x = 0;
    			}
    			if (y == -1) {
    				y = row - 1;
    			} else if (y == row) {
    				y = 0;
    			}
    			if (population[x][y][0]) {
    				neighbour++;
    			}
    		}
    
    		if ((neighbour == 2 | neighbour == 3)
    				&& population[row][column][0] == true) {
    			return true;
    		} else if ((neighbour == 3)
    				&& population[row][column][0] == false) {
    			return true;
    		} else if ((neighbour > 3) && population[row][column][0] == true) {
    			return false;
    		} else if ((neighbour < 2) && population[row][column][0] == true) {
    			return false;
    		} else {
    			return false;
    		}
    	}
    
    	};
    
    	/**
    	  * Ermittelt die Breite des Feldes in Anzahl Zellen.
    	  * @return Breite des Feldes.
    	  */
    	   unsigned int AbstractGamelogic :: getFieldWidth(){
    		return column;
    	}
    	/**
    	  * Ermittelt die Hoehe des Feldes in Anzahl Zellen.
    	  * @return Hoehe des Feldes.
    	  */
    	   unsigned int AbstractGamelogic :: getFieldHeight(){
    		return row;
    	}
    
    	/**
    	  * Stellt fest, ob die Zelle in der aktuellen Generation
    	  * an der Position (x, y) noch lebt.
    	  * @return <code>true</code>, wenn die Zelle noch lebt,
    	  *         <code>false</code>, wenn die Zelle tot ist.
    	  */
    	 bool AbstractGamelogic :: isCellAlive(int unsigned x, int unsigned y){
    
    		int neighboursCells[8][2] = { { -1, -1 }, { -1, 0 }, { -1, 1 },
    				{ 0, -1 }, { 0, 1 }, { 1, -1 }, { 1, 0 }, { 1, 1 } };
    		int neighbour = 0;
    
    		for(int i = 0; i < 8; i++) {
    			x = row + neighboursCells[i][0];
    			y = column + neighboursCells[i][1];
    			if (x == -1) {
    				x = column - 1;
    			} else if (x == column) {
    				x = 0;
    			}
    			if (y == -1) {
    				y = row - 1;
    			} else if (y == row) {
    				y = 0;
    			}
    			if (population[x][y][0]) {
    				neighbour++;
    			}
    		}
    
    		if ((neighbour == 2 | neighbour == 3)
    				&& population[row][column][0] == true) {
    			return true;
    		} else if ((neighbour == 3)
    				&& population[row][column][0] == false) {
    			return true;
    		} else if ((neighbour > 3) && population[row][column][0] == true) {
    			return false;
    		} else if ((neighbour < 2) && population[row][column][0] == true) {
    			return false;
    		} else {
    			return false;
    		}
    	}
    	/**
    	  * Berechnet die neue Generation anhand der Regeln
    	  * des Game of Life.
    	  */
    	void AbstractGamelogic :: nextFieldGeneration(){
    		for (int i = 0; i < column; i++) {
    			for (int j = 0; j < row; j++) {
    				if (isCellAlive(i, j)) {
    					population[i][j][1] = true;
    				} else if (isCellAlive(i, j) == false) {
    					population[i][j][1] = false;
    				}
    			}
    
    		}
    		for (int i = 0; i < column; i++) {
    			for (int j = 0; j < row; j++) {
    				population[i][j][0] = population[i][j][1];
    			}
    		}
    }
    


  • Hilfreich wäre schon eine Fehlerbeschreibung.

    Auf die Schnelle: ich bin mir sicher, dass Du beim testen der "lebenden" Nachbarn das logische-Oder "||", statt dem bitweisen-Oder "|" meinst.



  • Neuer_ schrieb:

    Hi ich programmier gerad Game of Life und habe ein kleines Problem, ich bin mir nicht sicher ob ich alles so richtig implementiert habe aber die eigentlichen Menthoden sollten richtig sein jedenfalls hänge ich an einem Fehler den ich nicht ganz einordnen kann würd mich über jede hilfe freuen Vielen Dank !

    Wenn du allen Ernstes glaubst, dass jemand den kompletten Code durchliest, nachvollzieht und dir eine Fehlerbeschreibung + Lösung liefert, dann liegste falsch. Versuch den Code zu reduzieren und dabei den Fehler zu erhalten (im Sinne von aufrechterhalten). Wenn es fünfzig Zeilen Code sind und du den Fehler nennen kannst, siehts anders aus.

    Außerdem ist es in dem Fall egal, ob er den logischen oder den Bitweisen Operator nimmt (trotzdem meinte er den anderen und sollte den in dem Kontext nicht noch weiter benutzen).



  • Und noch ein Tipp: Ein besserer Titel wäre gut. "Benötige einwenig Hilfe" sagt nichts über das eigentliche Thema aus. Und dass Du Hilfe benötigst, erkennt man bereits daran, dass Du hier fragst.



  • Nun die fehler Meldung sieht man auf einen der Bilder und zum Fehler selbst wie gesagt er überfordert meine Kenntnisse und ich weiß nicht wirklich wie ich daran gehen sollte, entschuldigung wenn ich hier etwas zu forsch war aber ich weiß es nun nicht besser als c++ anfänger 🙂



  • Der Fehler sagt, dass GameLogic nicht von AbstractGameLogic abgeleitet ist, ist es ja auch nicht. Ich verstehe nicht, wie du sowas geschrieben haben kannst, ohne den Fehler zu verstehen. Man kommt doch nicht auf die Idee, Klassen AbstractGameLogic und GameLogic zu nennen, ohne zu wissen, was die Fehlermeldung beduetet. Da ist was faul 😉



  • Chrm wie könnte ich es denn in richtig gestalten, wie gesagt ich hab nicht wirklich vieeeel Ahnung *hust



  • Neuer_ schrieb:

    Chrm wie könnte ich es denn in richtig gestalten

    Indem du Klassen, die du zum Ableiten designt hast, auch ableitest, wurde oben schon gesagt.

    Vermutlich wäre der beste Ansatz, dass du die Klassen selbst designst, und nicht von irgendwoher Code zusammenkopierst, den Eindruck hat man zumindest vom Code und deinem Nichtverstehen des Fehlers.

    Dass du nicht viel Ahnung hast ist keine Schande - nur solltest du dann klein anfangen mit einem guten Buch und nicht zu viel zu schnell wollen.



  • Neuer_ schrieb:

    Chrm wie könnte ich es denn in richtig gestalten, wie gesagt ich hab nicht wirklich vieeeel Ahnung *hust

    Ein Tipp, den ich mittlerweile in fast jedem Anfängerthread gebe: Kauf dir ein gutes Buch. Sonst wirste nicht viel von dem verstehen, was dir gleich 5 Leute um die Ohren programmieren werden (Ableitung, virtuelle Methoden, blablablla...). Einen guten Buchthread findest du in der C++-FAQ.

    @pumuckl: Da war ich wohl zu langsam. 🙂


Anmelden zum Antworten