Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Timmyew

Treue Seele

  • »Timmyew« ist der Autor dieses Themas

Beiträge: 128

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

11

07.01.2014, 20:35

Danke für die antwort :)
Werde mich bemühen

12

07.01.2014, 20:43

ich glaube, das was du wilst sollte ganze einfach damit zu lösen sein.
Indem du das feld änderst und dann, das raster nochmal zeichnen.

Am besten packst du das in eine Schleife.

Grüsse Spitzohr

Timmyew

Treue Seele

  • »Timmyew« ist der Autor dieses Themas

Beiträge: 128

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

13

07.01.2014, 22:01

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>using namespace std;

int main() {int Punkt , Eingabe;int Kord[9];

while(1==1){    Kord[1] = 1;Kord[2] = 1;Kord[3] = 1;Kord[4] = 1;Kord[5] = 1;Kord[6] = 1;Kord[7] = 1;Kord[8] = 1;Kord[9] = 1;
cout << " 1 = oben , 2 = unten , 3 = links , 4 = rechts "<<endl;cin>> Eingabe;

if(Eingabe ==1){    Punkt = Punkt -3;}
if(Eingabe ==2){    Punkt = Punkt+3;}
if(Eingabe ==3){    Punkt = Punkt -1;}
if(Eingabe ==4){    Punkt = Punkt +1;}
if(Punkt<=1){   Punkt = 1;}if(Punkt>=9){    Punkt = 9;}if(Punkt==1){Kord[1] = 2;}if(Punkt==2){Kord[2] = 2;  }if(Punkt==3){Kord[3] = 2;      }if(Punkt==4){Kord[4] = 2;      }if(Punkt==5){Kord[5] = 2;  }if(Punkt==6){Kord[6] = 2;      }if(Punkt==7){Kord[7] = 2;  }if(Punkt==8){Kord[8] = 2;      }if(Punkt==9){Kord[9] = 2;  }
cout <<"-----"<<endl;cout <<Kord[1]<<Kord[ 2]<<Kord[ 3]<<endl;cout <<Kord[4]<<Kord[ 5]<<Kord[ 6]<<endl;cout <<Kord[7]<<Kord[ 8]<<Kord[ 9]<<endl;cout <<"-----"<<endl;
}
        return 0;}

so habs geschafft , es bugt noch etwas rum wenn ich jetzt zum beispiel 4 eingebe zeigt das programm am untersten feld auch eine 4 an aber sons funktioniert es :)
der quellcode wird hier etwas verbugt gepostet :/

Tankard

Treue Seele

Beiträge: 192

Beruf: Student, Hardware- und Softwareentwicklung als wissenschaftliche Hilfskraft

  • Private Nachricht senden

14

07.01.2014, 22:27

Das läuft ja ansich schon, aber es tut glaube ich nicht ganz das was du willst.

Wenn du ganz links bist und nach links gehst, soll er dann wirklich rechts in der Zeile drüber weitermachen?

Außerdem solltest du dir noch ein paar Fragen stellen. Z.B. warum benutzt du für ein 3x3 Feld ein 1x9 Array und kein 3x3? Warum überprüfst du die Eingabe auf alle korrekten Eingaben und hörst mit der Überprüfung nicht auf, sobald du einen Treffer hast (Stichwort else)? Musst du wirklich für eine Fallunterscheidung für jede mögliche Position machen?

Versuche doch mal ein 3x3 Feld. Dort hast du dann ja zwei Indizes (Zeilen und Spalten) und kannst diese direkt manipulieren. Somit ist es viel einfacher das richtige Verhalten für oben/unten/links/rechts zu implementieren. Um nicht aus deinem Feld rauszugehen kannst du dann ja die von dir angegebene Größe verwenden.
Und du darfst keine nichtinitialisierten Variablen verwenden. Bei mir kam direkt eine Meldung dazu.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

15

08.01.2014, 15:25

Nichtinitialisierte Variablen machen bei Visual Studio solange man im Debug Modus arbeitet normal keine Probleme. Sobald man aber als Release kompilieren möchte geht der Spaß los. Dann nimmt dir Visual Studio die Initialisierung nämlich nicht mehr ab und es kann schnell zu Fehlern kommen. Deshalb Variablen bitte immer initialisieren. Codeformatierung wurde ja schon angesprochen. Die Klammern bei If-Blöcken und Schleifen solltest du dir auch meiner Meinung nach unbedingt angewöhnen. Vor allem am Anfang macht man hier schnell mal Fehler. Gewöhn es dir einfach direkt mit Klammern an, dann bist du auf der sicheren Seite.
Ob man nun eindimensionale oder zweidimensionale Arrays benutzt ist eigentlich relativ egal. Dafür muss man wissen wie Arrays im Speicher angelegt sind. Ich mache es kurz. Wenn du ein Buch hast wird sowas vermutlich erwähnt werden.
Beispiel 1 eindimensionales Array:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int *values;
values = new int[9];

// Array mit Werten füllen
for(int i = 0; i < 9; i++)
{
    values[i] = i;
}

// Adressen der einzelnen Arraystellen ausgeben:
for(int i = 0; i < 9 ; i++)
{
    std::cout << &values[i] << std::endl;
}

Oben wird das Array angelegt, erstellt und gefüllt. Kurz darunter ist eine zweite Schleife. Diese gibt die Adressen im Speicher der einzelnen Arraywerte an. Hierbei fällt auf, dass die Adressen nach einem bestimmten Schema aufeinander folgen. Der Abstand zweier Elemente im Array ist gleich der Größe deines benutzten Datentyps.
Nehmen wir mal an int hat 4Byte, dein Array besteht aus 4 Elementen und das erste Element hat die Speicheradresse 25. Dann wären die Speicheradressen der Arrayinhalte wie folgt:
25 | 29 | 33 | 37
also jeweils 4 Byte (die hier angenommene Größe von int).
Wenn du jetzt ein zweidimensionales Array erstellst ist das im Prinzip ein Array von Arrays. Ein 3 mal 3 Array wäre also ein Array der Größe 3 vom Datentyp Array (welche auch die Größe 3 haben).
Im Speicher wären also die einzelnen Arrays des äußeren Arrays hintereinander. Du kannst das testen indem du einfach wieder ein Array erstellst und dir die Speicheradressen ausgeben lässt. Erst kommen die Werte des Arrays welches an erster Stelle im "äußeren" Array liegt. Dann die des zweiten und so weiter.
Zwischen den Indizes kannst du nun ganz einfach umrechnen.

Stell dir vor du hast ein Array der Länge 9 gefüllt mit den eigenen Indizes, also den Zahlen 0 bis 8.
0 1 2 3 4 5 6 7 8

Jetzt schreib das ganze mal ein wenig anders auf:
0 1 2
3 4 5
6 7 8

Hier ist das ganze als zweidimensionales Raster aufgeschrieben. Das untere sieht ja eher wie ein zweidimensionales Array aus. Dabei ist jede Zeile ein Array und das gesamte ist das umschließende Array. Oben würdest du spontan mit einem Index arbeiten. Unten bei einem zweidimensionalen Array mit zwei. Im Speicher selbst sehen aber sowohl eindimensionale als auch zweidimensionale Arrays gleich aus. Also überleg dir doch mal wie du dazwischen umrechnen kannst. Als Hilfe, ein paar Werte die du unter Umständen benötigen wirst:
länge = 9, (oben)
breite = 3, (unten)
höhe = 3, (unten)

und die Indizes die benötigt werden nennen wir mal i für den oberen Fall und x und y für den unteren.
So wäre die Zahl 7 im oberen Fall bei Index 7, im unteren Fall bei Index x = 1 und y = 2 (immer daran denken dass wir bei 0 anfangen zu zählen).
Jetzt musst du dir überlegen über welche Formel man aus x und y möglicherweise i berechnen kann. Außerdem kann man sich über zwei Formeln jeweils x und y aus i berechnen. Hilfreich sind dabei unter Umständen die drei oben stehenden Werte länge, breite, höhe. Aber genug Tipps. Versuch dich vielleicht mal selbst.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Tankard

Treue Seele

Beiträge: 192

Beruf: Student, Hardware- und Softwareentwicklung als wissenschaftliche Hilfskraft

  • Private Nachricht senden

16

08.01.2014, 15:36

Auch wenn ein- und zweidimensionale Arrays im Speicher gleich aussehen, bin ich trotzdem kein Fan davon einfach eindimensionale mit dieser Begründung zu nutzen. Ich finde Datenstrukturen sollten im Code so repräsentiert werden, wie sie logisch verwendet werden und nicht wie sie intern abgelegt sind.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

17

08.01.2014, 15:43

Es gibt faktisch in C++ keine echten 2 dimensionalen dynamischen Arrays.

Deshalb muss man sich halt behelfen und der sinnvollste Weg geht in der Regel über eindimensionale Arrays, die so adressiert werden müssen, dass sie sich wie 2 Dimensionale nutzen lassen.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

18

08.01.2014, 15:45

Es wurden ja bereits gute Hinweise und eine gute Erklären über den Unterschied zwischen 1- und 2-dimensionalen Arrays gebracht.

Abgesehen davon solltest du dir auch angucken, was man mit dem Schlüsselwort switch machen kann. Wenn man, wie bei dir, den Wert einer Variable auf mehrere Möglichkeiten prüfen will, bietet es sich an, switch zu verwenden.

C-/C++-Quelltext

1
if(Punkt==1){Kord[1] = 2;}if(Punkt==2){Kord[2] = 2;  }if(Punkt==3){Kord[3] = 2;      }if(Punkt==4){Kord[4] = 2;      }if(Punkt==5){Kord[5] = 2;  }if(Punkt==6){Kord[6] = 2;      }if(Punkt==7){Kord[7] = 2;  }if(Punkt==8){Kord[8] = 2;      }if(Punkt==9){Kord[9] = 2;  }
In diesem Fall würde ein switch den Code auch vereinfachen, allerdings wird in jedem Fall das gleiche gemacht, nur wird der Wert der geprüften Variable verwendet. Da man auf Arrays nicht nur mit Konstanten zugreifen kann, sondern auch mit Variablen Werten, kann man einfach Koord[Punkt] = 2; schreiben und spart sich eine Menge Code, wodurch das ganze auch wesentlich übersichtlicher wird.

C-/C++-Quelltext

1
Kord[1] = 1;Kord[2] = 1;Kord[3] = 1;Kord[4] = 1;Kord[5] = 1;Kord[6] = 1;Kord[7] = 1;Kord[8] = 1;Kord[9] = 1;
Hier sollten unbedingt die richtigen Indizes verwendet werden:

C-/C++-Quelltext

1
Kord[0] = 1;Kord[1] = 1;Kord[2] = 1;Kord[3] = 1;Kord[4] = 1;Kord[5] = 1;Kord[6] = 1;Kord[7] = 1;Kord[8] = 1;
Und auch dann kann man es noch vereinfachen: Jedem Element des Arrays wird der gleiche initiale Wert zugewiesen. Du könntest also mit einer Zählschleife (Schlüsselwort for) von einschließlich 0 (int i = 0;) bis 1 unter der Größe des Arrays (i < 9;) in 1er Schritten (i = i + 1, i += 1, ++i oder i++) zählen und die Zählvariable (i) als Index verwenden, um jedem Element den Initialwert zuzuweisen (Koord[i] = 1;).

Ich frag mich immer warum sich Leute freiwillig sowas wie Python antun.
Ich kann nicht nachvollziehen, was dagegen sprechen sollte. Python bietet einige Interessante Dinge, so kann man das Verhalten der Standardfunktionen mit Hilfe der "Magic Member" beeinflussen.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Sacaldur« (08.01.2014, 15:53)


Tankard

Treue Seele

Beiträge: 192

Beruf: Student, Hardware- und Softwareentwicklung als wissenschaftliche Hilfskraft

  • Private Nachricht senden

19

08.01.2014, 16:00

Es gibt faktisch in C++ keine echten 2 dimensionalen dynamischen Arrays.

Stimmt, aber bei dynamischen Arrays sind wir hier ja noch nicht. Ich würde erstmal mit 2D arbeiten, solange die größen noch fest sind.

Ich frag mich immer warum sich Leute freiwillig sowas wie Python antun.
Ich kann nicht nachvollziehen, was dagegen sprechen sollte. Python bietet einige Interessante Dinge, so kann man das Verhalten der Standardfunktionen mit Hilfe der "Magic Member" beeinflussen.

Kein Kollege von mir (ohne Programmiererfahrung) musste sich ein wenig mit Python befassen und jetzt zum ersten mal ein Projekt mit GUI (QT) und richtiger Struktur machen. Da wollte ich ihm ein kleines Gerüst basteln um ihm so ein paar Grundlagen zu zeigen. Als ich mir die ersten Python Codeschnipsel angeguckt hab dachte ich mir "das tu ich mir nicht an". Liegt vielleicht auch daran dass ich die ganzen C-Style Sachen (C, C++, C#, Java) gewöhnt bin und bis auf MATLAB noch nie etwas anderes benutzen musste.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

20

08.01.2014, 16:17

Zitat

Stimmt, aber bei dynamischen Arrays sind wir hier ja noch nicht.

Achso? Ich habe den Thread jetzt nicht komplett mitverfolgt. In Schorschs Codebeispiel wurde jedoch dynamisch alloziert, deshalb ging ich davon aus.
Fixe 9 Elemente wären auf den Stack sowieso viel besser aufgehoben. (int Value[9];)

Werbeanzeige