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

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

1

17.07.2007, 13:01

im 2D arry bewegen ?

Hey leute ,

also ich versuche seit ein paar Tagen es zu schaffen einen Punkt durch Tasten druck in einer Konsole zu bewegen (Windows).

Nun dachte ich mir erzeugst du ein 2 D arry und durch eine endlos switch schleife Frage ich die Tasten ab und sage je nach passenden Case dann wo er sich hinbewegen soll. Nur leider hapert es einwenig bei der Umsetzung

C-/C++-Quelltext

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
int main()
{
    int arr[3][3];  // Arry Feld (kleines)

    arr[0][0] = 0;
    arr[0][1] = 1;
    arr[0][2] = 2;
    arr[1][0] = 3;
    arr[1][1] = 4;
    arr[1][2] = 5;
    arr[2][0] = 6;
    arr[2][1] = 7;
    arr[2][2] = 8;
    
    
    int eing;
    cin >> eing;
    switch(eing)
    {
        case 'w':   //erste Case 

        {
            

         }






    }


So nun hab ich ein paar Probleme. Nämlich wie mache ich es das man bei der eingabe kein enter drücken muss ( wegen dem CIn) . Dann wie sag ich in den Einzelnen Cases wo sich der Punkt hinbewegen soll bzw wie erzeuge ich überhaupt einen Punkt? Eigentlich schwebt mir etwas anderes im Kopf rum aber diese umsetzung ist noch mal sehr schwieriger nämlich das die map als binary einglesen wird :

Zur erklärung :

ver. felder: 0 Wand 1 Begehbar 2 Wasser und das sieht dann so aus:
0000000000
0111221110
0112222110
0111211110
0111111110
0000000000

aber ich weiß nicht wie man das macht und such auch schon seit Tagen.
Hat wer vielleicht beispielcodes für mich oder kann mir so helfen. Bin langsam schon am verzeifeln :/

MFG Toa

2

17.07.2007, 13:14

die map als binary würde trotzdem auf einem 2d koordinaten system basieren.
du musst einfach die aktuelle position betrachten, und wenn er W drückt gucken ob das feld darüber (ich geh jetzt mal davon aus das w nach oben heißt^^) begehbar ist (bei wasser musst du evtl noch gucken ob es nur dann begehbar ist wenn der hero nen gegenstand hat, z.b. ein boot) und wenn ja bewegst du ihn dahin und wen nein bewegste den player nciht. eig recht simpel.

aber wie du das mit dem dauernden abfragen machen sollst, keien ahnung. ich glaub mit streams kommst du da nicht weit.

R3sident3vil

Treue Seele

Beiträge: 177

Wohnort: 1010010

Beruf: Selbstständig

  • Private Nachricht senden

3

17.07.2007, 13:32

Re: im 2D arry bewegen ?

Zitat von »"Toa"«


So nun hab ich ein paar Probleme. Nämlich wie mache ich es das man bei der eingabe kein enter drücken muss ( wegen dem CIn) .


Nun das geht ganz einfach, benutz dafür _getwch();

C-/C++-Quelltext

1
2
3
4
// anstatt...

cin >> eing;
// machst du...

eing = _getwch();


Das heißt, du drückst die entsprechende Taste, und das Programm wird sofort reagieren, ohne die eingabe mit Enter zu bestätigen. IN der Regel sollte es klappen. Ich weiß jetzt aber nicht welche Header man dafür :shock: braucht:...
eine von diesen auf jeden Fall:
#include <iostream>
#include <windows.h>
#include <wchar.h>
#include <process.h>
#include <conio.h>
#include <stdlib.h>

Ich denke du müsstest das so machen

C-/C++-Quelltext

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
#include <iostream>
#include <windows.h>
#include <wchar.h>
#include <process.h>
#include <conio.h>
#include <stdlib.h>

using namepsace std;
//-----------------------------------------


int main ()
{
       WCHAR up;
       WCHAR down;
       WCHAR right;
       WCHAR left;

       up = _getwch();
       down = _getwch();
       right = _getwch();
       left = _getwch();

       if (up == L'w' || up == L'W')
       {
             //Ausführung

       }
       //etc...

}
;)
Kaum ist Linux wieder da, schon gehts meinem Rechner wunderbar, denn Linux ist die beste Medezin.

Olischewsky Arts

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

4

17.07.2007, 13:37

Zitat von »"Eldarion72"«

die map als binary würde trotzdem auf einem 2d koordinaten system basieren.
du musst einfach die aktuelle position betrachten, und wenn er W drückt gucken ob das feld darüber (ich geh jetzt mal davon aus das w nach oben heißt^^) begehbar ist (bei wasser musst du evtl noch gucken ob es nur dann begehbar ist wenn der hero nen gegenstand hat, z.b. ein boot) und wenn ja bewegst du ihn dahin und wen nein bewegste den player nciht. eig recht simpel.

aber wie du das mit dem dauernden abfragen machen sollst, keien ahnung. ich glaub mit streams kommst du da nicht weit.



Ja das ist ja meine Frage ^.^
Wie mach ich das das ich einen Spieler ( zb. als pUnkt erzeuge) und dem dann auf ein bestimmtes Feld im Arry setze. Und wie sag ich ihm das er nach oben zb gehen soll über x und y ? case 'w' : aktuelle_pos - 1y ?
Mit 2D arrys hab ich noch nicht so viel erfahrung wie man merkt xD hoffe ihr könnt mich da bissle unterstützen .... und @ R3sident3vil ..Thx den Header find ich schon ^.^

Edit : Komisch _getwch <conio.h> or <wchar.h> aber mein Compiler sagt bei der Zeile up = _getwch(); immer undecleard funktion

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

5

17.07.2007, 15:39

Schau mal das hier an, für Zeichnen an bestimmten Positionen und anderes. Allerdings sind da einige Sachen drin, die ich zwar mal verwendet habe, inzwischen aber anders machen würde (vor allem das cls)

https://www.spieleprogrammierer.de/phpBB2/viewtopic.php?t=6968

Ich werd mich irgendwann heut nochma hinsetzen und nen paar Änderungen für diesen FAQ Artikel schreiben ;)

6

17.07.2007, 16:36

es ist eig. recht einfach mit dem bewegen. du speicherst die koordinaten vom helden in seiner klasse. nennen wir sie jetzt mal x und y.

dann machst du folgendes

C-/C++-Quelltext

1
2
3
4
if (up == L'w' || up == L'W') 
{
Player.y += 1;
}


und schon ist der player eins weiter oben. dann nimmst du den ursprungszustand des arrays und überschreibst das feld [Player.x][Player.y] mti der zahl die für den player steht und dann malst du alles.

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

7

17.07.2007, 16:58

Das Problem, wenn man alles neu zeichnet ist leider, dass das Spiel oft in eine Flimmerpartie ausartet - deswegen sollte man lieber nur gezielt das nachzeichnen, was verändert wurde.

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

8

18.07.2007, 11:25

Zitat von »"grek40"«

Schau mal das hier an, für Zeichnen an bestimmten Positionen und anderes. Allerdings sind da einige Sachen drin, die ich zwar mal verwendet habe, inzwischen aber anders machen würde (vor allem das cls)

https://www.spieleprogrammierer.de/phpBB2/viewtopic.php?t=6968

Ich werd mich irgendwann heut nochma hinsetzen und nen paar Änderungen für diesen FAQ Artikel schreiben ;)


Also der Faq beitrag ist Klasse , aber wie zeichnet man denn einzelne Sachen Z.b die umrandung des Feldes , oder den Punkt des Spielers. Oder Striche in das Feld ?

Also ich hab es jetzt so =)

C-/C++-Quelltext

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
#include <iostream>
#include<windows.h>
#include<conio.h>
#include<process.h>
#include<time.h>
#include<stdlib.h>
#include<ctype.h>
#include <process.h>
#include <wchar.h>

using namespace std;

class player
{
    public :

    int x;
    int y;
};





int main()
{

    int arr[player.x][player.y];

    player hero;

       WCHAR up;
       WCHAR down;
       WCHAR right;
       WCHAR left;

       up = _getche ();
       down = _getche ();
       right = _getche ();
       left = _getche();


       if (up == L'w' || up == L'W')
       {
            system("cls");
            hero.y += 1;
             cout<<char(4)<<endl;
       }
       if(down == L's' || down == L'S')
       {
           system("cls");
           hero.y -= 1;
           cout<<char(4)<<endl;
       }
       if(right == L'a' || right == L'A')
       {
           system("cls");
           hero.x += 1;
           cout<<char(4)<<endl;
       }
       if (left == L'd' || left == L'D')
       {
           system("cls");
           hero.x -= 1;
            cout<<char(4)<<endl;
       }

}













also ich hab jetzt _getche () statt _getwch genommen weil das _getwch findet er in #include<conio.h> nicht :(
und das cout<<char(4)<<endl; soll immer der Punkt des CHarakters sein .. oder hab ich was falsch gemacht weil so ganz geht es nicht^^

PS : _getwch(); <-- kennt er net trotz richtigem HEader

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

9

18.07.2007, 14:46

Zitat von »"Toa"«

Zitat von »"grek40"«

Schau mal das hier an, für Zeichnen an bestimmten Positionen und anderes. Allerdings sind da einige Sachen drin, die ich zwar mal verwendet habe, inzwischen aber anders machen würde (vor allem das cls)

https://www.spieleprogrammierer.de/phpBB2/viewtopic.php?t=6968

Ich werd mich irgendwann heut nochma hinsetzen und nen paar Änderungen für diesen FAQ Artikel schreiben ;)


Also der Faq beitrag ist Klasse , aber wie zeichnet man denn einzelne Sachen Z.b die umrandung des Feldes , oder den Punkt des Spielers. Oder Striche in das Feld ?

.............


und das cout<<char(4)<<endl; soll immer der Punkt des CHarakters sein .. oder hab ich was falsch gemacht weil so ganz geht es nicht^^

PS : _getwch(); <-- kennt er net trotz richtigem HEader


Also dir sollte klar sein, dass du in der Console nicht nach belieben rumzeichnen kannst, sondern mit den verschiedenen Schriftzeichen auskommen musst (weil ich hier grad was von Umrandungen und Strichen lese).
Um einen Überblick über die vorhandenen und in der Console nutzbaren Zeichen zu erhalten kannst du ja mal schnell ein Programm schreiben, dass 0-255 als Nummer und dazugehöriges Zeichen ausgibt -> da kannste dann genau sehen, was möglich ist und was nicht.
Hinweis: um eine Zahl sowohl als Nummer als auch als Zeichen anzuzeigen solltest du folgendes tun (vereinfacht):

C-/C++-Quelltext

1
2
int i=4;
std::cout << i << '\t' << static_cast<char>(i) << std::endl

Toa

Alter Hase

  • »Toa« ist der Autor dieses Themas

Beiträge: 944

Beruf: Research associate

  • Private Nachricht senden

10

18.07.2007, 23:46

Super danke , und wie mach ich zb ein Zeichen das einen STrich darstellt rings um um das gesamte 2 D Arry ?

Und dann noch die andere Frage ob mein ANsatzcode oben richtig ist mit dem Ausgeben des Punktes oder muss ich das anders machen ?

Und warum findet er _getwch() trotz eingebundenen <conio.h>
Headers ?

Also ich will ja nicht in der Konsole Zeichnen sondern wie du schon richtig gesagt hast die Zeichen die Möglich sind an bestimmte Punkte im Arry setzen sodas zb später ein Eckiger Punkt ein Baum ist oder soetwas.

Hoffe ihr könnt all meine Fragen beantworten

Werbeanzeige