Gioco di snake in C

  • Autore discussione Utente cancellato 110428
  • Data d'inizio
U

Utente cancellato 110428

Ospite
Buonasera ragazzi!
Avevo in mente di programmare il gioco "Snake" in C, ma non ho idea di cosa si debba scrivere né in che ordine farlo, quindi vorrei chiedervi quali siano i passaggi da fare per poter tirare sù un gioco con una grafica basilare. Ho anche cercato i sorgenti online ma onestamente non ci ho capito molto
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
A che livello sei di conoscenza di C?
 
U

Utente cancellato 110428

Ospite
A che livello sei di conoscenza di C?
Direi "normale", nel senso che so come si dichiarano e come si utilizzano le cose principali come le struct, gli array, ecc. Più che altro ho difficoltà a capire la logica(riga per riga) con cui sono stati scritti i vari sorgenti che ho consultato.
 
M

Mursey

Ospite
Nella programmazione la teoria conta poco o niente, la cosa importante e' la pratica.
E ancora piu' importante, prima di qualsiasi linguaggio, e' imparare a ragionare nel modo corretto.

Piu' che le struct e gli array devi imparare a capire quando e' il momento ed il modo giusto di usarli.
Un programma lo puoi scrivere anche con un flow-chart ed e' quello che devi imparare come prima cosa.

Il gioco snake e' gia' piu' complesso per un principiante e puo' essere sviluppato in diversi modi, solitamente si comincia con il tris o la battaglia navale...
Prova a postare qualche listato, usando il tag code, e lo studiamo tutti insieme !
 
  • Mi piace
Reazioni: Utente 16812
U

Utente cancellato 110428

Ospite
Nella programmazione la teoria conta poco o niente, la cosa importante e' la pratica.
E ancora piu' importante, prima di qualsiasi linguaggio, e' imparare a ragionare nel modo corretto.

Piu' che le struct e gli array devi imparare a capire quando e' il momento ed il modo giusto di usarli.
Un programma lo puoi scrivere anche con un flow-chart ed e' quello che devi imparare come prima cosa.

Il gioco snake e' gia' piu' complesso per un principiante e puo' essere sviluppato in diversi modi, solitamente si comincia con il tris o la battaglia navale...
Prova a postare qualche listato, usando il tag code, e lo studiamo tutti insieme !
Qualche listato di cosa, scusami? Sinceramente non so nemmeno cosa devo fare .
 
U

Utente cancellato 110428

Ospite
C:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#include<time.h>
#include<ctype.h>
#include <time.h>
#include <windows.h>
#include <process.h>
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
int length;
int bend_no;
int len;
char key;
void record();
void load();
int life;
void Delay(long double);
void Move();
void Food();
int Score();
void Print();
void gotoxy(int x, int y);
void GotoXY(int x,int y);
void Bend();
void Boarder();
void Down();
void Left();
void Up();
void Right();
void ExitGame();
int Scoreonly();
struct coordinate{
    int x;
    int y;
    int direction;
};
typedef struct coordinate coordinate;
coordinate head, bend[500],food,body[30];
int main()
{
    char key;
    Print();
    system("cls");
    load();
    length=5;
    head.x=25;
    head.y=20;
    head.direction=RIGHT;
    Boarder();
    Food(); //to generate food coordinates initially
    life=3; //number of extra lives
    bend[0]=head;
    Move();   //initialing initial bend coordinate
    return 0;
}
void Move()
{
    int a,i;
    do{
        Food();
        fflush(stdin);
        len=0;
        for(i=0;i<30;i++)
        {
            body[i].x=0;
            body[i].y=0;
            if(i==length)
            break;
        }
        Delay(length);
        Boarder();
        if(head.direction==RIGHT)
            Right();
        else if(head.direction==LEFT)
            Left();
        else if(head.direction==DOWN)
            Down();
        else if(head.direction==UP)
            Up();
        ExitGame();
    }while(!kbhit());
    a=getch();
    if(a==27)
    {
        system("cls");
        exit(0);
    }
    key=getch();
    if((key==RIGHT&&head.direction!=LEFT&&head.direction!=RIGHT)||(key==LEFT&&head.direction!=RIGHT&&head.direction!=LEFT)||(key==UP&&head.direction!=DOWN&&head.direction!=UP)||(key==DOWN&&head.direction!=UP&&head.direction!=DOWN))
    {
        bend_no++;
        bend[bend_no]=head;
        head.direction=key;
        if(key==UP)
            head.y--;
        if(key==DOWN)
            head.y++;
        if(key==RIGHT)
            head.x++;
        if(key==LEFT)
            head.x--;
        Move();
    }
    else if(key==27)
    {
        system("cls");
        exit(0);
    }
    else
    {
        printf("\a");
        Move();
    }
}
void gotoxy(int x, int y)
{
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void GotoXY(int x, int y)
{
    HANDLE a;
    COORD b;
    fflush(stdout);
    b.X = x;
    b.Y = y;
    a = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(a,b);
}
void load(){
    int row,col,r,c,q;
    gotoxy(36,14);
    printf("loading...");
    gotoxy(30,15);
    for(r=1;r<=20;r++){
    for(q=0;q<=100000000;q++);//to display the character slowly
    printf("%c",177);}
    getch();
}
void Down()
{
    int i;
    for(i=0;i<=(head.y-bend[bend_no].y)&&len<length;i++)
    {
        GotoXY(head.x,head.y-i);
        {
            if(len==0)
                printf("v");
            else
                printf("*");
        }
        body[len].x=head.x;
        body[len].y=head.y-i;
        len++;
    }
    Bend();
    if(!kbhit())
        head.y++;
}
void Delay(long double k)
{
    Score();
    long double i;
    for(i=0;i<=(10000000);i++);
}
void ExitGame()
{
    int i,check=0;
    for(i=4;i<length;i++)   //starts with 4 because it needs minimum 4 element to touch its own body
    {
        if(body[0].x==body[i].x&&body[0].y==body[i].y)
        {
            check++;    //check's value increases as the coordinates of head is equal to any other body coordinate
        }
        if(i==length||check!=0)
            break;
    }
    if(head.x<=10||head.x>=70||head.y<=10||head.y>=30||check!=0)
    {
        life--;
        if(life>=0)
        {
            head.x=25;
            head.y=20;
            bend_no=0;
            head.direction=RIGHT;
            Move();
        }
        else
        {
            system("cls");
            printf("All lives completed\nBetter Luck Next Time!!!\nPress any key to quit the game\n");
            record();
            exit(0);
        }
    }
}
void Food()
{
    if(head.x==food.x&&head.y==food.y)
    {
        length++;
        time_t a;
        a=time(0);
        srand(a);
        food.x=rand()%70;
        if(food.x<=10)
            food.x+=11;
        food.y=rand()%30;
        if(food.y<=10)
            food.y+=11;
    }
    else if(food.x==0)/*to create food for the first time coz global variable are initialized with 0*/
    {
        food.x=rand()%70;
        if(food.x<=10)
            food.x+=11;
        food.y=rand()%30;
        if(food.y<=10)
            food.y+=11;
    }
}
void Left()
{
    int i;
    for(i=0;i<=(bend[bend_no].x-head.x)&&len<length;i++)
    {
        GotoXY((head.x+i),head.y);
       {
                if(len==0)
                    printf("<");
                else
                    printf("*");
        }
        body[len].x=head.x+i;
        body[len].y=head.y;
        len++;
    }
    Bend();
    if(!kbhit())
        head.x--;
}
void Right()
{
    int i;
    for(i=0;i<=(head.x-bend[bend_no].x)&&len<length;i++)
    {
        //GotoXY((head.x-i),head.y);
        body[len].x=head.x-i;
        body[len].y=head.y;
        GotoXY(body[len].x,body[len].y);
        {
            if(len==0)
                printf(">");
            else
                printf("*");
        }
        /*body[len].x=head.x-i;
        body[len].y=head.y;*/
        len++;
    }
    Bend();
    if(!kbhit())
        head.x++;
}
void Bend()
{
    int i,j,diff;
    for(i=bend_no;i>=0&&len<length;i--)
    {
            if(bend[i].x==bend[i-1].x)
            {
                diff=bend[i].y-bend[i-1].y;
                if(diff<0)
                    for(j=1;j<=(-diff);j++)
                    {
                        body[len].x=bend[i].x;
                        body[len].y=bend[i].y+j;
                        GotoXY(body[len].x,body[len].y);
                        printf("*");
                        len++;
                        if(len==length)
                            break;
                    }
                else if(diff>0)
                    for(j=1;j<=diff;j++)
                    {
                        /*GotoXY(bend[i].x,(bend[i].y-j));
                        printf("*");*/
                        body[len].x=bend[i].x;
                        body[len].y=bend[i].y-j;
                        GotoXY(body[len].x,body[len].y);
                        printf("*");
                        len++;
                        if(len==length)
                            break;
                    }
            }
        else if(bend[i].y==bend[i-1].y)
        {
            diff=bend[i].x-bend[i-1].x;
            if(diff<0)
                for(j=1;j<=(-diff)&&len<length;j++)
                {
                    /*GotoXY((bend[i].x+j),bend[i].y);
                    printf("*");*/
                    body[len].x=bend[i].x+j;
                    body[len].y=bend[i].y;
                    GotoXY(body[len].x,body[len].y);
                        printf("*");
                   len++;
                   if(len==length)
                           break;
               }
           else if(diff>0)
               for(j=1;j<=diff&&len<length;j++)
               {
                   /*GotoXY((bend[i].x-j),bend[i].y);
                   printf("*");*/
                   body[len].x=bend[i].x-j;
                   body[len].y=bend[i].y;
                   GotoXY(body[len].x,body[len].y);
                       printf("*");
                   len++;
                   if(len==length)
                       break;
               }
       }
   }
}
void Boarder()
{
   system("cls");
   int i;
   GotoXY(food.x,food.y);   /*displaying food*/
       printf("F");
   for(i=10;i<71;i++)
   {
       GotoXY(i,10);
           printf("!");
       GotoXY(i,30);
           printf("!");
   }
   for(i=10;i<31;i++)
   {
       GotoXY(10,i);
           printf("!");
       GotoXY(70,i);
       printf("!");
   }
}
void Print()
{
   //GotoXY(10,12);
   printf("\tWelcome to the mini Snake game.(press any key to continue)\n");
  getch();
   system("cls");
   printf("\tGame instructions:\n");
   printf("\n-> Use arrow keys to move the snake.\n\n-> You will be provided foods at the several coordinates of the screen which you have to eat. Everytime you eat a food the length of the snake will be increased by 1 element and thus the score.\n\n-> Here you are provided with three lives. Your life will decrease as you hit the wall or snake's body.\n\n-> YOu can pause the game in its middle by pressing any key. To continue the paused game press any other key once again\n\n-> If you want to exit press esc. \n");
   printf("\n\nPress any key to play game...");
   if(getch()==27)
   exit(0);
}
void record(){
   char plname[20],nplname[20],cha,c;
   int i,j,px;
   FILE *info;
   info=fopen("record.txt","a+");
   getch();
   system("cls");
   printf("Enter your name\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';
   //*****************************
   //sdfprintf(info,"\t\t\tPlayers List\n");
   fprintf(info,"Player Name :%s\n",nplname);
    //for date and time
   time_t mytime;
  mytime = time(NULL);
  fprintf(info,"Played Date:%s",ctime(&mytime));
     //**************************
     fprintf(info,"Score:%d\n",px=Scoreonly());//call score to display score
     //fprintf(info,"\nLevel:%d\n",10);//call level to display level
   for(i=0;i<=50;i++)
   fprintf(info,"%c",'_');
   fprintf(info,"\n");
   fclose(info);
   printf("wanna see past records press 'y'\n");
   cha=getch();
   system("cls");
   if(cha=='y'){
   info=fopen("record.txt","r");
   do{
       putchar(c=getc(info));
       }while(c!=EOF);}
     fclose(info);
}
int Score()
{
   int score;
   GotoXY(20,8);
   score=length-5;
   printf("SCORE : %d",(length-5));
   score=length-5;
   GotoXY(50,8);
   printf("Life : %d",life);
   return score;
}
int Scoreonly()
{
int score=Score();
system("cls");
return score;
}
void Up()
{
   int i;
   for(i=0;i<=(bend[bend_no].y-head.y)&&len<length;i++)
   {
       GotoXY(head.x,head.y+i);
       {
           if(len==0)
               printf("^");
           else
               printf("*");
       }
       body[len].x=head.x;
       body[len].y=head.y+i;
       len++;
   }
   Bend();
   if(!kbhit())
       head.y--;
}
C:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#include<time.h>
#include<ctype.h>
#include <time.h>
#include <windows.h>
#include <process.h>
#include <unistd.h>

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

int length;
int bend_no;
int len;
char key;
void record();
void load();
int life;
void Delay(long double);
void Move();
void Food();
int Score();
void Print();
void gotoxy(int x, int y);
void GotoXY(int x,int y);
void Bend();
void Boarder();
void Down();
void Left();
void Up();
void Right();
void ExitGame();
int Scoreonly();

struct coordinate{
    int x;
    int y;
    int direction;
};

typedef struct coordinate coordinate;

coordinate head, bend[500],food,body[30];

int main()
{

    char key;

    Print();

    system("cls");

    load();

    length=5;

    head.x=25;

    head.y=20;

    head.direction=RIGHT;

    Boarder();

    Food(); //to generate food coordinates initially

    life=3; //number of extra lives

    bend[0]=head;

    Move();   //initialing initial bend coordinate

    return 0;

}

void Move()
{
    int a,i;

    do{

        Food();
        fflush(stdin);

        len=0;

        for(i=0;i<30;i++)

        {

            body[i].x=0;

            body[i].y=0;

            if(i==length)

            break;

        }

        Delay(length);

        Boarder();

        if(head.direction==RIGHT)

            Right();

        else if(head.direction==LEFT)

            Left();

        else if(head.direction==DOWN)

            Down();

        else if(head.direction==UP)

            Up();

        ExitGame();

    }while(!kbhit());

    a=getch();

    if(a==27)

    {

        system("cls");

        exit(0);

    }
    key=getch();

    if((key==RIGHT&&head.direction!=LEFT&&head.direction!=RIGHT)||(key==LEFT&&head.direction!=RIGHT&&head.direction!=LEFT)||(key==UP&&head.direction!=DOWN&&head.direction!=UP)||(key==DOWN&&head.direction!=UP&&head.direction!=DOWN))

    {

        bend_no++;

        bend[bend_no]=head;

        head.direction=key;

        if(key==UP)

            head.y--;

        if(key==DOWN)

            head.y++;

        if(key==RIGHT)

            head.x++;

        if(key==LEFT)

            head.x--;

        Move();

    }

    else if(key==27)

    {

        system("cls");

        exit(0);

    }

    else

    {

        printf("\a");

        Move();

    }
}

void gotoxy(int x, int y)
{

COORD coord;

coord.X = x;

coord.Y = y;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

}
void GotoXY(int x, int y)
{
    HANDLE a;
    COORD b;
    fflush(stdout);
    b.X = x;
    b.Y = y;
    a = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(a,b);
}
void sleep(unsigned int mseconds)
{
    clock_t goal = mseconds + clock();
    while (goal > clock());
}
void load(){
    int row,col,r,c,q;
    gotoxy(36,14);
    printf("loading...");
    gotoxy(30,15);
    for(r=1;r<=20;r++){
    sleep(200);//to display the character slowly
    printf("%c",177);}
    getch();
}
void Down()
{
    int i;
    for(i=0;i<=(head.y-bend[bend_no].y)&&len<length;i++)
    {
        GotoXY(head.x,head.y-i);
        {
            if(len==0)
                printf("v");
            else
                printf("*");
        }
        body[len].x=head.x;
        body[len].y=head.y-i;
        len++;
    }
    Bend();
    if(!kbhit())
        head.y++;
}
void Delay(long double k)
{
    Score();
    long double i;
    for(i=0;i<=(10000000);i++);
}
void ExitGame()
{
    int i,check=0;
    for(i=4;i<length;i++)   //starts with 4 because it needs minimum 4 element to touch its own body
    {
        if(body[0].x==body[i].x&&body[0].y==body[i].y)
        {
            check++;    //check's value increases as the coordinates of head is equal to any other body coordinate
        }
        if(i==length||check!=0)
            break;
    }
    if(head.x<=10||head.x>=70||head.y<=10||head.y>=30||check!=0)
    {
        life--;
        if(life>=0)
        {
            head.x=25;
            head.y=20;
            bend_no=0;
            head.direction=RIGHT;
            Move();
        }
        else
        {
            system("cls");
            printf("All lives completed\nBetter Luck Next Time!!!\nPress any key to quit the game\n");
            record();
            exit(0);
        }
    }
}
void Food()
{
    if(head.x==food.x&&head.y==food.y)
    {
        length++;
        time_t a;
        a=time(0);
        srand(a);
        food.x=rand()%70;
        if(food.x<=10)
            food.x+=11;
        food.y=rand()%30;
        if(food.y<=10)

            food.y+=11;
    }
    else if(food.x==0)/*to create food for the first time coz global variable are initialized with 0*/
    {
        food.x=rand()%70;
        if(food.x<=10)
            food.x+=11;
        food.y=rand()%30;
        if(food.y<=10)
            food.y+=11;
    }
}
void Left()
{
    int i;
    for(i=0;i<=(bend[bend_no].x-head.x)&&len<length;i++)
    {
        GotoXY((head.x+i),head.y);
       {
                if(len==0)
                    printf("<");
                else
                    printf("*");
        }
        body[len].x=head.x+i;
        body[len].y=head.y;
        len++;
    }
    Bend();
    if(!kbhit())
        head.x--;

}
void Right()
{
    int i;
    for(i=0;i<=(head.x-bend[bend_no].x)&&len<length;i++)
    {
        //GotoXY((head.x-i),head.y);
        body[len].x=head.x-i;
        body[len].y=head.y;
        GotoXY(body[len].x,body[len].y);
        {
            if(len==0)
                printf(">");
            else
                printf("*");
        }
        /*body[len].x=head.x-i;
        body[len].y=head.y;*/
        len++;
    }
    Bend();
    if(!kbhit())
        head.x++;
}
void Bend()
{
    int i,j,diff;
    for(i=bend_no;i>=0&&len<length;i--)
    {
            if(bend[i].x==bend[i-1].x)
            {
                diff=bend[i].y-bend[i-1].y;
                if(diff<0)
                    for(j=1;j<=(-diff);j++)
                    {
                        body[len].x=bend[i].x;
                        body[len].y=bend[i].y+j;
                        GotoXY(body[len].x,body[len].y);
                        printf("*");
                        len++;
                        if(len==length)
                            break;
                    }
                else if(diff>0)
                    for(j=1;j<=diff;j++)
                    {
                        /*GotoXY(bend[i].x,(bend[i].y-j));
                        printf("*");*/
                        body[len].x=bend[i].x;
                        body[len].y=bend[i].y-j;
                        GotoXY(body[len].x,body[len].y);
                        printf("*");
                        len++;
                        if(len==length)
                            break;
                    }
            }
        else if(bend[i].y==bend[i-1].y)
        {
            diff=bend[i].x-bend[i-1].x;
            if(diff<0)
                for(j=1;j<=(-diff)&&len<length;j++)
                {
                    /*GotoXY((bend[i].x+j),bend[i].y);
                    printf("*");*/
                    body[len].x=bend[i].x+j;
                    body[len].y=bend[i].y;
                    GotoXY(body[len].x,body[len].y);
                        printf("*");
                   len++;
                   if(len==length)
                           break;
               }
           else if(diff>0)
               for(j=1;j<=diff&&len<length;j++)
               {
                   /*GotoXY((bend[i].x-j),bend[i].y);
                   printf("*");*/
                   body[len].x=bend[i].x-j;
                   body[len].y=bend[i].y;
                   GotoXY(body[len].x,body[len].y);
                       printf("*");
                   len++;
                   if(len==length)
                       break;
               }
       }
   }
}
void Boarder()
{
   system("cls");
   int i;
   GotoXY(food.x,food.y);   /*displaying food*/
       printf("F");
   for(i=10;i<71;i++)
   {
       GotoXY(i,10);
           printf("!");
       GotoXY(i,30);
           printf("!");
   }
   for(i=10;i<31;i++)
   {
       GotoXY(10,i);
           printf("!");
       GotoXY(70,i);
       printf("!");
   }
}
void Print()
{
   //GotoXY(10,12);
   printf("\tWelcome to the mini Snake game.(press any key to continue)\n");
  getch();
   system("cls");
   printf("\tGame instructions:\n");
   printf("\n-> Use arrow keys to move the snake.\n\n-> You will be provided foods at the several coordinates of the screen which you have to eat. Everytime you eat a food the length of the snake will be increased by 1 element and thus the score.\n\n-> Here you are provided with three lives. Your life will decrease as you hit the wall or snake's body.\n\n-> YOu can pause the game in its middle by pressing any key. To continue the paused game press any other key once again\n\n-> If you want to exit press esc. \n");
   printf("\n\nPress any key to play game...");
   if(getch()==27)
   exit(0);
}
void record(){
   char plname[20],nplname[20],cha,c;
   int i,j,px;
   FILE *info;
   info=fopen("record.txt","a+");
   getch();
   system("cls");
   printf("Enter your name\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';
   //*****************************
   //sdfprintf(info,"\t\t\tPlayers List\n");
   fprintf(info,"Player Name :%s\n",nplname);
    //for date and time

   time_t mytime;
  mytime = time(NULL);
  fprintf(info,"Played Date:%s",ctime(&mytime));
     //**************************
     fprintf(info,"Score:%d\n",px=Scoreonly());//call score to display score
     //fprintf(info,"\nLevel:%d\n",10);//call level to display level
   for(i=0;i<=50;i++)
   fprintf(info,"%c",'_');
   fprintf(info,"\n");
   fclose(info);
   printf("wanna see past records press 'y'\n");
   cha=getch();
   system("cls");
   if(cha=='y'){
   info=fopen("record.txt","r");
   do{
       putchar(c=getc(info));
       }while(c!=EOF);}
     fclose(info);
}
int Score()
{
   int score;
   GotoXY(20,8);
   score=length-5;
   printf("SCORE : %d",(length-5));
   score=length-5;
   GotoXY(50,8);
   printf("Life : %d",life);
   return score;
}
int Scoreonly()
{
int score=Score();
system("cls");
return score;
}
void Up()
{
   int i;
   for(i=0;i<=(bend[bend_no].y-head.y)&&len<length;i++)
   {
       GotoXY(head.x,head.y+i);
       {
           if(len==0)
               printf("^");
           else
               printf("*");
       }
       body[len].x=head.x;
       body[len].y=head.y+i;
       len++;
   }
   Bend();
   if(!kbhit())
       head.y--;
}
Ce n'é anche qualcun'altro, però penso che questi due bastino
 
Ultima modifica da un moderatore:
U

Utente 16812

Ospite
Uno degli errori comuni ai programmatori, per così dire, "in erba" è quello di credere di saper programmare qualsiasi cosa, dopo aver letto quelle 2-3 paginette dedicate alle strutture di dati, salvo poi chiedere aiuto nel momento in cui ci si accorge che manca la "strategia" di lavoro :asd:
La conoscenza di un linguaggio di programmazione non implica la possibilità di saper programmare, ciò che è assente è la "forma mentis", la mentalità del programmatore :sisi:
La base di una corretta metodologia di progettazione degli algoritmi è logico-matematica: ad es., come si calcola l'M.C.D. tra due numeri interi, supponendo di usare l'algoritmo di Euclide ?
Quali sono i passi risolutivi per trovare le radici reali di un'equazione di secondo grado ?
Come si calcola il fattoriale di un numero intero n (n!) ?
Prova a sviluppare un programma che, data una frase in input, visualizzi su video il numero delle vocali e delle consonanti presenti nella frase.
Oppure, più interessante, dato un numero intero in input, dire se si tratta di un numero perfetto o meno (un numero è perfetto se è uguale alla somma dei suoi divisori, escluso se stesso: ad es. 6=1+2+3).
In alternativa, dato un numero intero in input, dire se tale numero è primo :asd:
Ci sarebbero infiniti altri esempi da proporre ma resta inteso che occorre partire da problemi di natura semplice, quasi banale, per poi arrivare gradualmente a problemi più complessi, una volta sviluppato un maggior "senso" della programmazione, proprio perché lo scoglio più grosso da superare è affrontare un problema, capirlo e risolverlo, dominando la materia e non essendone dominati ;)
 
U

Utente cancellato 110428

Ospite
Uno degli errori comuni ai programmatori, per così dire, "in erba" è quello di credere di saper programmare qualsiasi cosa, dopo aver letto quelle 2-3 paginette dedicate alle strutture di dati, salvo poi chiedere aiuto nel momento in cui ci si accorge che manca la "strategia" di lavoro :asd:
La conoscenza di un linguaggio di programmazione non implica la possibilità di saper programmare, ciò che è assente è la "forma mentis", la mentalità del programmatore :sisi:
La base di una corretta metodologia di progettazione degli algoritmi è logico-matematica: ad es., come si calcola l'M.C.D. tra due numeri interi, supponendo di usare l'algoritmo di Euclide ?
Quali sono i passi risolutivi per trovare le radici reali di un'equazione di secondo grado ?
Come si calcola il fattoriale di un numero intero n (n!) ?
Prova a sviluppare un programma che, data una frase in input, visualizzi su video il numero delle vocali e delle consonanti presenti nella frase.
Oppure, più interessante, dato un numero intero in input, dire se si tratta di un numero perfetto o meno (un numero è perfetto se è uguale alla somma dei suoi divisori, escluso se stesso: ad es. 6=1+2+3).
In alternativa, dato un numero intero in input, dire se tale numero è primo :asd:
Ci sarebbero infiniti altri esempi da proporre ma resta inteso che occorre partire da problemi di natura semplice, quasi banale, per poi arrivare gradualmente a problemi più complessi, una volta sviluppato un maggior "senso" della programmazione, proprio perché lo scoglio più grosso da superare è affrontare un problema, capirlo e risolverlo, dominando la materia e non essendone dominati ;)
Intanto grazie per la risposta. Sicuramente é così, però non so..guardando il codice, non riesco ad immaginarmi un modo per arrivarci mediante gli altri esercizi. Io ho come l'impressione che ogni caso sia un problema a se stante di cui o sai o non sai la soluzione. Questo però é solo il mio modo di vedere :)
 

icox

Utente Attivo
497
246
Intanto grazie per la risposta. Sicuramente é così, però non so..guardando il codice, non riesco ad immaginarmi un modo per arrivarci mediante gli altri esercizi. Io ho come l'impressione che ogni caso sia un problema a se stante di cui o sai o non sai la soluzione. Questo però é solo il mio modo di vedere :)
Devi andare per gradi e imparare passo dopo passo. Il primo e' capire le basi della programmazione come i costrutti fondamentali, le strutture dati complesse, la gestione della memoria, le attivita' di I/O...
Seguono concetti piu' complessi ma fondamentali, come la programmazione parallela (processi/threads), le interfacce grafiche, comunicazione fra processi (eventualmente anche in rete) ecc.
Ovviamente non tutto ti servira' sempre ma sono cose che devi conoscere molto bene.
Una volta che hai gli "strumenti di base" puoi pensare a come metterli insieme per creare qualcosa e per fare questo ti vengono in aiuto i pattern di progettazione piu' comuni, l'organizzazione/struttura del codice ed eventualmente l'utilizzo di librerie terze gia' sviluppate da altri.
Non c'e' una soluzione universale od un modus operandi valido sempre e comunque, ci sono solo problemi e soluzioni a questi, che dovrai trovare tu.

Se non riesci a comprendere il codice che hai riportato temo che tu non sia ancora pronto, quindi studia ancora e sopratutto scrivi tanto, tanto codice :)
 
U

Utente cancellato 110428

Ospite
Devi andare per gradi e imparare passo dopo passo. Il primo e' capire le basi della programmazione come i costrutti fondamentali, le strutture dati complesse, la gestione della memoria, le attivita' di I/O...
Seguono concetti piu' complessi ma fondamentali, come la programmazione parallela (processi/threads), le interfacce grafiche, comunicazione fra processi (eventualmente anche in rete) ecc.
Ovviamente non tutto ti servira' sempre ma sono cose che devi conoscere molto bene.
Una volta che hai gli "strumenti di base" puoi pensare a come metterli insieme per creare qualcosa e per fare questo ti vengono in aiuto i pattern di progettazione piu' comuni, l'organizzazione/struttura del codice ed eventualmente l'utilizzo di librerie terze gia' sviluppate da altri.
Non c'e' una soluzione universale od un modus operandi valido sempre e comunque, ci sono solo problemi e soluzioni a questi, che dovrai trovare tu.

Se non riesci a comprendere il codice che hai riportato temo che tu non sia ancora pronto, quindi studia ancora e sopratutto scrivi tanto, tanto codice :)
Io i costrutti li conosco e li so applicare nei piccoli esercizi. Quello che mi manca in questo caso é la logica con cui il codice funziona in questo caso.
Francamente non capisco la cosa dell'andare per gradi: anche se lavorassi "per gradi", gli esericizi trattati sarebbero comunque diversi da quello vero e proprio, per cui non vedo come ciò mi possa aiutare.
 

icox

Utente Attivo
497
246
Io i costrutti li conosco e li so applicare nei piccoli esercizi. Quello che mi manca in questo caso é la logica con cui il codice funziona in questo caso.
Francamente non capisco la cosa dell'andare per gradi: anche se lavorassi "per gradi", gli esericizi trattati sarebbero comunque diversi da quello vero e proprio, per cui non vedo come ciò mi possa aiutare.
Certo che gli esercizi sono diversi, come sara' diverso il codice che scriverai per ogni applicativo.
La logica con cui funziona la capisci leggendo il codice (se e' codice scritto in maniera decente) e la documentazione allegata.

Prendiamo il gioco in oggetto ad esempio, personalmente se dovessi farlo in un qualsiasi linguaggio mi porrei domande del tipo: come (e dove) dovra' essere usata l'applicazione? Di quali strumenti avro' bisogno? Cosa devo elaborare durante l'esecuzione? Quali sono gli I/O? Quali strutture dati mi serviranno? Come dovra' interagire l'utente con la mia applicazione?
Parti sempre dall'analisi di cosa ti serve, cosa vuoi raggiungere, i casi d'uso etc.

Ad esempio...
Sicuramente mi servira' "qualcosa" per mostrare lo stato istante per istante, quindi la posizione del "serpente", del "cibo", il punteggio attuale, ecc => GUI: il linguaggio scelto ha librerie grafiche a cui appoggiarmi? Se si, sono sicuro di sapere come si usano?
Dovro' fare in modo che l'utente riesca a interagire, quindi ci dovra' essere "qualcosa" in ascolto degli input dell'utente => un processo/thread dedicato a quello? Sono in grado di gestire piu' processi e farli cooperare per modificare "lo stato" dell'applicazione?
Come tengo traccia dei cambiamenti come per esempio il punteggio? => strutture dati. Cosa posso usare per rappresentare lo stato di avanzamento del gioco?
Se ho piu o meno in mente cosa usare, come lo metto in pratica? => pattern. Conosco i principali pattern di programmazione? Se si (e devo saperli), quali mi conviene usare?
[continua]
....
[continua]

Anche i progetti piu' complessi sono costituiti da elementi fondamentali, l'unica differenza e' che negli esercizi semplici ti occupi di una cosa per volta, qui invece metti tutto insieme.
 
U

Utente cancellato 110428

Ospite
Certo che gli esercizi sono diversi, come sara' diverso il codice che scriverai per ogni applicativo.
La logica con cui funziona la capisci leggendo il codice (se e' codice scritto in maniera decente) e la documentazione allegata.

Prendiamo il gioco in oggetto ad esempio, personalmente se dovessi farlo in un qualsiasi linguaggio mi porrei domande del tipo: come (e dove) dovra' essere usata l'applicazione? Di quali strumenti avro' bisogno? Cosa devo elaborare durante l'esecuzione? Quali sono gli I/O? Quali strutture dati mi serviranno? Come dovra' interagire l'utente con la mia applicazione?
Parti sempre dall'analisi di cosa ti serve, cosa vuoi raggiungere, i casi d'uso etc.

Ad esempio...
Sicuramente mi servira' "qualcosa" per mostrare lo stato istante per istante, quindi la posizione del "serpente", del "cibo", il punteggio attuale, ecc => GUI: il linguaggio scelto ha librerie grafiche a cui appoggiarmi? Se si, sono sicuro di sapere come si usano?
Dovro' fare in modo che l'utente riesca a interagire, quindi ci dovra' essere "qualcosa" in ascolto degli input dell'utente => un processo/thread dedicato a quello? Sono in grado di gestire piu' processi e farli cooperare per modificare "lo stato" dell'applicazione?
Come tengo traccia dei cambiamenti come per esempio il punteggio? => strutture dati. Cosa posso usare per rappresentare lo stato di avanzamento del gioco?
Se ho piu o meno in mente cosa usare, come lo metto in pratica? => pattern. Conosco i principali pattern di programmazione? Se si (e devo saperli), quali mi conviene usare?
[continua]
....
[continua]

Anche i progetti piu' complessi sono costituiti da elementi fondamentali, l'unica differenza e' che negli esercizi semplici ti occupi di una cosa per volta, qui invece metti tutto insieme.
Questo é stato più o meno anche il mio ragionamento, ma il punto é che tra pensarlo e farlo c'é di mezzo un oceano. Il codice postato sopra sinceramente non riesco a capirlo(riga per riga sì, ma nell'isieme no).
 

icox

Utente Attivo
497
246
Questo é stato più o meno anche il mio ragionamento, ma il punto é che tra pensarlo e farlo c'é di mezzo un oceano. Il codice postato sopra sinceramente non riesco a capirlo(riga per riga sì, ma nell'isieme no).
Ovviamente all'inizio e' tutto un po' nebuloso, col tempo diventera' piu' facile trasporre le tue idee in codice.
Ti manca la visione d'insieme, e' abbastanza normale all'inizio non preoccuparti. La cosa importante e' avere solide basi da cui partire, il resto verra' da se' con l'esperienza.
Se vuoi il mio consiglio prima di iniziare scrivi un po di documentazione, definisci chiaramente cosa dovra' fare la tua applicazione, come dovra' funzionare e quali sono i componenti fondamentali: piu' scendi nei dettagli meglio e'. Sembrera' una perdita di tempo, ma ti assicuro che ti servira' sia per organizzarti il lavoro che a capire se tu stesso hai le idee ben chiare, a volte uno pensa di sapere come fare finche' non scende nei dettagli...
Per il resto devi fare tanta pratica, scrivere tanto codice e capire come risolvere i problemi che incontrerai; purtroppo o per fortuna per imparare a programmare devi necessariamente scrivere tanto!

Buon lavoro!
 

filoippo97

Utente Èlite
14,067
7,617
CPU
Intel Core I7 4930K @4.5GHz
Dissipatore
EKWB supremacy nickel
Scheda Madre
ASUS Rampage IV Black Edition
HDD
OCZ vertex 4 512GB | WD RE4 Enterprise Storage 2TB
RAM
16GB Corsair Dominator Platinum 2133MHz cas9 OC @2400MHz 9-11-11-31-2 1.65V
GPU
2-way SLI GTX 780Ti DirectCUII OC
Audio
TEAC UD-503 MUSES + HiFiMan HE-560 V2 + Anaview AMS1000 + Tannoy Revolution XT8F
Monitor
ASUS VG278HR 144Hz 3D 1920x1080p
PSU
Corsair AX1200i Fully sleeved red
Case
Corsair Graphite 760T Arctic White
Periferiche
Corsair K95 | Steelseries Rival
OS
windows 10 Pro
Questo é stato più o meno anche il mio ragionamento, ma il punto é che tra pensarlo e farlo c'é di mezzo un oceano. Il codice postato sopra sinceramente non riesco a capirlo(riga per riga sì, ma nell'isieme no).
io l'avevo fatto come esercizio per prepararmi all'esame se vuoi ti lascio il sorgente, testato e funziona:
C:
/*GIOCO DI SNAKE*/
#include <stdio.h>
#include <dos.h>
#include <io.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
#include <windows.h>
#include <time.h>


#define MAXDIM 1580       //DA FILE              //valore max che il verme deve raggiungere
#define MAX_X 69          //DA FILE
#define MAX_Y 23          //DA FILE

int food_x;
int food_y;
int head_x;
int head_y;
int direzione;
int old_direzione;
int dim;
int snake_x[MAXDIM];
int snake_y[MAXDIM];
int oldsnake_x[MAXDIM];
int oldsnake_y[MAXDIM];
int record;

//FUNCTION
void ctrl_snake(void);
void gotoxy(int x, int y);
void bordi(void);
int get_direction(void);
void food_gen(void);
void inizializer(void);
int read_record(void);
void game(void);
void start(void);
void snake(void);
void game_over(int val);
void print_snake(void);
void border_snake(void);
int random(void);
void remove_cursor(void);
void write_record(int val);
int main(void);
void write_record(int val){
     FILE *writePtr;
     if((writePtr=fopen("record.txt" , "w"))==NULL){
        val=0;
        fprintf(writePtr,"%d" ,val);
        }else{
              fprintf(writePtr,"%d" ,val);
              }
     fclose(writePtr);
}
int read_record(){
    int rcd=0;
    FILE *readPtr;
    if((readPtr=fopen("record.txt" , "r"))==NULL){
        rcd=10000;
        return rcd;
        }else{
              fscanf(readPtr, "%d", &rcd);
              return rcd;
              }
    fclose(readPtr);
}


void start(void){
     bordi();
     gotoxy(13,4);
     printf("------   |\\    |      /\\      |  /     ------");
     gotoxy(13,5);
     printf("|        | \\   |     /  \\     | /      |      ");
     gotoxy(13,6);
     printf("|_____   |  \\  |    /    \\    |/       |_____");
     gotoxy(13,7);
     printf("      |  |   \\ |   /______\\   | \\      |      ");
     gotoxy(13,8);
     printf("______|  |    \\|  /        \\  |  \\     |_____");
     gotoxy(MAX_X/3+3,MAX_Y/2+5);
     printf("Push ENTER to start");
     int btn=0; 
     while(btn!=13){
                if (kbhit()) {
                    btn = getch();
                }
            }
     system("cls");
     bordi();
     }

//Acquisisce la direzione a seconda del tasto premuto, ritorna la direzione
int get_direction(void){

if (kbhit()) {
            int tasto = getch();
            if (tasto == 0) tasto = getch();
           
                           
                switch (tasto) {
                case'w':
                    direzione = 1;
                    break;
                case's':
                    direzione = 2;
                    break;
                case'd':
                    direzione = 3;
                    break;
                case'a':
                    direzione = 4;
                default:
                     direzione;
                    break;
                }
}
if((old_direzione==4 && direzione==3) || (old_direzione==3 && direzione==4 || (old_direzione==1 && direzione==2) || (old_direzione==2 && direzione==1))){
                     direzione=old_direzione;
                     }
        old_direzione=direzione;            
return direzione;
}

//Posizione il cursore per scrivere
void gotoxy(int x, int y)
{

    COORD coord;

    coord.X = x;

    coord.Y = y;

    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
   
}

//Controlla la collisione con i bordi
void border_snake(void){
    switch (get_direction()){
           
           case 1:
                head_y-=1;
                if(head_y==0)head_y=24;
                break;
           case 2:
                head_y+=1;
                 if(head_y==25)head_y=1;
                break;
           case 3:
                head_x+=1;
                 if(head_x==70)head_x=1;
                break;
           case 4:
                head_x-=1;
                 if(head_x==0)head_x=69;
                break;
           }
}

//Aggiorna costantemente gli array snake_x e snake_y delle cordinate 

void snake(void){
    snake_x[0]=head_x;
    snake_y[0]=head_y; 
   
    for(int i=1;i<=MAXDIM;i++){
            snake_x[i]=oldsnake_x[i-1];
            snake_y[i]=oldsnake_y[i-1];
            oldsnake_x[i-1]=snake_x[i-1];
            oldsnake_y[i-1]=snake_y[i-1];
            } 
           
}

//Funzione di fine gioco
void game_over(int val){
   
    bordi();
    if(val==0){
    gotoxy(MAX_X/2-4,MAX_Y/2);
    printf("GAME OVER");
    if(record<dim){
     record=dim;              
    write_record(dim);              
    }
    gotoxy(MAX_X/3+1,MAX_Y/2+5);
    printf("Push ENTER to restart");
    }else{
    gotoxy(MAX_X/2-20,MAX_Y/2);
    printf("WINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN");
    gotoxy(MAX_X/3+3,MAX_Y/2+5);
    printf("Push ENTER to restart");
    }
    int btn=0; 
    while(btn!=13){
                if (kbhit()) {
                    btn = getch();
                }
            }
    main();
}
   
//Stampa lo snake e fa alcuni controlli
void print_snake(){
    for(int i=0;i<MAXDIM;i++){
            if(snake_x[i]==food_x && snake_y[i]==food_y){
                                  dim+=1;
                                  if(dim==MAXDIM){
                                                  game_over(1);
                                                  }
                                  food_gen();
                                  }
                                 
           
            for(int x=1;x<dim;x++){
                      if(snake_x[x]==head_x && snake_y[x]==head_y  ){
                                  game_over(0);
                                  }
                      }
                         
                         
                         
            if(i<dim){
            gotoxy(snake_x[i],snake_y[i]);
            putch('*');
            }else{
                 
                  gotoxy(snake_x[i],snake_y[i]);
                  putch(' ');
                  break;
                  }
    }
  gotoxy(0,0);
  putch('#'); 
   
}

//Disegna i bordi del campo
void bordi(void){
   
 for(int i=0;i<=70;i++){
         gotoxy(i,0);
         putch('#');
         }
 for(int i=0;i<=70;i++){
         gotoxy(i,25);
         putch('#');
         } 
 for(int i=0;i<=25;i++){
         gotoxy(0,i);
         putch('#');
         } 
 for(int i=0;i<=25;i++){
         gotoxy(70,i);
         putch('#');
         }    
}

//ciclo principale del gioco
void game(void){
    food_gen();
    while(1){
        border_snake();
        snake();
        print_snake();
        gotoxy(4,26);
        printf("Score: %d", dim);
        gotoxy(4,28);
        printf("Record: %d", record);
        //gotoxy(20,26);
        //printf("Finish at: %d", MAXDIM);
        Sleep(80);
       
    }
}

//Funzione random per generare il cibo
int random(int maxnum) {
    int gen;
    gen = rand()%maxnum;
    return gen;
}

//Genera il cibo random
void food_gen(void){
   
     food_x=1+random(MAX_X);
     food_y=1+random(MAX_Y);
     gotoxy(food_x,food_y);
     putch('@');
     }
     
//Rimuove il cursore 
void removeCursor(void) 
{ 
    CONSOLE_CURSOR_INFO curInfo; 
    GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &curInfo); 
    curInfo.bVisible=0; 
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &curInfo); 
}

//Inizializza variabili generali e configura il prompt
void inizializer(void){
removeCursor();
system("color 84");
system("cls");
head_x=10;
head_y=10;
direzione=3;                  
old_direzione=0;
dim=1;                
record=read_record();
srand(time(NULL));
bordi();
}

///////////////////////////////////////
int main(void){
    inizializer();                            
    start();
    game();
}

[code]
 
  • Mi piace
Reazioni: elvan2

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili