Ismerkedés a Code Bolcks fejlesztő környezettel és a GCC fordítóval

2017-06-12

 

Ha C fejlesztő környezetet és fordító programot keresünk, a Code Blocks egy ingyenes és jó lehetőség. Igazából mindenféle programot készíthetünk vele, első sorban Windows és Linux alá. Ha jól láttam az IOS verzió fejlesztése néhány éve leállt. Én még csak az ismerkedés elején tartok. Valamikor elkövettem néhány dolgot MS-DOS alatt Turbo, majd Borland C-ben, most nosztalgiázok, amikor Windows alá írhatok megint karakteres felüleltű programokat.

Az emblémára kattintva eljuthatuk a Code Blocks web lapjára, talán a "codeblocks-mingw-nosetup.zip"-t érdemes letölteni. Ezt nem kell telepteni, csak ki kell csomagolni. Választhatjuk a setup verziót is, ha kényelmesebb. A Code Blocks ban való munkáról elég sok anyagot lehet találni az interneten, többek között a Youtube-on is található több magyar oktatóanyag.

Azt hiszem vannak még kortársak, akiknek nem ismeretlen a kígyós játék. Amikor mintaprogramokat keresgéltem ebbe akadtam bele. Nézegettem, azután annyira belebonyolódtam, hogy nagyrészt átírtam/újraírtam. Nem vagyok teljesen elégedett a kóddal, de lusta vagyok tovább finomítani. Úgy gondolom mégis érdemes közreadni a forráskódot, mert van benne néhány használható függvény, megoldás. Remélem ki lehet bogarászni mi hogyan működik benne. Talán annyi magyarázat célszerű, ha egy változót vizsgálunk C-ben, egyéb relációs kifejezések nélkül, akkor a vizsgálat eredménye Hamis, ha a változó értéke 0, és Igaz minden más esetben.


/*******************************************************************************
*   Author       -  Kiraly Tibor
*                   http://www.tkiraaly.hu
*   Date         -  2017.06.12.
*   Compiler     -  Code Blocks & GCC
*
*   Kigyo jatek C-ben - Ismerkedes Code Blocks-szal es GCC-vel
*
*   A prg. a az alabbi mintaprogram alapjan keszult:
*   http://www.codeincodeblock.com/2011/06/mini-projet-snake-game-in-c.html
*   Annyira belebonyolodtam, az ismerkedesbe, hogy csaknem teljesen ujrairtam.
*   Lehetne rajta meg csiszolni, de mivel elso sorban ismerkedesre hasznaltam,
*   nem akartam tobet foglakozni vele. A program Windows DOS ablakban fut. Van
*   benne nehany erdekes resz.
*
********************************************************************************/


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <ctype.h>
#include <windows.h>
#include <process.h>
#include <iostream>


using namespace std;


#define UP     72
#define DOWN   80
#define LEFT   75
#define RIGHT  77
#define ESC    27



struct coordinate{
    int x;
    int y;
};


coordinate food;                                 // etel
coordinate body[ 30];                            // kigyo teste


int life= 3;
int irany= RIGHT;
int pont= 0;
int hossz= 0;
int terulet_bal= 15;
int terulet_jobb= 70;
int terulet_alja= 10;
int terulet_teteje= 30;

void record();                                   // pontszam mentese
void jatek();                                    // jatek
void food_drop();                                // kaja dobas
void wait( unsigned int mili_seconds);           // varakozas
void gotoxy(int, int);                           // kurzor pozicionalas
void printat( int, int, char);                   // egy betu kiirasa pozicioba
void keret( int, int, int, int);                 // keret rajzolo
int  snake_test( int, int, int);                 // koordinata a kigyo testere esik?


int main()
{
   srand( time( NULL));                          // veletlen szam generator inicializalasa
   system( "cls");
   printf( "Udvozlet a mini Snake jatekban\n\n");
   printf( "Instrukciok:\n\n");
   printf( "A nyilakkal lehet a kigyot iranyitani.\n");
   printf( "Az F betuvel jelzett eteleket osszeszedve etetheted a kigyodat.\n");
   printf( "Minden egyes etel utan kapsz egy pontot, es a kigyo hossza is novekszik.\n");
   printf( "Ha falnak vezeted a kigyodat, vagy sajat magaba harap, akkor eggyel csokken az eleteid szama.\n");
   printf( "Kilepeshez nyomj [ESC]-t.\n\n");
   printf( "Gombnyomasra kezdodik a jatek...\n");
   if( getch() == 27) exit( 0);
   system( "cls");
   keret( terulet_bal, terulet_teteje, terulet_jobb, terulet_alja);
   jatek();                                      //initialing initial bend coordinate
   system( "cls");
   printf( "Az osszes eleted elfogyott.\n");
   printf( "Legkozelebb tobb szerencset!\n");
   printf( "Nyomj egy gombot a kilepeshez...\n");
   record();
   exit( 0);
   return 0;
}


void jatek()
{
   int i;                                        // cilus valtozo
   char k;                                       // billentyuzet lekerdezesehez
   int r= 0;                                     // hiba, ha != 0
   while( life)
   {
      if( body[ 0].x == 0)                       // inicializalas menet elejen
      {
         body[ 0].x= 25;
         body[ 0].y= 20;
         hossz= 0;
         irany= RIGHT;
         food_drop();
      }
      gotoxy( 20, 8);
      printf( "Pontszam: %d", pont);
      gotoxy( 50, 8);
      printf( "Elet : %d", life);
      wait( 200);
      if( kbhit())
      {
         k= getch();
         if( k == ESC) life= 0;
         if( k == UP || k == DOWN || k == LEFT || k == RIGHT) irany= k;
      }
      if( hossz < pont+ 5 && hossz < 29) hossz++;        // ha meg nem kuszott elo teljes hosszban
      else printat( body[ hossz].x, body[ hossz].y, ' ');      // farok vegenek torlese
      printat( body[ 0].x, body[ 0].y, '*');                   // fej felulírasa
      i= hossz;
      while( i)                                                // test eltolasa
      {
         body[ i].x= body[ i- 1].x;
         body[ i].y= body[ i- 1].y;
         i--;
      }
      switch ( irany)                                          // fej uj helye+ szegelyek vizsgalata
      {
         case UP:
                     body[ 0].y--;
                     if( body[ 0].y == terulet_alja) r= 1;;
                     break;
         case DOWN:
                     body[ 0].y++;
                     if( body[ 0].y == terulet_teteje) r= 1;;
                     break;
         case LEFT:
                     body[ 0].x--;
                     if( body[ 0].x == terulet_bal) r= 1;
                     break;
         case RIGHT:
                     body[ 0].x++;
                     if( body[ 0].x == terulet_jobb) r= 1;
                     break;
      }
      if( body[ 0].x == food.x && body[ 0].y == food.y)        // kajat talalat vizsgalata
      {
         pont++;
         food_drop();
      }
      if( snake_test( body[ 0].x, body[ 0].y, 1)) r= 2;        // sajat farkaba harap
      if( !r)                                                  // ha nem volt hiba lep
      {
         switch ( irany)
         {
            case UP:
                     printat( body[ 0].x, body[ 0].y, '^');
                     break;
            case DOWN:
                     printat( body[ 0].x, body[ 0].y, 'v');
                     break;
            case LEFT:
                     printat( body[ 0].x, body[ 0].y, '<');
                     break;
            case RIGHT:
                     printat( body[ 0].x, body[ 0].y, '>');
                     break;
         }
      }
      else                                                     // hiba eseten a kigyo kimaszik
      {
         printat( food.x, food.y, ' ');
         for( i= hossz; i > 0; i--)
         {
             wait( 200);
             printat( body[ i].x, body[ i].y, ' ');
         }
         life--;
         r= 0;
         body[ 0].x= 0;
      }
   }
}


void food_drop()
{
   do
   {
      food.x= terulet_bal+ 2 + rand()% (terulet_jobb- terulet_bal- 4);     // kaja pozicionalas
      food.y= terulet_alja+ 2+ rand()% (terulet_teteje- terulet_alja- 4);
   } while ( snake_test( food.x, food.y, 0));                              // kigyo testere esett? ujra
   printat( food.x, food.y, 'F');
}


int snake_test( int x, int y, int i)
{
   int a= 0;
   for( ; i <= hossz; i++)                                                // nem esik a kigyo testere?
   {
      if( x == body[ i].x && y == body[ i].y) a= 1;
   }
   return a;
}


void record()
{
   char plname[ 20], nplname[ 20], cha, c;
   int i, j;
   FILE *info;
   info= fopen( "record.txt", "a+");
   getch();
   system( "cls");
   printf( "Kerem adja meg a nevet\n");
   scanf( "%[^\n]", plname);
   for( j= 0; plname[ j] != '\0'; j++)                           //to convert the first letter after space to capital
   {
      nplname[ 0]= toupper( plname[ 0]);
      if( plname[ j- 1] == ' ')
      {
         nplname[ j]= toupper( plname[ j]);
         nplname[ j- 1]= plname[ j- 1];
      }
      else nplname[ j]= plname[ j];
   }
   nplname[ j]= '\0';
   fprintf( info, "Jatekos neve :%s\n", nplname);
   time_t mytime;
   mytime= time( NULL);
   fprintf( info, "Played Date:%s", ctime( &mytime));
   fprintf( info, "Score:%d\n", pont);                                      // call score to display score
   for( i= 0; i <= 50; i++)
   fprintf( info, "%c", '_');
   fprintf( info, "\n");
   fclose( info);
   printf( "Meg kivanja nezni az utolso eredmenyeket 'y'\n");
   cha= getch();
   system( "cls");
   if ( cha == 'y'){
   info= fopen( "record.txt", "r");
   do
   {
      putchar( c= getc( info));
   } while( c != EOF);}
   fclose( info);
}


void wait( unsigned int mili_seconds)
{
    clock_t a= clock()+ mili_seconds;
    while (a > clock());
}


void gotoxy( int x, int y)
{
   COORD coord;
   coord.X = x;
   coord.Y = y;
   SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE), coord);
}


void printat( int x, int y, char c)
{
   gotoxy( x, y);
   printf( "%c", c);
}


void keret( int bal_szele, int teteje, int jobb_szele, int alja)
{
   int i;
   for( i= bal_szele+ 1; i <= jobb_szele- 1; i++)
   {
      printat( i, alja, '-');
      printat( i, teteje, '-');
   }
   for( i= alja+ 1; i <= teteje- 1; i++)
   {
      printat( bal_szele, i, '!');
      printat( jobb_szele, i, '!');
   }
   printat( bal_szele, teteje, '+');
   printat( bal_szele, alja,   '+');
   printat( jobb_szele, teteje, '+');
   printat( jobb_szele, alja,  '+');
}

És itt a vége, fussatok el véle, innen letölthetitek az egészet összecsomagolva.