螢幕截圖:
#include<stdio.h> #include<stdlib.h> #include<SDL/SDL.h> #include<time.h> #include<stdbool.h> #define length 800 #define wide 600 #define num 5 struct node { SDL_Rect snake; struct node *next; }; typedef struct node rect; int main(int argc,char** argv) { SDL_Init(SDL_INIT_EVERYTHING); SDL_Surface *screen; screen=SDL_SetVideoMode(length,wide,32,SDL_SWSURFACE); SDL_WM_SetCaption("((((^.^))))****TaiQing's SDL Snake****((((^.^))))",NULL); bool running=true; Uint32 start; Uint32 color=SDL_MapRGB(screen->format,0,0,0); Uint32 color1=SDL_MapRGB(screen->format,255,0,0); Uint32 color2=SDL_MapRGB(screen->format,255,255,255); int i,dx=-22,dy=0; srand(time(NULL)); SDL_Rect food; food.x=rand()%36*22+4; food.y=rand()%27*22+14; food.w=20; food.h=20; rect *first,*current,*previous,*increase; //first第一個節點 current正在處理的節點 previous前一節點指標 increase新節點 for(i=0;i<num;i++) { current=(rect *) malloc(sizeof(rect)); current->snake.x=(400+22*i); current->snake.y=300; current->snake.w=20; current->snake.h=20; if(i==0) first=current; else previous->next=current; current->next=NULL; previous=current; } while(running) { start=SDL_GetTicks(); SDL_Event event; //keyboard while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_QUIT: running=false; break; case SDL_KEYDOWN: switch(event.key.keysym.sym) { case SDLK_ESCAPE: running=false; break; case SDLK_UP: if(dx!=0) dy=-22; dx=0; break; case SDLK_DOWN: if(dx!=0) dy=22; dx=0; break; case SDLK_LEFT: if(dy!=0) dx=-22; dy=0; break; case SDLK_RIGHT: if(dy!=0) dx=22; dy=0; break; } break; } } //move current=first; while(current->next!=NULL) current=current->next; while(current!=first) { previous=first; while(previous->next!=current) previous=previous->next; current->snake.x=previous->snake.x; current->snake.y=previous->snake.y; current=previous; } first->snake.x+=dx; first->snake.y+=dy; //eat food and change length if(first->snake.x==food.x && first->snake.y==food.y) { food.x=rand()%36*22+4; food.y=rand()%27*22+14; increase=(rect *) malloc(sizeof(rect)); current=first; while(current->next!=NULL) current=current->next; if(current->next==NULL) { increase->snake=current->snake; increase->next=NULL; current->next=increase; } } //die or dorder if(first->snake.x<0 || first->snake.x>780) running=false; if(first->snake.y<0 || first->snake.y>580) running=false; current=first; current=current->next; while(current!=NULL) { if(current->snake.x==first->snake.x && current->snake.y==first->snake.y) running=false; current=current->next; } //render SDL_FillRect(screen,&screen->clip_rect,color); SDL_FillRect(screen,&food,color2); current=first; while(current!=NULL) { SDL_FillRect(screen,&(current->snake),color1); current=current->next; } SDL_Flip(screen); SDL_Delay(100); } SDL_Quit(); return 0; }
沒有留言:
張貼留言