IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Tvoríme hru had v jazyku C - 2.Diel

Tak z minulého tutoriálu o vytvorení hada v céčku by sme mali mať súbory main.c, FUNKCIE.H had.h. Vo funkciách by mali byť farbičky, delay, MyGetch, Vymaz a funkcie gotoxy. V súbore had.h malo byť nasledovné.

#include "funkce.h"

#define START_DELKA_HADA 4      /* velikost hada pri vykresleni */
#define START_X 25              /* startovni souradnice hada na ose X */
#define START_Y 12              /* startovni souradnice hada na ose Y */
#define RADKY 25                /* pocet radku v hracim poli */
#define SLOUPECKY 80            /* pocet sloupecku v hracim poli */

void RAM_ZED();
void vykresli_hada_start(void);
void pohybuj_hada();
void vykresli_hlavicku(void);
void smaz_posledni(void);
void posun_hodnoty(void);
void bodiky();
void vypis_bodiky();
void novy_mysky(void);
void konec(int udalost);
void exit_fce(void);

Teraz si v súbore had.h vytvoríme štruktúry:

typedef struct
{
  int x;
  int y;
} Souradnice_hada;
struct
{
  int x;
  int y;
} mysky;

Pre súradnice hada a myšiek, ktoré budeme žrať.

Ďalej ...

Souradnice_hada *alokuj_delku_hada(void);
Souradnice_hada *realokuj_delku_hada(void);

int hraci_pole[RADKY][SLOUPECKY],body,hadova_rychlost,i,j,mezernik = 0,start;
short n = START_DELKA_HADA; /* Delka hada pri vykresleni na startu */
short pauza,barva_hada;
char pocatecni_smer;
Souradnice_hada *sou_had;
konecprosdraca = 1;

To je alokácia hada a nejaké globálne premenné, ktoré by byť v programe ideálne nemali, ale už som to nechcel prerábať. :) (K funkciu pre alokáciu sa dostaneme ďalej v kóde).

void RAM_ZED()
{
    /* Vyplni hraci pole v okrajich */
    for(i = 0; i < 80; i++)
    {
        hraci_pole[0][i] = 1;
        hraci_pole[24][i] = 1;
    }
    for(j = 0; j < 25; j++)
    {
        hraci_pole[j][0] = 1;
        hraci_pole[j][79] = 1;
    }
    /* Vykresli zed */

    for(i = 0; i < 25; i++)
    {
        barva(2);
        gotoxy(0,i);
        putc('1',stdout);
        gotoxy(79,i);
        putc('1',stdout);
    }
    for(i = 0; i < 80; i++)
    {
        barva(2);
        gotoxy(i,0);
        putc('1',stdout);
        gotoxy(i,24);
        putc('1',stdout);
    }

}

Vykreslíme si rámček ako v dvojrozmernom poli, tak len tak "barvičkově" trošku drastickým spôsobom. (Mám to takto, pretože keď som napchal viac cyklov dokopy, tak to bolo značne pomalšie).

Souradnice_hada *alokuj_delku_hada(void)
{
  Souradnice_hada *sou_had_start;
  sou_had_start = (Souradnice_hada  *) malloc((START_DELKA_HADA+1) * sizeof(Souradnice_hada));
  if (sou_had_start == NULL)
  {
    printf("Nelze provest alokaci hada!");
    exit(1);
  }
  return sou_had_start;
}
Souradnice_hada *realokuj_delku_hada(void)
{
  Souradnice_hada *sou_had_zvetsen;

  sou_had_zvetsen = (Souradnice_hada *) realloc(sou_had, (n+1) * (sizeof(Souradnice_hada)));

  if (sou_had_zvetsen == NULL)
  {
    printf("Nelze provest alokaci hada!");
    exit(1);
  }
  return sou_had_zvetsen;
}

Alokácia a realokácie pamäte hada ... nie je čo dodať :) kto sa v tom nevyzná tak šup do môjho tutoriálu o Alikácia pamäti.

void vykresli_hada_start(void)
{
  for(i = START_X; i < (START_DELKA_HADA+START_X); i++)
  {
    barva(barva_hada);
    sou_had[i-START_X].x = i;
    sou_had[i-START_X].y = START_Y;
    gotoxy(i,START_Y);
    putc('0', stdout);
  }
}

Funkcie pre vykreslenie hada v poli. Teraz trošku dlhšia funkcie pre pohyb nášho hada.

void pohybuj_hada()
{

while (konecprosdraca > 0)

  {
    do
    {
      /* Nastavi hlavicku na smer XY */
      switch(pocatecni_smer)
      {
        case 'u' : sou_had[n].x = sou_had[n-1].x;
                   sou_had[n].y = sou_had[n-1].y-1;
                   break;
        case 'd' : sou_had[n].x = sou_had[n-1].x;
                   sou_had[n].y = sou_had[n-1].y+1;
                   break;
        case 'r' : sou_had[n].x = sou_had[n-1].x+1;
                   sou_had[n].y = sou_had[n-1].y;
                   break;
        case 'l' : sou_had[n].x = sou_had[n-1].x-1;
                   sou_had[n].y = sou_had[n-1].y;
                   break;
      }
      /* Kontrola narazu do zdi */
      if (hraci_pole[sou_had[n].y][sou_had[n].x])
        konec(2);

      /* kontrola kousnuti */
      for(i = 0; i < n-3; i++)
        if ((sou_had[n].x == sou_had[i].x) && (sou_had[n].y == sou_had[i].y))
          konec(1);


      vykresli_hlavicku();
      /* Kdyz had sezere mysku */
      if ((sou_had[n].x == mysky.x) && (sou_had[n].y == mysky.y))
        bodiky();
      else /* had nesezral mysku */
      {
        smaz_posledni();
        posun_hodnoty();
      }
      delay(hadova_rychlost);

    } while (!kbhit());

    int key;
    key = MyGetch();
    if (key) {
      switch (key) {
        case 27: // escape
        konecprosdraca = 0;
        break;
        case 328:/* sipka nahoru */
          if (pocatecni_smer != 'd') pocatecni_smer = 'u';
          break;
        case 336:/* sipka dolu */
          if (pocatecni_smer != 'u') pocatecni_smer = 'd';
          break;
        case 333: /* sipka vpravo*/
          if (pocatecni_smer != 'l') pocatecni_smer = 'r';
          break;
        case 331:/* sipka vlevo */
          if (pocatecni_smer != 'r') pocatecni_smer = 'l';
          break;
        case 32:
          if (!pauza)
          {
            pauza = 1;
            do{} while (!kbhit());
          }
          else
            pauza = 0;
          break;
        case 13:
             break;
        default:
          continue;
        }
      }
  }
}

Niet čo dodať, určuje smer pohybu hada a čo sa stane, keď stlačím nejakú klávesu. Exkluzívne pre Sdraca som upravil nekonečný cyklus, za ktorý by ma zožral za živa. : D a A preto:

while (konecprosdraca > 0)

No a teraz zvyšok našich funkcií:

void smaz_posledni(void)
{
  gotoxy(sou_had[0].x,sou_had[0].y);
  barva(-1);
  putc(219, stdout);
}
void posun_hodnoty(void)
{
  for(i = 0; i < n; i++)
  {
    sou_had[i].x = sou_had[i+1].x;
    sou_had[i].y = sou_had[i+1].y;
  }
}
void vykresli_hlavicku(void)
{
  barva(barva_hada);
  gotoxy(sou_had[n].x,sou_had[n].y);
  putc('0', stdout);
}
void vypis_bodiky()
{
  barva(1);
  gotoxy(77,0);
  printf("%d", body);
}
void bodiky()
{
  barva(1);
  body++;
  gotoxy(77,0);
  printf("%d", body);
  n++; /* delka hada ++ */
  sou_had = realokuj_delku_hada();
  novy_mysky();
}
void novy_mysky(void)
{
  mysky.x = (rand() % 79) + 1;
  mysky.y = (rand() % 24) + 1;
  /* kdyz se mysky obevi v prekazce nebo v hadovi tak se vykesli nove */
  for(i = 0; i < (n-1); i++)
    if (((sou_had[i].x == mysky.x) && (sou_had[i].y == mysky.y)) || (hraci_pole[mysky.y][mysky.x]))
      novy_mysky();

  gotoxy(mysky.x,mysky.y);
  barva(0);
  putc('0', stdout);
}
void konec(int udalost)
{
if (udalost == 1)
    {
      barva(0);
      gotoxy(36,12);
      printf("Hryznul ses!");
      getchar();
    }
    else
    {
      barva(0);
      gotoxy(30,12);
      printf("Narazil si do zdi!");
      getchar();
    }
    body = 0;
    main();
  }
void exit_fce(void)
{
  free((void *) sou_had);
}

Zmazať poslednú hodnotu, posunúť hada, vykresliť hlavičku a tak dlhšie. (Nepopisujú to podrobne, pretože to už má každý vedieť z tutoriálov (nie vedieť) ale vyznať sa v tom čo čo robí).

No a teraz už len upravíme súbor main.c nasledovne.

#include "had.h"

int main(void)
{
    SetConsoleTitle( "Snake v1.0" );
    hadova_rychlost = 70;    /* 70 ms */
    barva_hada = 0;          /* barva hada je bila */
    n = START_DELKA_HADA;    /* Delka hada pri vykresleni */
    pocatecni_smer = 'r';    /* smer hada je vpravo */

    if (start == 1) /* Pokud zacne nova hra vynuluje se skore */
    {
        body = 0;
    }

    vymaz(); /* vymaze obraz */
    srand((unsigned int) time(NULL));
    RAM_ZED();
    sou_had = alokuj_delku_hada();
    vypis_bodiky();
    vykresli_hada_start();
    novy_mysky();
    pohybuj_hada();
}

A po kompilácii by mal výsledok vyzerať nejako takto:

Hotová hra had v céčku - Zdrojákoviště jazyka C - Pokročilé konštrukcia

Tak dúfam že sa to všetkým podarilo! :) Pre prípad, že nie, pridávam zdrojový kód k článku.


 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 784x (178.48 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C

 

Všetky články v sekcii
Zdrojákoviště jazyka C - Pokročilé konštrukcia
Článok pre vás napísal Зайчик
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Коммунизм для нашего будущего!
Aktivity