Avatar billede mathiash Nybegynder
06. august 2005 - 14:34 Der er 12 kommentarer og
1 løsning

Et step videre: Spil

Hej!

Jeg har lige lavet en snake klon, og syntes faktisk det er
rigtigt sejt :)

Jeg tænkte på om der er nogle der har nogle gode links
til start på 2d programmering i stil med fx. cc1, mario osv.

altså et step videre.

Min compiler er Dev-C++

Mvh. Mathias Hansen
Avatar billede mathiash Nybegynder
06. august 2005 - 14:35 #1
* Snake Klonen har jeg lavet i konsollen. :)
Avatar billede bertelbrander Novice
06. august 2005 - 20:08 #2
Der er en del artikler om spil her:
http://www.gamedev.net/
Avatar billede thomas_nj Nybegynder
06. august 2005 - 20:08 #3
Har selv fået anbefalet sdl af en herinde. Det er forholdsvis let at gå til.
Avatar billede mathiash Nybegynder
06. august 2005 - 21:17 #4
bertelbrander >> Har kigget på siden, men syntes kun jeg kan finde artikler om vilde 3d spil for folk der allerede kender til det grundlæggende, søger en slags "starter" artikel.

thomas_nj >> sdl? lyder spændende forklare nærmere... :)
Avatar billede mathiash Nybegynder
06. august 2005 - 21:23 #5
Jeg har fundet den fedeste guide: http://www.gamedev.net/reference/design/features/makegames/

Men har ingen idé om hvordan jeg får lavet det.
win32 api? og hvordan?
Avatar billede mathiash Nybegynder
06. august 2005 - 21:24 #6
Det er jo næsten som mit snake spil bortset fra at det kører på en win32 platform istedet for en dos promt.
Avatar billede krismort Nybegynder
06. august 2005 - 22:05 #7
SDL er et platform uafhængigt api som bl.a. wrapper opengl til at tegne grafik på din monitor. Men det osse bruges til til at fange input fra dit keyboard/mus.

Jeg vil nok hellerer anbefale clanlib eller allegro til dig fordi det er nemmerer at gå til når man skal tegne i 2d.
Avatar billede krismort Nybegynder
06. august 2005 - 22:17 #8
Xafion:
Hvis du virkelig vil lære noget så bør du nok investerer nogen penge i et par bøger game programming gems serien er et must.
Avatar billede thomas_nj Nybegynder
07. august 2005 - 11:02 #9
Du kan læse om sdl her: http://www.libsdl.org/index.php

  Du kan lege lidt med det med denneher tutorial. Den er meget overfladisk, men den giver dig en masse kode du kan sidde og lege med.

http://cone3d.gamedev.net/cgi-bin/index.pl?page=tutorials/gfxsdl/index
Avatar billede thomas_nj Nybegynder
07. august 2005 - 11:03 #10
mathiash >> Jeg må vel ikke se koden til dit snakespil vel? Lavede nemlig selv et for et stykke tid siden, men vil gerne se hvordan andre har gjort.
Avatar billede mathiash Nybegynder
07. august 2005 - 17:17 #11
Måske ikke den flotteste kode men du må da godt få den, jeg kigger lige på linksne lidt senere.

Map delen, er "stjålet" fra Midgårds da jeg syntes det var så genialt! :)


#include <iostream>
#include <windows.h>
#include <string>
#include <stdlib.h>
#include <conio.h>
#define x_str 40
#define y_str 24
#define debug 0

using namespace std;

char retning, sidste, res[200], thePos[100];
int hovedX, hovedY, haleX, haleY, laengde, tast, normal, hastighed, madx, mady, madder;

unsigned char Map[y_str][x_str] =
{
  {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
  {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
};


void WriteC(string Tekst, int X, int Y, WORD farve)
{
  HANDLE UdHandle;
  COORD position = {X, Y};
  UdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute(UdHandle, farve);
  SetConsoleCursorPosition(UdHandle, position);
  cout << Tekst;
}

void showPos() {
  if (debug == 1) {
    sprintf(thePos, "Hoved: X: %i Y: %i - Hale: X: %i Y: %i", hovedX, hovedY, haleX, haleY);
    WriteC(thePos, 0, 24, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  } else {
    sprintf(thePos, "Madder: %i", madder);
    WriteC(thePos, 0, 24, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  }
}

int Random(int Range)
{
  return (rand() >> 3)%Range;
}


void lavMad() {
  start:
  madx = Random(x_str);
  mady = Random(y_str);
 
  if (Map[mady][madx] == 1) {
    goto start;
  } else {
    WriteC(" ", madx, mady, FOREGROUND_GREEN | BACKGROUND_GREEN | FOREGROUND_INTENSITY);
  }
}

int main() {
  WriteC("Slangen er sulten!", 0, 0, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  WriteC("Soerg for den for nogle madder!", 0, 1, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  WriteC("Brug piletasterne for at styre slangen,", 0, 2, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  WriteC("og 'p' for pause.", 0, 3, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  WriteC("Tryk enter for at starte!", 0, 4, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  WriteC("www.matisen.dk", 0, 9, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
 
  startspil:
  int ta = getch();
  if (ta != 13) goto startspil;
 
  start:
  madder = 0;
  madx = 0;
  mady = 0;
     
  if (debug == 1) {
    hastighed = 800;
  } else {
    hastighed = 100;
  }
 
  int y, x, i;
 
  for (y = 0; y < y_str; y++)
  {
    for (x = 0; x < x_str; x++)
    {
      if(Map[y][x] == 1)
        WriteC(" ", x, y, FOREGROUND_RED | BACKGROUND_RED | FOREGROUND_INTENSITY);
      else
        WriteC(" ", x, y, FOREGROUND_RED | FOREGROUND_INTENSITY);
    }
  }
 
  // Start kordinater
  laengde = 2; // Længde
  hovedX = 1; // Hoved vandret
  haleX = 1; // Hale vandret
  hovedY = 1; // Hoved lodret
  haleY = 1; // Hale lodret
  retning = 'h'; // Retning o = op, h = højre, n = ned, v = venstre
  sidste = 'o';
 
  for (i = 0; i < laengde; i++) {
    hovedX += 1;
    WriteC(" ", hovedX, hovedY, FOREGROUND_BLUE | BACKGROUND_BLUE | FOREGROUND_INTENSITY);
    Sleep(hastighed);
  }
 
 
  main:
  if (madx == 0 && mady == 0) lavMad();
  WriteC(" ", madx, mady, FOREGROUND_GREEN | BACKGROUND_GREEN | FOREGROUND_INTENSITY);
 
  switch (retning) {
    case 'v':
    {
      showPos();
      hovedX -= 1;
     
      WriteC(" ", haleX, haleY, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
      WriteC(" ", hovedX, hovedY, FOREGROUND_BLUE | BACKGROUND_BLUE | FOREGROUND_INTENSITY);
     
      if (haleY != hovedY) {
        normal = 0;
        if (sidste == 'n') {
          haleY += 1;
        } else {
          haleY -= 1;
        }
       
      } else {
        normal = 1;
        haleX -= 1;
      }
     
      // Rammer slangen en mur?
      if (Map[hovedY][hovedX] == 1) {
        goto gameover;
      }
     
      // Rammer slangen en mad?
      if (hovedX == madx && hovedY == mady) {
        WriteC(" ", madx, mady, FOREGROUND_RED | FOREGROUND_INTENSITY);
        WriteC(" ", hovedX, hovedY, FOREGROUND_BLUE | BACKGROUND_BLUE | FOREGROUND_INTENSITY);
        hovedX -= 1;
        madx = 0;
        mady = 0;
        madder += 1;
        hastighed -= 20;
      }
 
      Sleep(hastighed);
     
      break;
    }
   
    case 'h':
    {
      showPos();
      hovedX += 1;
     
      WriteC(" ", haleX, haleY, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
      WriteC(" ", hovedX, hovedY, FOREGROUND_BLUE | BACKGROUND_BLUE | FOREGROUND_INTENSITY);
     
      if (haleY != hovedY) {
        normal = 0;
       
        if (sidste == 'n') {
          haleY += 1;
        } else {
          haleY -= 1;
        }
       
      } else {
        normal = 1;
        haleX += 1;
      }
     
      // Rammer slangen en mur?
      if (Map[hovedY][hovedX] == 1) {
        goto gameover;
      }
     
      // Rammer slangen en mad?
      if (hovedX == madx && hovedY == mady) {
        WriteC(" ", madx, mady, FOREGROUND_RED | FOREGROUND_INTENSITY);
        WriteC(" ", hovedX, hovedY, FOREGROUND_BLUE | BACKGROUND_BLUE | FOREGROUND_INTENSITY);
        hovedX += 1;
        madx = 0;
        mady = 0;
        madder += 1;
        hastighed -= 20;
      }
 
      Sleep(hastighed);
     
      break;
    }
   
    case 'n':
    {
      showPos();
      hovedY += 1;
      WriteC(" ", haleX, haleY, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
      WriteC(" ", hovedX, hovedY, FOREGROUND_BLUE | BACKGROUND_BLUE | FOREGROUND_INTENSITY);
     
      if (haleX != hovedX) {
        normal = 0;
        if (sidste == 'h') {
          haleX += 1;
        } else {
          haleX -= 1;
        }
       
      } else {
        normal = 1;
        haleY += 1;
      }
     
      // Rammer slangen en mur?
      if (Map[hovedY][hovedX] == 1) {
        goto gameover;
      }
     
      // Rammer slangen en mad?
      if (hovedX == madx && hovedY == mady) {
        WriteC(" ", madx, mady, FOREGROUND_RED | FOREGROUND_INTENSITY);
        WriteC(" ", hovedX, hovedY, FOREGROUND_BLUE | BACKGROUND_BLUE | FOREGROUND_INTENSITY);
        hovedY += 1;
        madx = 0;
        mady = 0;
        madder += 1;
        hastighed -= 20;
      }
     
      Sleep(hastighed);
      break;
    }
   
    case 'o':
    {
      showPos();
      hovedY -= 1;
      WriteC(" ", haleX, haleY, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
      WriteC(" ", hovedX, hovedY, FOREGROUND_BLUE | BACKGROUND_BLUE | FOREGROUND_INTENSITY);
     
      if (haleX != hovedX) {
        normal = 1;
        if (sidste == 'h') {
          haleX += 1;
        } else {
          haleX -= 1;
        }
       
      } else {
        normal = 1;
        haleY -= 1;
      }
     
      // Rammer slangen en mur?
      if (Map[hovedY][hovedX] == 1) {
        goto gameover;
      }
     
      // Rammer slangen en mad?
      if (hovedX == madx && hovedY == mady) {
        WriteC(" ", madx, mady, FOREGROUND_RED | FOREGROUND_INTENSITY);
        WriteC(" ", hovedX, hovedY, FOREGROUND_BLUE | BACKGROUND_BLUE | FOREGROUND_INTENSITY);
        hovedY -= 1;
        madx = 0;
        mady = 0;
        madder += 1;
        hastighed -= 20;
      }
     
      Sleep(hastighed);
      break;
    }
  }
 
  if (kbhit() && normal == 1) {
    tast = getch();
   
    switch (tast)
    {
      case 72: {
        if (retning != 'n') {
          sidste = retning;
          retning = 'o';
        } // Op
        break;
      }

      case 80: {
        if (retning != 'o') {
          sidste = retning;
          retning = 'n';
        } // Ned
        break;
      }
   
      case 75: {
        if (retning != 'h') {
          sidste = retning;
          retning = 'v';
        } // Venstre
        break;
      }
   
      case 77: {
        if (retning != 'v') {
          sidste = retning;
          retning = 'h';
        } // Højre
        break;
      }
     
      case 'p': {
        // Pause
        if (retning != 'p') {
          sidste = retning;
          retning = 'p';
        } else {
          retning = sidste;
        }
        break;
      }
     
      default: break;
    }
  }
   
  goto main;
 
  gameover:
  sprintf(res, "Du naaede at faa %i madder.", madder);
 
  WriteC("Game Over!", 15, 13, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
  WriteC(res, 9, 14, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
  WriteC("Tryk enter for at prove igen.", 8, 15, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
 
  luk:
  int t = getch();
  if (t != 13) goto luk;
 
  goto start;

  return 0;
}

Med venlig hilsen
Mathias Hansen
Avatar billede mathiash Nybegynder
08. august 2005 - 15:45 #12
Havde da helt glemt at melde tilbage :)

Thomas >> Læg et svar!
Avatar billede thomas_nj Nybegynder
10. august 2005 - 21:16 #13
Kommer her. Og mange tak fordi jeg måtte se din kode
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester