4 in a row game

Status
Niet open voor verdere reacties.

pom86

Gebruiker
Lid geworden
28 jul 2007
Berichten
9
Ik heb een spelletje gemaakt.
Het is mijn aller eerste script in c++
Dit is nog wel een alpha release.
dus bugs zullen er wel inzitten.

Hier is de code:
PHP:
#include <iostream>
#include <windows.h>
#include <conio.h>
//for fullscreen
void AltEnter()
{
    keybd_event(VK_MENU,0x38,0,0);
    keybd_event(VK_RETURN,0x1c,0,0);
    keybd_event(VK_RETURN,0x1c,KEYEVENTF_KEYUP,0);
    keybd_event(VK_MENU,0x38,KEYEVENTF_KEYUP,0);
}

BOOL NT_SetConsoleDisplayMode(HANDLE hOutputHandle, DWORD dwNewMode)
{
    typedef BOOL (WINAPI *SCDMProc_t) (HANDLE, DWORD, LPDWORD);
    SCDMProc_t SetConsoleDisplayMode;
    HMODULE hKernel32;
    BOOL bFreeLib = FALSE, ret;
    const char KERNEL32_NAME[] = "kernel32.dll";

    hKernel32 = GetModuleHandleA(KERNEL32_NAME);
    if (hKernel32 == NULL)
    {
        hKernel32 = LoadLibraryA(KERNEL32_NAME);
        if (hKernel32 == NULL)
            return FALSE;

        bFreeLib = true;
    }
}

using namespace std;

int spreek(int x , int y);
int menu(); //option variable
int optionnum; //option keuze

int iplayers();
int players = 2; //aantal speler
int player = 1; //speler die aan de beurt is

int x; //coördinaat links naar rechts
int y; //coördinaat boven naar onder

//speelveeld coördinaten
int maxx = 8;
int maxy = 8;

int speelveld[9][9]; //grote van de array van het speelveld
int xstart = 1; //het begin van het speelveld van links naar rechts
int xend = 8;  // het einde van het speelveld van links naar rechts
int ystart = 1; //de begin rij van eht speelveld
int yend = 8; //het maximaal aantal rijen

int inarow = 4; //how mutch we need to get together
int status; //controleren of een spel al/nog aan de gang is
int spelen(); //controleert alles wat er op het speelbord gebeurt
int resetgame(); //resetten van het bord

//development variable
int dev_countcom = 0;
//menu variables
int options();
int gameoptions();


int main() {  
//AltEnter();
menu();

cin.ignore();
cin.get();
}

//option menu
int menu() {
system("cls"); 
cout<<"1: New game \n";
if(status != 0){ cout<<"2: Resume game \n"; } else { cout<<"2: N/A \n"; }
cout<<"3: Players ["<<players<<"]\n";
//cout<<"4: Options \n";
cout<<"5: Quit \n";
cin>> optionnum;
cin.ignore();
      switch ( optionnum ) {
       case 1:
       system("cls");
       cout<<"Starting a new game";
       resetgame();
       spelen();
       break;
       case 2:
       cout<<"Resumming a game";
       spelen();
       break;
if(status != 0){ cout<<"2: Resume game \n"; 
       case 3:
       system("cls");
       iplayers();
       
       break;
}
/*       case 4:
       options();   
       break;
*/
       case 5:
       cout<<"Goodbey";
       status = 666;
       break;
       default:
       cout<<"Not a valid option ";
       menu();
       break;
       }
}       
//het creëren van het speelveld
int spelen() {
if((status <= 1) && (status >= 0 )){
    system("cls");
   if (status == 0){
      resetgame();
      }
    for(y = ystart; y <= yend; y++){
          for(x = xstart; x <= xend; x++)
          if(speelveld[x][y] == 0){
          cout<<"[ ]";  
          }
          else{
          cout<<"["<<speelveld[x][y]<<"]";  
          }  
          cout<<"\n";
    } 
   spreek( x,y);
}  
}
// het vragen naar de 2 coördinaten om te spelen
int spreek( int x, int y ) {

  cout<<"Player "<<player<<" insert 0 for menu: \n";
  cout<<"Player "<<player<<" insert into row: ";
  cin>> x;
  cin.ignore();
  //Controleren of er nog niks in het opgegeven veld staad
  if(speelveld[x][1] == 0){
  //Nagaan of de opgegeven coördinaten niet boven de limiets uitkome
        if(x == 0 ) {
        menu();        
        }   
        else if((x > xend ) || (x < xstart )){
        cout<<"Wrong input, try again \n";
        spreek( x,y);
        }   
        else{ 
        int yc = 1; //het maximale y om te checke in welk veld het fiche komt.
        y = maxy;
           while(yc != 0){
                 if((speelveld[x][y] != 0) && (y >= 1)){ 
                 y--;
                 if(dev_countcom == 1){ cout<<"Checking speelveld for opening: ["<<x<<"]["<<y<<"] \n"; }                    
                 }
                 else if((speelveld[x][y] == 0) && (y >= 1)){
                 speelveld[x][y] = player;
                    if(dev_countcom == 1){ cout<<"Checking speelveld for opening: ["<<x<<"]["<<y<<"] \n"<< cin.get(); }
                    yc = 0;
                 }
                 else if((speelveld[x][y] == 0) && (y < 1)){
                  cout<<"Row is full \n";
                  yc = 0;
                  spreek( x,y);
                  }  
                                    
           }                              
        
        }
  }
  else {
  cout<<"Error \n";
  spreek( x,y);     
  }  
  int xcheck = x; //checking from left to right for 4 in a row
  int ycheck = y; //checking from up to down for 4 in a row
  int dcheck;  //checking diagonaal for 4 in a row
  int ncheck = 0; //counting the right numbers from all positions
  int echeck = 0;  //progressing the checkup
  //checking from x to left
  while(echeck < 9){
  //controleren vanaf x,y naar links
       if((speelveld[xcheck][ycheck] == player) && (echeck == 0) && (ncheck < inarow)){
                                     
       if(dev_countcom == 1){ cout<<"Checking speelveld: ["<<xcheck<<"]["<<ycheck<<"] \n"; }
       xcheck--;
       ncheck++;
       }
       //Waneer van x,y naar links een ander nummer tegenkomt gaat hij naar rechts controleren
       else if((speelveld[xcheck][ycheck] != player) && (echeck == 0) && (ncheck < inarow)){
       xcheck = x + 1;
       echeck = 1;
       if(dev_countcom == 1){ cout<<"Resetting counters  for x to right: ["<<xcheck<<"]["<<ycheck<<"] \n";  }    
       }
       //Controleren vanaf x,y naar rechts
       else if((speelveld[xcheck][ycheck] == player) && (echeck == 1) && (ncheck < inarow)){
       if(dev_countcom == 1){ cout<<"Checking speelveld: ["<<xcheck<<"]["<<ycheck<<"] \n"; }
       xcheck++;
       ncheck++;
       }
       //Waneer van x,y naar rechts een ander nummer tegenkomt gaat hij van boven naar onder controleren
       else if((speelveld[xcheck][ycheck] != player) && (echeck == 1) && (ncheck < inarow)){
       xcheck = x;
       ncheck = 0;
       echeck = 2;
        if(dev_countcom == 1){ cout<<"Resetting counters  for y to up: ["<<xcheck<<"]["<<ycheck<<"] \n"; }
       }
       //Controleren vanaf x,y naar boven
       else if((speelveld[xcheck][ycheck] == player) && (echeck == 2) && (ncheck < inarow)){
        if(dev_countcom == 1){ cout<<"Checking speelveld: ["<<xcheck<<"]["<<ycheck<<"] \n"; }
       ycheck--;
       ncheck++;
       }
       //reset
       else if((speelveld[xcheck][ycheck] != player) && (echeck == 2) && (ncheck < inarow)){
       ycheck = y + 1;
       echeck = 3;
        if(dev_countcom == 1){ cout<<"Resetting counters for y to down: ["<<xcheck<<"]["<<ycheck<<"] \n"; }
       }
       //Controleren vanaf y naar onder
       else if((speelveld[xcheck][ycheck] == player) && (echeck == 3) && (ncheck < inarow)){
        if(dev_countcom == 1){ cout<<"Checking speelveld: ["<<xcheck<<"]["<<ycheck<<"] \n"; }
       ycheck++;   
       ncheck++;
       }     
         
       else if((speelveld[xcheck][ycheck] != player) && (echeck == 3) && (ncheck < inarow)){
       ycheck = y;
       ncheck = 0; 
       echeck = 4;       
        if(dev_countcom == 1){ cout<<"Resetting counters for y,x to left up: ["<<xcheck<<"]["<<ycheck<<"] \n"; }
       }
       //Controleren vanaf x,y naar links bovem
       else if((speelveld[xcheck][ycheck] == player) && (echeck == 4) && (ncheck < inarow)){
        if(dev_countcom == 1){ cout<<"Checking speelveld: ["<<xcheck<<"]["<<ycheck<<"] \n"; }
       ycheck--;   
       xcheck--;
       ncheck++;
       } 
       //Resetten om naar rechts onder te gaan
       else if((speelveld[xcheck][ycheck] != player) && (echeck == 4) && (ncheck < inarow)){
       ycheck = y + 1; 
       xcheck = x + 1;
       echeck = 5;       
        if(dev_countcom == 1){ cout<<"Resetting counters for y,x to right under: ["<<xcheck<<"]["<<ycheck<<"] \n"; }
       }
       //Controleren vanaf x,y naar rechts onder
       else if((speelveld[xcheck][ycheck] == player) && (echeck == 5) && (ncheck < inarow)){
        if(dev_countcom == 1){ cout<<"Checking speelveld: ["<<xcheck<<"]["<<ycheck<<"] \n"; }
       ycheck++;   
       xcheck++;
       ncheck++;
       } 
       //Resetten voor volgende controlle
       else if((speelveld[xcheck][ycheck] != player) && (echeck == 5) && (ncheck < inarow)){
       ycheck = y; 
       xcheck = x; 
       ncheck = 0; 
       echeck = 6;       
        if(dev_countcom == 1){ cout<<"Resetting counters for y,x: ["<<xcheck<<"]["<<ycheck<<"] \n"; }
       }
        //Van x,y naar links onderin
       else if((speelveld[xcheck][ycheck] == player) && (echeck == 6) && (ncheck < inarow)){
        if(dev_countcom == 1){ cout<<"Checking speelveld: ["<<xcheck<<"]["<<ycheck<<"] \n"; }
       ycheck++;   
       xcheck--;
       ncheck++;
       } 
         //Resetten om naar rechts boven
       else if((speelveld[xcheck][ycheck] != player) && (echeck == 6) && (ncheck < inarow)){
       ycheck = y - 1; 
       xcheck = x + 1;
       echeck = 7;       
        if(dev_countcom == 1){ cout<<"Resetting counters for y,x to right up: ["<<xcheck<<"]["<<ycheck<<"] \n"; }
       }
         //Van x,y naar rechts boven
       else if((speelveld[xcheck][ycheck] == player) && (echeck == 7) && (ncheck < inarow)){
        if(dev_countcom == 1){ cout<<"Checking speelveld: ["<<xcheck<<"]["<<ycheck<<"] \n"; }
       ycheck--;   
       xcheck++;
       ncheck++;
       }
       //Resetten om naar 
       else if((speelveld[xcheck][ycheck] != player) && (echeck == 7) && (ncheck < inarow)){
       ycheck = y; 
       xcheck = x;
       ncheck = 0;
       echeck = 8;       
       if(dev_countcom == 1){ cout<<"Resetting counters too finalyze checkup: ["<<xcheck<<"]["<<ycheck<<"] \n"; }
       }     
       
       else if (ncheck >= inarow) {
       cout<<"Player "<<player<<" has won ";         
       status = 0;
       echeck = 9;
       cin.get();
       }
       else {
       echeck = 9;
       }             
  }
  //Switchen van spelers
  if(player < players){
  player++;
  }
  else if(player == players){
  player = 1;
  }
  if (dev_countcom == 1){  cin.get(); }
  if (ncheck < inarow) { spelen(); }
  else { menu(); }
  

}
int options(){
    system("cls");
    cout<<"1: Game \n";
    cout<<"2: Development \n";      
}
int resetgame(){
    for(y = ystart; y <= yend; y++){
          for(x = xstart; x <= xend; x++)
          if(speelveld[x][y] == 0){
          
          }
          else{
          speelveld[x][y] = 0;
          }  
    } 
    status = 1;
}
int iplayers() {

cout<<"Insert players: ";
cin>>players ;
   if((players <= 9) && (players >= 1)) {
   menu();
   }
   else {
   cout<<"Please insert a number inbetween 1 and 9 \n";
   iplayers();
   }          
}

Tips en kommentaar is altijd welkom
 
Laatst bewerkt:
Code:
#include <iostream>//<-- actual C++ header file
uhhhhh leuke comment maar ik zou hem veranderen, die header zorgt ervoor dat je kan schrijven en lezen. zo lijkt het erop dat dit de stl is die je bijvoegt wat niet waar is
 
heb nog niets getest, maar als tip voor toekomstige progs: beperk je globals.
In een programma zoals 4 op 1 rij, wat zeer klein is (zeer klein is < 5000regels bij mij) maakt dit weinig uit. Maar bij grotere projecten die geheugenintensiever zijn is dit echt een huzarenklus.

Bovendien zal je merken dat veel van je variabelen lang niet overal nodig zijn, of dmv van pointers toegankelijk kunnen worden, maar ik kan er inkomen dat pointers iets is waar je nu nog liever van afblijft gezien dit je eerste programma is.

Ik zal er in de loop van de week nog even verder naar kijken en 'echte' feedback geven ;)

--Johan
 
als een speler gewonnen heeft verweider de "muntjes" die niet gebruikt worden om te winnen zodat je gemakkelijk ziet waar de 4 in a row zit, ook moet je nadenken over de opmaak die je wil gebruiken. als je grotere programmas gaat schrijven is het belangrijk om overal dezelfde opmaak te hebben ik bedoel dit:
Code:
if( true )
{
bla;
}

of zo:

if(true)
    {
    bla;
    }

of zo:

if( true ){
bla;}

er zijn heel veel mogenlijkheden probeer wat uit en kijk wat voor jou het beste werkt dit zal je erg veel helpen later
 
Laatst bewerkt:
Ok het opschonen van de variables en een vaste style word dan versie 0.11B

Maar daar ahd ik nog wel een vraagje over.

Een lokale variable is een variable die in een functie word aangemaakt.
Wordt hij dan ook weer verwijderd als die functie over is?

Is er een mogelijkheid om een bepaalde variable weer te verwijderen uit het geheugen?
zoiets als: delete(variablenaam)

Pointers daar heb ik alw el over gelezen.
Dat is meer zo van we verwijzen naar een variable via het geheugen adres vann die variable.
Maar dan moet je daarvoor dus eerst wel een 2de variable maken.
Wat weer meer geheugen kost?

zoiets als dit dus:

int main()
{
int getal = 5; //variabele
int *pgetal=0; //pointer

pgetal = &getal; //zet het geheugenadres van getal in pgetal

cout << *pgetal; //geef de waarde weer

return 0;
}

Wat is hier nou het voordeel van die pointer?
 
ja een variabele wordt verweiderd als de functie waarin hij aangemaakt word afloopt. je kan ook geheugenblokken aanvragen met "new" deze moet je zelf verweideren met "delete" als je gdi's gaat gebruiken zul je hier op moeten letten

"Is er een mogelijkheid om een bepaalde variable weer te verwijderen uit het geheugen?
zoiets als: delete(variablenaam)" naast wat ik hierboven heb beschreven heb ik geen idee

pointers HA dan wordt het leuk.

een pointer is een variabele die de waarde van het geheugenblok waar de variabele waar hij heen verwijst begint bevat.

je geheugen bestaat uit blokjes, een variabele kan meerdere blokjes in beslag nemen. zo neemt een ineger 4 blokjes in beslag. nu heeft ieder blokje een naam in de vorm van een nummer. je kunt dus als je een nummer hebt opvragen wat er in een blokje zit.

de nummers van de blokjes zijn even groot als een integer (4byte 32bit) dus maak je een pointer naar een integer dan heeft het inderdaad niet veel zin. maak je echter een pointer naar een double welke 8byte 64bit groot is blijf je houden dat de naam van het blokje opgeslagen kan worden in een integer. wat je dus krijgt is een double variabele van 8 byte en een pointer van 4 byte.

een ander voorbeeld:
je weet vast wel dat je arrays kunt maken van variabelen. nemen we nu een letter (1byte 8 bit) en nemen we hier zeg 128 van (willekeurig getal ik kies voor dit omdat ik graag in machten blijf omdat ik wat meer weet van de elektronica in de pc) dan heb je een variabele die 128 * 1byte bevat dat is dus 128byte. maak je nu een pointer naar dat array dan wijst die naar de 1e letter. toch is de grootte van de pointer 4 byte. onthoud een pointer bevat de naam van je geheugenblok dus die blijft altijd 4 byte groot

voer dit uit en je zult het zien:
Code:
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
    {
    char txtstr[128] = "text";
    char* txtstrpt = txtstr;
    cout<< "size for integer: " << sizeof( txtstr ) << endl
        << "size for pointer: " << sizeof( txtstrpt );
    cin.get();
    }
 
Hoihoi, ik weet niet juist wat jullie met geheugen bedoelen, daarom ffi deze vraagjes.

1)Als jullie het over geheugen hebben, hebben jullie het dan over ram of gewoon over de harddisk?

2)Bedoelen jullie dan de grote van het .exe file, of van het geheugen dat het in beslag neemt bij het uitvoeren van het bestand?

3)Wordt het dan ook trager als het meer (welk dan ook) geheugen inneemt?

Groetjes,

Tchembado
 
Dan bedoelen we het interne geheugen (ram jah :P).
Het geheugen dat het in beslag neemt tijdens het uitvoeren.
Als het geheugen vol begint te raken wordt het inderdaad trager ^^.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan