Snake-Schlange wächst nur einmal korrekt
-
Hallo, liebe c++-Community!
Wie der Titel bereits vermuten lässt, habe ich ein Problem mit meinem ersten aufwendigeren Spiel, einem Snake-Klon.
Der unten auffindbare Code lässt sich kompilieren und liefert im Grunde genommen auch ein snakeartiges Spiel. Zumindest solange, bis man mehr als einen Stern einsammelt (die Teile, die man einsammeln muss, um irgendwann zum nächsten Level voranschreiten zu können habe ich mit einem Sternchen '*' dargestellt).
Eigentlich sollte die Schlange pro "gefressenem" Sternchen um 2 Felder anwachsen. Nach dem Verspeisen des ersten Sterns tut sie das auch fleißig. Nur danach nicht. Ich habe den Inhalt meiner Arrays überprüft und erkannt, dass merkwürdigerweise der Rumpf, sowie das erste Schwanzsegment eigene Werte aufweisen. ALLE weiteren Segmente sind nach dem Verspeisen des 2., 3. oder weiteren Sterns identisch, was bedeutet, dass sie sich im Prinzip überlagern. Doch wieso das der Fall ist, ist mir absolut schleierhaft. Die Prozedur, mit der die ersten zwei Schwanzsegmente an den Rumpf angekoppelt werden, ist identisch mit der, mit der alle weiteren an das jeweils letzte Segment gehängt werden. Wo liegt bloß der Fehler? Bevor das hier noch zu einem Roman ausufert, werde ich euch meinen Code präsentieren. Der Fehler dürfte lediglich in den Zeilen 200 bis 492 liegen, der Rest kann meiner Meinung nach nichts damit zu tun haben und kann also vernachlässigt werden.Ich möchte mich schonmal herzlich im Voraus bedanken und hoffe darauf, dass ein Außenstehender mehr sieht als ich es als Papa dieses Codes zu können scheine.
Also, hier der Code (ich hoffe, die Länge geht in Ordnung):
//Codeanfang /******************SNAEJK************************ Diese Datei enthaelt den Code fuer ein Spiel, in dem es im wesentlichen darum geht, mit der Tastatur eine Schlange ueber ein 40x40 Felder grosses Areal zu bewegen. Dabei ist das Ziel, alle Sternchen auf dem Spielfeld zu "fressen", indem man den Schlangenrumpf darueber manoevriert. Bei jedem gefressenen Stern waechst die Schlange um zwei Felder an. Beim verlassen des Spiel- feldes auf einer Seite, taucht die Schlange nach und nach auf der gegenueberliegenden Seite wieder auf. ***************************************************/ //VERSION: 0.01 //AUTOR: Paiam //SPRACHE: Deutsch /**************************************************/ //header #include <iostream> #include <conio.h> #include <windows.h> #include <stdio.h> #include <time.h> #include <stdlib.h> using namespace std; //Deutsche Umlaute #define ae <<umlae<< char umlae = 132; #define AE <<umlAE<< char umlAE = 142; #define oe <<umloe<< char umloe = 148; #define OE <<umlOE<< char umlOE = 153; #define ue <<umlue<< char umlue = 129; #define UE <<umlUE<< char umlUE = 154; #define ss <<umlss<< char umlss = 225; //Beliebiges Feld ansteuern (in der Konsole) void gotoxy(int x,int y) { COORD cur={x,y}; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cur); } //Den Cursor verschwinden/auftauchen lassen int ShowConsoleCursor( bool show ) { CONSOLE_CURSOR_INFO ci = {0}; if ( ! GetConsoleCursorInfo( GetStdHandle(STD_OUTPUT_HANDLE), &ci ) ) return 1; ci.bVisible = show; if ( ! SetConsoleCursorInfo( GetStdHandle(STD_OUTPUT_HANDLE), &ci ) ) return 1; return 0; } //Wartefunktion - am besten eignen sich Werte zwischen 100 und 400 void wait(unsigned int mseconds) { clock_t goal = mseconds + clock(); while (goal > clock()); } //Hauptfunktion int main() { HANDLE wHnd; // Handle zum Beschreiben der Konsole HANDLE rHnd; // Handle zum Auslesen der Konsole // handles fuer das Lesen und Beschreiben wHnd = GetStdHandle(STD_OUTPUT_HANDLE); rHnd = GetStdHandle(STD_INPUT_HANDLE); // Fenstertitel SetConsoleTitle("Snajk"); // Fenstergroesse SMALL_RECT windowSize = {0, 0, 40, 40}; // Konsolenfenstergroesse SetConsoleWindowInfo(wHnd, TRUE, &windowSize); // COORD fuer Buffergroesse COORD bufferSize = {41, 41}; // Interne Buffergroesse SetConsoleScreenBufferSize(wHnd, bufferSize); //--------GRUNDEINSTELLUNGEN DES SPIELS--------------// //Spielfeld (40 mal 40 Felder) //1. Dim.: X-Koordinate; 2. Dim.: Y-Koordinate int field[40][40];//die Elemente des Arrays koennen folgende Werte annehmen: //0=leer 1=Schlangenteil 2=Stern srand( (unsigned) time(NULL) );//fuer Zufallszahlen ShowConsoleCursor(FALSE);//kein Cursor int row; //Zeile int column; //Spalte //Alle Felder auf "leer" setzen (0) for(row=0; row<40; row++) { column=0; while (column<40) { field[row][column]=0; column++; } } //Position des Schlangenkopfes (Startpunkt) int xPos = 19; int yPos = 30; field[19][30] = 1; //ist von Schlangenkopf besetzt, deswegen '1' int direction = 1; //direction beinhaltet die Informationen fuer //die Richtung, in die sich die Schlange bewegt. //Moeglichkeiten sind nach: 1=oben 2=rechts // 3=unten 4=links //am Start schaut die Schlange nach oben (1) int randStarPosX = 0; int randStarPosY = 0; char input = ' '; int collected = 0; //Anzahl eingesammelter Sterne (zu Beginn = 0) int level = 0; // diese Variable gibt an, wieviele Sterne //zum Minimum (5) addiert werden int starsTotal = 5+level; //Mindestanzahl an Sternen = 5 int waitingTime = 200;//Anfaengliche Reaktionszeit, die spaeter dem //aktuellen Level angepasst wird int length = 0;//Laenge des Schwanzes. Zu Beginn ist keiner vorhanden int tailPosX[30];//Positionen der Schwanzsegmente (X- und Y-Koordinaten) int tailPosY[30]; for(int i=0; i<30; i++)//Startwerte fuer noch nicht vorhandene Segmente { tailPosX[i]=99;//(99/99) ausserhalb des Spielfeldes tailPosY[i]=99; } int tailEndPosX = 19;//Position des Schlangenendes (am Start der Kopf) int tailEndPosY = 30; //-------------------SPIELBEGINN----------------------// //Intro cout << "****************SNäJK********************"; cout << "* *"; cout << "*Willkommen zu SnÄjk. In diesem Spiel *"; cout << "*geht es darum, mit einer Schlange *"; getch();//auf Tastendruck zum Beginnen warten //------------------HAUPTSCHLEIFE---------------------// while(level<=10)//solange keine 10 Level absolviert wurden { if(randStarPosX==0)//Falls Level/Spiel neu, Anfangsstern zuweisen { randStarPosX = 2 + (rand() % (38-2+1)); randStarPosY = 2 + (rand() % (38-2+1)); for(int i=0; i<1; i++) { if(field[randStarPosX][randStarPosY]==0)//falls Feld leer, Stern pltz. { field[randStarPosX][randStarPosY]=2; }else{//ansonsten neues Feld auswaehlen randStarPosX = 2 + (rand() % (38-2+1)); randStarPosY = 2 + (rand() % (38-2+1)); i--;//for-Schleife erneut durchgehen } } } field[xPos][yPos]=0;//Schlange wird zum Startpunkt zurueckgesetzt //deswegen wird vorherige Position auf 'leer' gesetzt xPos = 19; //wieder zum Startpunkt zurueck bei Levelstart yPos = 30; tailEndPosX = 19;//Schwanz zuruecksetzen tailEndPosY = 30; for(int i=0; i<30; i++)//Startwerte fuer noch nicht vorhandene Segmente { if(tailPosX[i]<=39 && tailPosY[i]<=39)//Falls betreffendes Segment //innerhalb des Spielfeldes {field[tailPosX[i]][tailPosY[i]]=0;}//Felder leeren, auf denen Seg- //mente waren tailPosX[i]=99;//(99/99) ausserhalb des Spielfeldes tailPosY[i]=99; } starsTotal = 5+level; //Anzahl Sterne fuer aktuellen Level festlegen collected = 0; //neuer Level, neue Sterne zum Sammeln while(collected < starsTotal)//Levelbeginn { waitingTime = 200-(level*10);//Reaktionszeit dem Level anpassen //Zufaellige Positionen fuer Sterne: if(field[randStarPosX][randStarPosY]!=2)//falls kein Stern im Spiel: { collected++;//Stern muss eingesammelt worden sein length = length+2;//Schwanzsegmente anfuegen switch(direction) { case 1: tailPosX[length-2]=tailEndPosX;//Erstes Neues tailPosY[length-2]=tailEndPosY+1; tailPosX[length-1]=tailEndPosX;//Zweites Neues tailPosY[length-1]=tailEndPosY+2; tailEndPosX=tailPosX[length-1];//Neues Ende tailEndPosY=tailPosY[length-1]; //Auch als Schlangenteil annehmen/Feld fuellen field[tailPosX[length-2]][tailPosY[length-2]]=1; field[tailPosX[length-1]][tailPosY[length-1]]=1; break; case 2: tailPosX[length-2]=tailEndPosX-1;//Erstes Neues tailPosY[length-2]=tailEndPosY; tailPosX[length-1]=tailEndPosX-2;//Zweites Neues tailPosY[length-1]=tailEndPosY; tailEndPosX=tailPosX[length-1];//Neues Ende tailEndPosY=tailPosY[length-1]; //Auch als Schlangenteil annehmen/Feld fuellen field[tailPosX[length-2]][tailPosY[length-2]]=1; field[tailPosX[length-1]][tailPosY[length-1]]=1; break; case 3: tailPosX[length-2]=tailEndPosX;//Erstes Neues tailPosY[length-2]=tailEndPosY-1; tailPosX[length-1]=tailEndPosX;//Zweites Neues tailPosY[length-1]=tailEndPosY-2; tailEndPosX=tailPosX[length-1];//Neues Ende tailEndPosY=tailPosY[length-1]; //Auch als Schlangenteil annehmen/Feld fuellen field[tailPosX[length-2]][tailPosY[length-2]]=1; field[tailPosX[length-1]][tailPosY[length-1]]=1; break; case 4: tailPosX[length-2]=tailEndPosX+1;//Erstes Neues tailPosY[length-2]=tailEndPosY; tailPosX[length-1]=tailEndPosX+2;//Zweites Neues tailPosY[length-1]=tailEndPosY; tailEndPosX=tailPosX[length-1];//Neues Ende tailEndPosY=tailPosY[length-1]; //Auch als Schlangenteil annehmen/Feld fuellen field[tailPosX[length-2]][tailPosY[length-2]]=1; field[tailPosX[length-1]][tailPosY[length-1]]=1; break; default: system("cls"); //Falls die Variable cout<<"Fatal Error!\a";//'direction' andere getch();//Werte als 1,2,3 oder 4 enthaelt: exit(0);//Abbruch des Spiels } //zwischen 2 und 38 (sowohl X- als auch Y-Koordinaten) randStarPosX = 2 + (rand() % (38-2+1)); randStarPosY = 2 + (rand() % (38-2+1)); for(int i=0; i<1; i++) { if(field[randStarPosX][randStarPosY]==0)//falls Feld leer, Stern pltz. { field[randStarPosX][randStarPosY]=2; }else{//ansonsten neues Feld auswaehlen randStarPosX = 2 + (rand() % (38-2+1)); randStarPosY = 2 + (rand() % (38-2+1)); i--; } } } system("cls"); //Bildschirm leeren if(kbhit()) // Taste wurde gedrueckt { input = getch();//gedrueckte Taste switch(input) //kontrolliert, welche Taste //gedrueckt wurde (w,a,s,d,default) { //Uebernahme der neuen Ausrichtung/Taetigkeit //nach: oben, rechts, untern, links, Programm beenden, unveraendert //Spielende. Damit keine Kehrtwende moeglich ist, darf die neue //Richtung nicht entgegengesetzt der alten sein. case 'w': if(direction!=3) { direction = 1;break; }else{ break; } case 'd': if(direction!=4) { direction = 2;break; }else{ break; } case 's': if(direction!=1) { direction = 3;break; }else{ break; } case 'a': if(direction!=2) { direction = 4;break; }else{ break; } case 'x': system("cls"); cout<<"Vielen Dank, dass" <<" Sie Sn"ae"jk gespi" <<"elt \nhaben!"; getch();exit(0);//Ende default: break;//ohne Aenderung } }else{ //Falls keine Taste gedrueckt wurde, wird keine ; //Aenderung vorgenommen } switch(direction)//welche Richtung? { case 1: if(yPos==1)//hat oberen Rand erreicht { if(length==0) { field[xPos][yPos]=0; }else{ //Feld mit letztem Schwanzsegment ist nun leer field[tailPosX[length-1]][tailPosY[length-1]]=0; for(int i=1;i<length;i++)//alle Segmente //nachruecken lassen { tailPosX[i]=tailPosX[i-1]; tailPosY[i]=tailPosY[i-1]; field[tailPosX[i]][tailPosY[i]]=1; } tailPosX[0]=xPos;//erstes Segment rueckt nach tailPosY[0]=yPos; tailEndPosX = tailPosX[length-1]; tailEndPosY = tailPosY[length-1]; } yPos=40; //unten auftauchen field[xPos][yPos]=1; }else{ field[xPos][yPos-1]=1; if(length==0) { field[xPos][yPos]=0; }else{ //Feld mit letztem Schwanzsegment ist nun leer field[tailPosX[length-1]][tailPosY[length-1]]=0; for(int i=1;i<length;i++)//alle Segmente //nachruecken lassen { tailPosX[i]=tailPosX[i-1]; tailPosY[i]=tailPosY[i-1]; field[tailPosX[i]][tailPosY[i]]=1; } tailPosX[0]=xPos;//erstes Segment rueckt nach tailPosY[0]=yPos; tailEndPosX = tailPosX[length-1]; tailEndPosY = tailPosY[length-1]; } yPos--; //eine Reihe nach oben } break; case 2: if(xPos==40)//hat rechten Rand erreicht { if(length==0) { field[xPos][yPos]=0; }else{ //Feld mit letztem Schwanzsegment ist nun leer field[tailPosX[length-1]][tailPosY[length-1]]=0; for(int i=1;i<length;i++)//alle Segmente //nachruecken lassen { tailPosX[i]=tailPosX[i-1]; tailPosY[i]=tailPosY[i-1]; field[tailPosX[i]][tailPosY[i]]=1; } tailPosX[0]=xPos;//erstes Segment rueckt nach tailPosY[0]=yPos; tailEndPosX = tailPosX[length-1]; tailEndPosY = tailPosY[length-1]; } xPos=1; //links auftauchen field[xPos][yPos]=1; }else{ field[xPos+1][yPos]=1; if(length==0) { field[xPos][yPos]=0; }else{ //Feld mit letztem Schwanzsegment ist nun leer field[tailPosX[length-1]][tailPosY[length-1]]=0; for(int i=1;i<length;i++)//alle Segmente //nachruecken lassen { tailPosX[i]=tailPosX[i-1]; tailPosY[i]=tailPosY[i-1]; field[tailPosX[i]][tailPosY[i]]=1; } tailPosX[0]=xPos;//erstes Segment rueckt nach tailPosY[0]=yPos; tailEndPosX = tailPosX[length-1]; tailEndPosY = tailPosY[length-1]; } xPos++; } break; case 3: if(yPos==40)//hat unteren Rand erreicht { if(length==0) { field[xPos][yPos]=0; }else{ //Feld mit letztem Schwanzsegment ist nun leer field[tailPosX[length-1]][tailPosY[length-1]]=0; for(int i=1;i<length;i++)//alle Segmente //nachruecken lassen { tailPosX[i]=tailPosX[i-1]; tailPosY[i]=tailPosY[i-1]; field[tailPosX[i]][tailPosY[i]]=1; } tailPosX[0]=xPos;//erstes Segment rueckt nach tailPosY[0]=yPos; tailEndPosX = tailPosX[length-1]; tailEndPosY = tailPosY[length-1]; } yPos=1; //oben auftauchen field[xPos][yPos]=1; }else{ field[xPos][yPos+1]=1; if(length==0) { field[xPos][yPos]=0; }else{ //Feld mit letztem Schwanzsegment ist nun leer field[tailPosX[length-1]][tailPosY[length-1]]=0; for(int i=1;i<length;i++)//alle Segmente //nachruecken lassen { tailPosX[i]=tailPosX[i-1]; tailPosY[i]=tailPosY[i-1]; field[tailPosX[i]][tailPosY[i]]=1; } tailPosX[0]=xPos;//erstes Segment rueckt nach tailPosY[0]=yPos; tailEndPosX = tailPosX[length-1]; tailEndPosY = tailPosY[length-1]; } yPos++; } break; case 4: if(xPos==1)//hat linken Rand erreicht { if(length==0) { field[xPos][yPos]=0; }else{ //Feld mit letztem Schwanzsegment ist nun leer field[tailPosX[length-1]][tailPosY[length-1]]=0; for(int i=1;i<length;i++)//alle Segmente //nachruecken lassen { tailPosX[i]=tailPosX[i-1]; tailPosY[i]=tailPosY[i-1]; field[tailPosX[i]][tailPosY[i]]=1; } tailPosX[0]=xPos;//erstes Segment rueckt nach tailPosY[0]=yPos; tailEndPosX = tailPosX[length-1]; tailEndPosY = tailPosY[length-1]; } xPos=40; //rechts auftauchen field[xPos][yPos]=1; }else{ field[xPos-1][yPos]=1; if(length==0) { field[xPos][yPos]=0; }else{ //Feld mit letztem Schwanzsegment ist nun leer field[tailPosX[length-1]][tailPosY[length-1]]=0; for(int i=1;i<length;i++)//alle Segmente //nachruecken lassen { tailPosX[i]=tailPosX[i-1]; tailPosY[i]=tailPosY[i-1]; field[tailPosX[i]][tailPosY[i]]=1; } tailPosX[0]=xPos;//erstes Segment rueckt nach tailPosY[0]=yPos; tailEndPosX = tailPosX[length-1]; tailEndPosY = tailPosY[length-1]; } xPos--; } break; default: system("cls"); //Falls die Variable cout<<"Fatal Error!\a";//'direction' andere getch();//Werte als 1,2,3 oder 4 enthaelt: exit(0);//Abbruch des Spiels } //Ende der Richtungsaenderung //-----------Bild erzeugen---------- row=0; column=0; //oben links beginnen mit Neuzeichnen for(row=0; row<40; row++) //Zeilen { for(column=0; column<40; column++)//Spalten { gotoxy(row, column); switch(field[row][column]) //was ist auf diesem Feld? { //nichts/leer case 0: cout<<" "; break; //Schlange(nteil/-kopf) case 1: cout<<"O"; break; //Futter/Stern case 2: cout<<"*"; break; //Falls nicht: default: system("cls"); cout<<"Fatal Error!\a"; getch();//Spielabbruch exit(0);//wegen falschen //Objekts auf Feld } }//Ende einer Zeile /***ZUM DEBUGGING!!!!!*** gotoxy(tailEndPosX, tailEndPosY); cout<<"H";//Zeigt das momentane Schwanzende an gotoxy(20, 10);cout<<tailEndPosX; gotoxy(20, 9);cout<<"4 "<<tailPosX[3]; gotoxy(20, 8);cout<<"3 "<<tailPosX[2]; gotoxy(20, 7);cout<<"2 "<<tailPosX[1]; gotoxy(20, 6);cout<<"1 "<<tailPosX[0]; gotoxy(20, 5);cout<<"Schwanzsegmente "; gotoxy(20, 4);cout<<"xPos "<<xPos; gotoxy(20, 3);cout<<"length "<<length; */ //if(tailPosX[2]==tailPosX[3]&&length>=4) //{system("cls");cout<<"ERROR!";getch();} //************************/ } //Ende der Bilderzeugung wait(waitingTime);//dem Spieler Zeit zum Reagieren geben }//Ende des Levels level++;//naechsten Level vorbereiten length = 0;//Schwanzlaenge wieder zuruecksetzen field[randStarPosX][randStarPosY]=0;//zuletzt erzeugten Stern entfernen randStarPosX = 0;//Zufallsfelder zuruecksetzen randStarPosY = 0; while(input!=VK_RETURN)//Enter zum Fortfahren abwarten { system("cls"); gotoxy(14,14);//formatierte Textausgabe cout<<"LEVEL "<<level+1<<"\n\n Enter zum Fortfahren dr"ue"cken"; input=getch();//Eingabe aufnehmen (Enter erforderlich zum Fortfahren) if(input=='x')//Spielende durch Druecken von 'x' { system("cls"); cout<<"Vielen Dank, dass" <<" Sie Sn"ae"jk gespi" <<"elt\nhaben!"; getch(); exit(0); } } }//ENDE DER HAUPTSCHLEIFE //Spielende (Sieg) system("cls"); cout<<"Herzlichen Gl"ue"ckwunsch, Sie haben das Spiel gewonnen!" <<"\n\nCredits:\n\nSn"ae"jk by Paiam (c)2009" <<"\n\n\nZum Beenden des Programms beliebige Taste dr"ue"cken..."; getch(); } //Ende der Hauptfunktion //Codeende
Gruß, Paiam!
-
das zauberwort heißt debuggen.
da es hier anscheindend niemand für dich machen möchte, musst du es wohl selbst tun.
mfg.
-
Hallo!
Ich habe nun endlich die Lösung meines Problems gefunden. Selbst mit Debugging, welches ich bereits vor meinem ersten Post hier durchgeführt habe, kam ich bis heute nicht darauf, was denn nun falsch ist. Dann fiel es mir plötzlich ins Auge. Es ist mir durchaus bewusst, dass keiner die Arbeit für einen anderen machen möchte. Das habe ich auch nicht erwartet. Ich hoffte nur, dass jemandem der Fehler direkt ins Auge fällt, wie es heute bei mir der Fall war. Es war lediglich ein kleiner Logikfehler, der alles aufhielt. Anstatt der Schlange von hinten nach vorne jeweils mitzuteilen, wo jeder Teil des Schwanzes zu sein hat, tat ich das von vorn nach hinten, was zur Folge hatte, dass im Endeffekt alle Segmente die Position des ersten hatten. Somit lag der Fehler nicht im Code, wo ich ihn suchte, sondern in meiner Denkweise, was alles so unglaublich schwierig für mich machte.
Da das nun endlich geklärt ist, kann dieser Thread gern geschlossen werden.
Ich möchte mich, auch wenn die Lösung nicht von hier kam, dafür bedanken, dass sich so viele die Zeit genommen haben, sich meine Frage aus dem ersten Post zumindest durchzulesen.
-
Paiam schrieb:
Somit lag der Fehler nicht im Code, wo ich ihn suchte, sondern in meiner Denkweise
Du hattest keinen Fehler in deiner Denkweise, sondern bei der Portierung in den Code, was ihn falsch machte.
-
Na dann eben so
Dann beinhaltete sogar beides Fehler, da ich den in Code gefassten Fehler tausendfach betrachtete, er mir als solcher aber erst bewusst wurde, nachdem ich erkannte, dass es unlogisch ist, einer Variable den Wert einer anderen zuzuweisen, die den ihren selbst aber auch überliefert bekommen hat. Naja, wie auch immer, bin jedenfalls froh, dass ich endlich wieder voran komme.
Bevor das hier in Spam ausartet, darf der Thread geschlossen werden (falls das hier gängige Praxis ist, nachdem Fragen geklärt wurden).Gruß, Paiam!
-
Möchte nocheinmal nerven: Bei dem nächsten Projekt könntest du ja mal nach dem ADP verfahren vorgehen: Analyse - Desgin - Programmierung. Wenn du das strukturiert einhältst sind sogar weniger Denkfehler oder ähnliches gewährleistet. Außerdem berücksichtigst du wichtige Dinge beim Design, die wichtig für die spätere Programmierung sind.
-
Kóyaánasqatsi schrieb:
Möchte nocheinmal nerven: Bei dem nächsten Projekt könntest du ja mal nach dem ADP verfahren vorgehen: Analyse - Desgin - Programmierung. Wenn du das strukturiert einhältst sind sogar weniger Denkfehler oder ähnliches gewährleistet. Außerdem berücksichtigst du wichtige Dinge beim Design, die wichtig für die spätere Programmierung sind.
Und es funktioniert nicht.
-
volkard schrieb:
Und es funktioniert nicht.
Nichts gegen deine Aussage, bei mir funktioniert's oft genug selbst nicht - aber wie gehst du denn vor?
-
Badestrand schrieb:
volkard schrieb:
Und es funktioniert nicht.
Nicht's gegen deine Aussage, bei mir funktioniert's oft genug selbst nicht - aber wie gehst du denn vor?
Hauptvorgehen: In das Problem Eintauchen durch Lösen von Detailproblemen. Immer das einfachste Stück herausrauspicken und lösen. Solange damit weitermachen, bis alles ferig ist. Dadurch lerne ich die ganze Zeit über, während ich schon produktiven Code baue. Gelegentlich Erzeugen von Kronkorken und sie beschriften und sie auf dem Schreibtisch umherschieben.
Nebenvorgehen: Projektkritische Fragen vorziehen. Skaliert mein Ansatz überhaupt gut genug? Kann ein Programm in winxp überhaupt flackerfrei im Konsolefenster laufen?
-
Klingt gut, danke
-
Naja, ich muß gestehen ich habe wieder mal gesündigt. Das Programm steht jetzt. War was Kleines. Ich habe zwei Tage lang mich vor dem Anfangen gedrückt, weil immer, wenn ich mich mal kurz dransetzte, einfach kein hübscher Anfang da war. Gegen heute mitternacht kam die Erleuchtung. Jetzt steht die erste Hälfte, die bereits Daten sammeln kann. Habe nicht das leichteste zuerst gemacht, sondern sage und schreibe 120 Zeilen von vorn nach hinten in die main() geklopft und es ist trotzdem gut. Es skaliert schlecht, ist aber erstmal egal.
Die Auswertung kommt dann später. Die ist kompliziert und muß aus Performancegründen objektorientiert werden. Die Klassen werden ganze Blöcke aus der fetten main() übernehmen können und der Datensammler wird die Klassen des Auswerters bekommen und schneller werden.
Also entgegen dem, was ich predige, habe ich wohl zwei Tage (halbherzig) geplant, um dann 5.5 Stunden zu coden. Entgegen dem, was ich predige, ist mein Prog flach wie für den 64-er.
Ich kann nur sagen: Alle Generalisierungen sind falsch.