[C++] Multiplayergame // Fehler im Code bitte anschaun

Imod

Mitglied
Hey,

Ich programmier zurzeit ein Game in der Console,
es ist schon fertig aber das problem ist dass es allein nur halb so viel spass macht also hab ich einen 2ten Player reinprogrammiert.

Das problem :

Wen sich ein Spielerbewegt muss der andere warten bis er aufhört bis er wieder sich selber bewegen kann :(.

Mein Problem liegt in meiner Schleife:

Und zwar liest er die Variable c ein, werte sie in Buchstaben bzw Zahlen aus und durch die Switch anweisung wird dann der jeweilige Befehl ausgeführt.

Mein problem ist logisch er kann ja nicht von einer Tastatur mehere Zahlen bzw Buchstaben in einer Variable speichern, also hab ich eine char two angelegt, hat aber nichts gebracht, musste am shluss nur wieder alles ändern weil es so genau so wenig funtzte und der code ums doppelte länger wurde :(

Hier der code :

PHP:
char c='\0';
char ctwo='\0';
while((c=getch())!=27 &(ctwo=getch())!=27/*EDIT*/&&Stop==false)//Solange du nicht Esc drückst erhält c den Wert der Taste
          {
          switch(c)
          {
          case 'a' : ly=y;lx=x;x==0?x=79:--x;break;
          case 'd' : ly=y;lx=x;x==79?x=1:++x;break;     
          case 'w' : lx=x;ly=y;y==0?y=24:--y;break;
          case 's' : lx=x;ly=y;y==24?y=0:++y;break;     
          } 
                    switch(ctwo)
          {
          case '4' : lytwo=ytwo;lxtwo=xtwo;xtwo==0?xtwo=79:--xtwo;break;
          case '6' : lytwo=ytwo;lxtwo=xtwo;xtwo==79?xtwo=1:++xtwo;break;     
          case '8' : lxtwo=xtwo;lytwo=ytwo;ytwo==0?ytwo=24:--ytwo;break;
          case '5' : lxtwo=xtwo;lytwo=ytwo;ytwo==24?ytwo=0:++ytwo;break;     
          } 
         Textpositiontwo(lxtwo,lytwo);cout<<" "<<flush;//flush leert den Buffer und gibt ihn aus
         Textpositiontwo(xtwo,ytwo);cout<<"*"<<flush;                
         Textposition(lx,ly);cout<<" "<<flush;//flush leert den Buffer und gibt ihn aus
         Textposition(x,y);cout<<"+"<<flush;
         Textposition(o,n);cout<<"@";
         if (x == o & y == n)
         {
             score++;
             level ++;
             o = x + 4;
             n = y + 3;
         if (level == 3)
         {
             o = 40;
             n = 30;
         }    
         if (level == 7)
         {
             o = 50;
             n = 20;
         }    
         if (o > 16 & n > 16)
         {
             o = y - 10;
             n = x - 3;
         }
         }
         if (xtwo == o & ytwo == n)
         {
             scoretwo++;
             level ++;
             o = xtwo + 4;
             n = ytwo + 3;
         if (level == 3)
         {
             o = 40;
             n = 30;
         }    
         if (level == 7)
         {
             o = 50;
             n = 20;
         }    
         if (o > 16 & n > 16)
         {
             o = ytwo - 10;
             n = xtwo - 3;
         }
         }

Bitte um eine Lösung, wäre nett.

Mfg Domi

Ich benutze Dev c++, und xp
 
Da issa ja wieder^^
Wenn ich richtig denke soll das sowas wie Packman werden. stimmts?
Sag doch mla bitte, ob sich die figuren nur um ein feld pro Tastendruck bewegen sollne, oder automatisch, bis man die richtung ändert.
Wenn se sich automatisch bewegen sollen wäre es ja kein problem. denn könnte ich dir auch helfen.

Weil, so wie du das momentan selbst willöst, hab ich es selber noch nicht geschafft.

Nochwass. noch eine 2. Textpositionsfunktion anzulegen bringt nichts.

und, nochwas,, nicht das ich was gegen dev c++ ahbe (obwol, hab ich doch^^).
Ich würde auf codeblocks (http://www.codeblocks.org) umsteigen. In dev isses mir (und vielen anderen bestimmt auch) schonmal passiert, das ein Projekt ohne jeglichen grund nicht mehr compiliert werden kann.
nur so als tipp^^.

EDIT/s:

Also. zunächst benutzt du statt && nur ein & in den ifsätzen. & ist ein Bitoperator!
&& sagt, ds das AUCH erfüllt sein MUSS.
& läst sich am besten so erklären:

z.B. a= b & c;
das heits, die einzelnen bits von b und c werden miteinander verglichen:
und wenn 2 bits an der gleichen position den gleichen wert haben, wird an der position in a der bit auf 1 gesetzt!

Beispiel:

01001011(b)&
10001110(c)=
00111010(a)

verstehste?

so. werde den code beartbeiten und die whileschleife hier reinschreiben. den vollen code kannich dir wennde willst per pm schicken (also, der der t^^).
 
Zuletzt bearbeitet:
so. Code überarbeitet. bei mir geht das nun.
Neue änderungen sind mit EDIT2: gekennzeiochnet.
(hoffe habe nichts vergessen)
C++:
char c='\0';
while((c=getch())!=27 /*EDIT2 &&(ctwo=getch())!=27*//*EDIT*/&&Stop==false)//Solange du nicht Esc drückst erhält c den Wert der Taste

        //EDIT2: Das zweite getch lass mal weg und mach das mit einer Variable. Geht besser. glaubs mir

          {
          switch(c)
          {
          case 'a' : ly=y;lx=x;x==0?x=79:--x;break;
          case 'd' : ly=y;lx=x;x==79?x=1:++x;break;
          case 'w' : lx=x;ly=y;y==0?y=24:--y;break;
          case 's' : lx=x;ly=y;y==24?y=0:++y;break;
//EDIT2: belass es doch bei c. wenn de 2 ma getch hast musst du auch erst 2 mal drücken bevor was reagiert.
          case '4' : lytwo=ytwo;lxtwo=xtwo;xtwo==0?xtwo=79:--xtwo;break;
          case '6' : lytwo=ytwo;lxtwo=xtwo;xtwo==79?xtwo=1:++xtwo;break;
          case '8' : lxtwo=xtwo;lytwo=ytwo;ytwo==0?ytwo=24:--ytwo;break;
          case '5' : lxtwo=xtwo;lytwo=ytwo;ytwo==24?ytwo=0:++ytwo;break;
          }

          if(lxtwo!=xtwo||lytwo!=ytwo){
              /*EDIT2: lass das doch NUR anzeigen, wenn es unbedingt notwendig ist. ads beheb t auch den bug, das wenn der andere (player 2)
               * sich auf dem Feld xtwo,ytwo befindet, der nicht angezeigt wird.
                */

             Textposition(lxtwo,lytwo);cout<<" "<<flush;//flush leert den Buffer und gibt ihn aus
             Textposition(xtwo,ytwo);cout<<"*"<<flush;
          }

         if(lx!=x||ly!=y){//EDIT: gleicher Grund wie oben.

         Textposition(lx,ly);cout<<" "<<flush;//flush leert den Buffer und gibt ihn aus
         Textposition(x,y);cout<<"+"<<flush;

         }

         Textposition(o,n);cout<<"@";


         if (x == o && y == n) //EDIT2: Überal da wo jezt ein & in der klammer stand hab ich jezz && emacht. das war ein sehr großer fehler da den bitoperator mit dem UND operator zu verwechseln!!
         {
             score++;
             level ++;
             o = x + 4;
             n = y + 3;
         if (level == 3)
         {
             o = 40;
             n = 30;
         }
         if (level == 7)
         {
             o = 50;
             n = 20;
         }
         }
         if (o > 16 && n > 16)
         {
             o = y - 10;
             n = x - 3;
         }
         if (xtwo == o && ytwo == n)
         {
             scoretwo++;
             level ++;
             o = xtwo + 4;
             n = ytwo + 3;
         if (level == 3)
         {
             o = 40;
             n = 30;
         }
         if (level == 7)
         {
             o = 50;
             n = 20;
         }
         if (o > 16 && n > 16)
         {
             o = ytwo - 10;
             n = xtwo - 3;
         }
         }

          }

den ganzen code den ich jezz bei mir steh hab schick ich dir per PM.
Und ich weise nochmal drauf hin:

Die bitoperatoren ' | ' und ' & ' nicht mit den Logischen operatoren ' || ' und ' && ' verwechseln!
 
ich sag mal Danke :)

Ach ja ich hab mir COdeblocks schon vor ner weile runtergeladen gefällt mir aber persöhnlich net.

Und dein problem bei Dev C++ da musste dann nur auf comiliern und dann auf Programm zurücksetzen.

Und das 2 geht nicht zum compiliern Problem kann ich nicht erkläarn --> sorry

Mfg Domi
 
sorry aber das Programm funtzt immer noch nicht :(

Man kann wie vorher immer ein Spieler bewegen aber der 2 bleibt stehn.

DAs bedeutet man kann nicht beide Spieler gleichzeitig bewegen.

Mfg Domi
 
, ja. das mit GLEICHZEITIG ist auch schwer. das kann ich leider selber nicht.

ABER man kann, wenn die spieler die tasten nur sehr schnell drückrn, da zu 2. spielen. bei mir ging der code. konnte beide steuern

Aber warscheinlich ist das wohl nicht so wi du es willst.
Ich glaube in der Win API gibs sowas.
Aber mit der kenne ich mich leidre nicht so gut aus.

Und, ist es wirklich nur der Fehler, oder eher das markel, das man keine 2 tasten gleichzeitig drücken kann? Weil, wie gesagt, dafür kenne ich keine lösung.

Aber wenns SNAKE werden soll, kann ich dirbn sagen wie se sich von alleine fortbewegen können^^.

mfg Drache2
 
scahde :( dann kann ich mein multiplayer vergessen :(

aber das wär hamemr wen du mir das mit Snake zeigst dann find ich vill noch ne lösung
 
Also. ich erklärs mal an sowas wie nem beispiel code. (für dich auch im php code reingestelt^^

PHP:
#include <windows.h> //wird für Textposition benötigt
#include <iostream>
#include <conio.h>
#include <process.h> //Wird für Threads (parallel Laufende prozesse) benötigt.

using namespace std;

volatile char Tastendruck='\0'; //Hier wird der Tastendruck abgespeichert.

VOID Tastendruckerkennung (PVOID pvoid){ //Dieser thread liest die Tastendrücke mit getch ein.

    while((Tastendruck=getch())!=27);//liest die Taste paralel zu main aus.

    Tastendruck=27;//Weil die Variable den Wert dann meistens noch nicht hat wllen wir einfach mal schergehn^^

}


void Textposition(int x, int y)

   {

            COORD coordScreen;

            coordScreen.X = x;

            coordScreen.Y = y;

            SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), coordScreen);

    }

int main () {

    unsigned x=0;//unsigned bedeutet, das die Zahl kein vorzeichen hat. (ist hier ein intwert. es geht z.B. auch unsigned short)
    unsigned y=0;

    unsigned lx=x;
    unsigned ly=y;

    char a=-37; //-37 ist der charcode für einen weißen Klotz.

    _beginthread(Tastendruckerkennung,NULL,0);

    while(Tastendruck!=27){

        lx=x;ly=y;

        switch(Tastendruck){

            case 'a' : x==0 ?x=79:--x;break; //Hier werden verkürzte ifsätze verwendet.
            case 'd' : x==79?x=0 :++x;break;

            case 'w' : y==0 ?y=25:--y;break;
            case 's' : y==25?y=0 :++y;break;

        }

        Textposition(lx,ly);cout<<' ';
        Textposition(x ,y );cout<<a<<flush;

        Sleep(100);//bestimmt hier a, die wartezeit und b die anzeigegeschwindigkeit.

    }

}

ich denke im code wird dir alles erklärt.
Hauptsächlich wird der tastendruck "nur nebenbei" abgefragt und behält solange seinen wert bis ma eine andere taste drückt.

mann könnte statt des threads natürlch auch folgendes inn die while schleife schreiben:

PHP:
if(kbhit()){Tastendruck=getch()}

daserspart den thread^^

diese Variante dürfte in deinem fall deke ich mal reichen^^

(warum bin ich nich bei meinem snake schon daruf gekommen?)
 
Zurück