C 언어 코드 체인 테이블 탐식 뱀 게임 실현

17882 단어 C 언어탐식 사
본 논문 의 사례 는 여러분 에 게 C 언어 링크 가 뱀 을 게 걸 스 럽 게 먹 는 게임 을 실현 하 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
탐식 사 디자인 사고:

화면 좌표:

확장 기능:
1.F1,F2 가속 감속 제어  스페이스 바 일시 정지 게임  Esc 탈퇴
2.모든 음식 을 가속 화하 여 더 높 은 점 수 를 얻는다.
먼저 게임 인터페이스 를 출력 하고 뱀 을 초기 화 합 니 다.뱀의 노드 는 문자열★로 표시 합 니 다.게임 배경 은■로 표시 합 니 다.이 문자열 들 은 두 바이트 의 폭 을 차지 하기 때문에 매번 x,y 좌표 의 대응 관 계 는 x=y*2 입 니 다.해당 위치 에서 뱀 을 출력 하고 뱀 을 다섯 개의 노드 로 초기 화 합 니 다.

뱀 머리의 이동 방향 을 오른쪽으로 초기 화하 고 버튼 에 따라 뱀의 이동 상 태 를 확인 한 후 음식 을 먹 으 면 뱀 머리 로 만들어 무 작위 로 음식 을 생 성 한다.
중점 모듈:
뱀 이동 의 실현:
구조 체 를 정의 하고 그 안에 노드 좌표 와 next 지침 을 넣 습 니 다.

뱀 이 이동 할 때마다 사용자 버튼 방향 을 통 해 다음 뱀 머리 노드 의 x,y 좌 표를 확인 하고 새로운 노드 를 다음 좌표 에 부여 한다.이 좌표 에서 뱀의 아이콘 을 치고 꼬리 노드 를 찾 아 꼬리 노드 를 배경 아이콘 으로 인쇄 한 다음 에 노드 를 방출 한다.그러면 뱀 이 한 번 움 직 이 고 이 를 반복 하면 뱀 이 동태 적 으로 이동 할 수 있다.
음식의 실현:
하나의 음식 노드 를 정의 하 는 것 도 뱀 과 유사 한 구조 체 지침 으로 무 작위 수 를 통 해 좌 표를 생 성하 고 벽 과 뱀 에 게 있 으 면 안 된다.
사용자 버튼 의 검 측:wasd 문 자 를 사용 하여 방향 을 정할 수 있 습 니 다.그러나 여기 서 우 리 는 빈 칸,ESC 키,상하 좌우 키 를 사용 해 야 하기 때문에 직접적 으로 GetAsyncKeyState()함 수 를 통 해 사용자 가 입력 한 버튼 을 검 측 할 수 있 습 니 다.헤더 파일 conio.h 를 참조 해 야 합 니 다.getch()함 수 는 현재 버튼 입력 이 있 는 지 확인 하 는 데 사용 되 며,있 으 면 0 이 아 닌 수 를 되 돌려 줍 니 다.
뱀의 변속:아니면 GetAsyncKeyState()함 수 를 통 해 F1,F2,키 를 검 측 하여 뱀 이 Sleep()함수 중의 밀리초 수 를 한 번 이동 하 는 지 확인 하면 뱀의 가속 감속 을 실현 할 수 있 습 니 다.또한 뱀 은 한 번 이동 할 때마다 system("cls")을 사용 하지 않 아 도 되 며,순환 중 snakemove()를 통 해 한 번,Sleep()함수 가 한 번 실행 되면 동적 이동 이 가능 합 니 다.
구현 효과:

전체 코드:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h> 
#include<time.h> 
#include<windows.h> 
#include<stdlib.h> 
#include<conio.h> //        
 
 
#define U 1
#define D 2
#define L 3 
#define R 4  //    ,U:  ;D: ;L:  R: 
 
/*******            *******/
typedef struct snake //       
{
 int x;
 int y;
 struct snake *next;
}snake;
int score=0,add=10; //           
int status,sleeptime=200; //     ,         
snake *head, *food; //    ,    
snake *q;  //           
int endgamestatus=0; //       ,1:   ;2:    ;3:      。
HANDLE hOut; //     
 
 
/*******        *******/
void gotoxy(int x,int y); //      
int color(int c);   //      
void welcometogame();  //    
void createMap();   //    
void scoreandtips(); //             
void initsnake();   //     ,   
void createfood();   //         
int biteself();    //         
void cantcrosswall();  //        
void speedup(); //  
void speeddown(); //  
void snakemove();   //       
void keyboardControl();  //      
void Lostdraw();   //      
void endgame();    //    
void choose(); //         
void explation();   //    
 
/**
 *       
 */
void gotoxy(int x,int y)
{
 COORD c;
 c.X=x;
 c.Y=y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
 
/**
 *         
 */
int color(int c)
{
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);  //      
 return 0;
}
 
 
 
 //    
 
void welcometogame()
{
 int n;
 gotoxy(43,10);
 color(11);
 printf("           ");
 color(12);
 gotoxy(25, 22);
 printf("1.    ");
 gotoxy(45, 22);
 printf("2.    ");
 gotoxy(65, 22);
 printf("3.    ");
 gotoxy(40,27);
 color(3);
 printf("    1 2 3:");  
 color(14);
 scanf("%d", &n);  //    
 switch (n)
 {
  case 1:
  system("cls");
 createMap();  //    
  initsnake();  //     
  createfood();  //    
  keyboardControl(); //    
   break;
  case 2:
   explation();  //      
   break;
  case 3:
   exit(0);  //    
   break;
 default: 
 color(12);
 gotoxy(40,28);
 printf("   1―3    !");
 _getch(); //     
 system("cls"); //  
 welcometogame();
 }
}
 
 
 //    
 
void createMap()
{
 int i,j;
 for(i=0;i<58;i+=2) //      
 {
  gotoxy(i,0);
 color(5); 
  printf("□");
  gotoxy(i,26);
  printf("□");
 }
 for(i=1;i<26;i++) //      
 {
  gotoxy(0,i);
  printf("□");      
  gotoxy(56,i);
  printf("□");  
 }
 for(i = 2;i<56;i+=2) //      
 {
 for(j = 1;j<26;j++)
 {
 gotoxy(i,j);
 color(3);
 printf("■");
 }
 }
}
 
 
 //              
 
void scoreandtips()
{
 
 gotoxy(64,8);
 color(14);
 printf("  :%d ",score);
 
 gotoxy(64,14);
 printf("      :%d ",add);
 gotoxy(64,16);
 printf("    ,      ");
 gotoxy(64,18);
 printf(" ↑ ↓ ← →        ");
 gotoxy(64,20);
 printf("F1    ,F2    ");
 gotoxy(64,22);
 printf("space:    ");
 gotoxy(64,24);
 printf("ESC :    ");
}
 
 
 //     ,   
 
void initsnake()
{
 snake *tail;
 int i;
 tail=(snake*)malloc(sizeof(snake));//     ,   , x,y       
 tail->x=24;   //      (24,5)
 tail->y=5;
 tail->next=NULL;
 for(i=1;i<=4;i++)  //    ,   5
 {
  head=(snake*)malloc(sizeof(snake)); //     
  head->next=tail;  //         
  head->x=24+2*i;   //      
  head->y=5;
  tail=head;    //      ,      
 }
 while(tail!=NULL) //    ,    
 {
  gotoxy(tail->x,tail->y);
 color(14);
  printf("★");  //    ,    ★  
  tail=tail->next; //      ,        ,       
 }
}
 
 /**
 *       
 */
void createfood()
{
 snake *food_1;
 srand((unsigned)time(NULL));   //      
 food_1=(snake*)malloc(sizeof(snake)); //   food_1
 while((food_1->x%2)!=0)  //      ,          ,            
 {
  food_1->x=rand()%52+2;    //      
 }
 food_1->y=rand()%24+1;
 q=head;
 while(q->next==NULL)
 {
  if(q->x==food_1->x && q->y==food_1->y) //           
  {
   free(food_1);    //         ,        
   createfood();    //      
  }
  q=q->next;
 }
 gotoxy(food_1->x,food_1->y);
 food=food_1;
 color(12);
 printf("●");   //    
}
 
 /**
 *          
 */
int biteself()
{
 snake *self;   //  self         
 self=head->next;  //self            
 while(self!=NULL)
 {
  if(self->x==head->x && self->y==head->y) //  self         
  {
   return 1;  //  1
  }
  self=self->next;
 }
 return 0;
}
 
 /**
 *         
 */
void cantcrosswall()
{ 
 if(head->x==0 || head->x==56 ||head->y==0 || head->y==26) //         
 {
  endgamestatus=1;  //       
  endgame();    //        
 }
}
 
 
 
/**
 *   ,          ,   F1   
 */
void speedup()
{
 if(sleeptime>=50)
 {
 sleeptime=sleeptime-10;
 add=add+2;
 
 }
}
 
/**
 *   , F2   
 */
void speeddown()
{
 if(sleeptime<350)    //        350
 {
  sleeptime=sleeptime+30;  //      30
  add=add-2;     //          2
 
 }
}
 
/**
 *        :      status,                 
 */
void snakemove() //   , U, D, L, R
{
 snake * nexthead;
 cantcrosswall();
 nexthead=(snake*)malloc(sizeof(snake)); //        
 if(status==U)
 {
  nexthead->x=head->x;  //     ,x    ,y  -1
  nexthead->y=head->y-1;
  nexthead->next=head;
  head=nexthead;
  q=head;     //  q    
  if(nexthead->x==food->x && nexthead->y==food->y) //                         
  {
   
   while(q!=NULL)
   {
    gotoxy(q->x,q->y);
 color(14);
    printf("★");  //       , ●  ★
    q=q->next;   //  q                  
 
   }
   score=score+add;  //      ,          
 speedup();
   createfood();   //    
  }
  else      
  {
   while(q->next->next!=NULL) //       
   {
    gotoxy(q->x,q->y);
    color(14);
    printf("★");   //      ,         
    q=q->next;    //        
   }
   gotoxy(q->next->x,q->next->y); //       ,q    ,      ,         
 color(3);
   printf("■");
   free(q->next);  //    ■  ,          
   q->next=NULL;  //        
  }
 }
 if(status==D)
 {
  nexthead->x=head->x;  //     ,x    ,y  +1
  nexthead->y=head->y+1;
  nexthead->next=head;
  head=nexthead;
  q=head;
  if(nexthead->x==food->x && nexthead->y==food->y) //   
  {
   
   while(q!=NULL)
   {
    gotoxy(q->x,q->y);
    color(14);
    printf("★");
    q=q->next;
   }
   score=score+add;
 speedup();
   createfood();
  }
  else        //    
  {
   while(q->next->next!=NULL)
   {
    gotoxy(q->x,q->y);
    color(14);
    printf("★");
    q=q->next;
   }
   gotoxy(q->next->x,q->next->y);
 color(3);
   printf("■");
   free(q->next);
   q->next=NULL;
  }
 }
 if(status==L)
 {
  nexthead->x=head->x-2;  //     ,x      -2,y    
  nexthead->y=head->y;
  nexthead->next=head;
  head=nexthead;
  q=head;
  if(nexthead->x==food->x && nexthead->y==food->y)//   
  {
   while(q!=NULL)
   {
    gotoxy(q->x,q->y);
    color(14);
    printf("★");
    q=q->next;
   }
   score=score+add;
 speedup();
   createfood();
  }
  else        //    
  {
   while(q->next->next!=NULL)
   {
    gotoxy(q->x,q->y);
    color(14);
    printf("★");
    q=q->next;  
   }
   gotoxy(q->next->x,q->next->y);
 color(3);
   printf("■");
   free(q->next);
   q->next=NULL;
  }
 }
 if(status==R)
 {
  nexthead->x=head->x+2;  //     ,x      +2,y    
  nexthead->y=head->y;
  nexthead->next=head;
  head=nexthead;
  q=head;
  if(nexthead->x==food->x && nexthead->y==food->y)//   
  {
   while(q!=NULL)
   {
    gotoxy(q->x,q->y);
    color(14);
    printf("★");
    q=q->next;
   }
   score=score+add;
 speedup();
   createfood();
  }
  else           //    
  {
   while(q->next->next!=NULL)
   {
    gotoxy(q->x,q->y);
    color(14);
    printf("★");
    q=q->next;  
   }
   gotoxy(q->next->x,q->next->y);
 color(3);
   printf("■");
   free(q->next);
   q->next=NULL;
  }
 }
 if(biteself()==1)  //         
 {
  endgamestatus=2;
  endgame();
 }
}
 
 
/**
 *       
 */
void keyboardControl()
{
 status=R;  //       
 while(1)
 {
 scoreandtips();
  if(GetAsyncKeyState(VK_UP) && status!=D)   //GetAsyncKeyState                   
  {
   status=U;   //            ,   ,        
  }
  else if(GetAsyncKeyState(VK_DOWN) && status!=U)  //            ,   ,        
  {
   status=D;
  }
  else if(GetAsyncKeyState(VK_LEFT)&& status!=R)  //            ,   ,      
  {
   status=L;
  }
  else if(GetAsyncKeyState(VK_RIGHT)&& status!=L)  //            ,   ,      
  {
   status=R;
  }
  if(GetAsyncKeyState(VK_SPACE)) //    ,  pause    
  {
   while(1)
 {
 Sleep(300); //sleep()  ,   #include <unistd.h>      ,              。
 if(GetAsyncKeyState(VK_SPACE))  //      
 {
  break;
 }
 
 }  
  }
  else if(GetAsyncKeyState(VK_ESCAPE))
  {
   endgamestatus=3; // esc ,       
   break;
  }
  else if(GetAsyncKeyState(VK_F1)) // F1 ,  
  {
   speedup();
  }
  else if(GetAsyncKeyState(VK_F2)) // F2 ,  
  {
   speeddown();
   
  }
  Sleep(sleeptime);
  snakemove();
 }
}
 
 
/*
*     
*/
void explation()
{
 //int i,j = 1;
 system("cls");
 // color(13);
 // gotoxy(44,3);
 // printf("    ");
 // color(2);
 // for (i = 6; i <= 22; i++) //      ===
 //{
 // for (j = 20; j <= 75; j++) //      ||
 // {
 // gotoxy(j, i);
 // if (i == 6 || i == 22) printf("=");
 // else if (j == 20 || j == 75) printf("||");
 // }
 //}
 color(3);
 gotoxy(30,8);
 printf("1.     ,      ");
 color(10);
 gotoxy(30,11);
 printf("2.  ↑.↓.←.→        ");
 color(14);
 gotoxy(30,14);
 printf("3. F1    ,F2    ");
 color(11);
 gotoxy(30,17);
 printf("4.         ,       ");
 color(4);
 gotoxy(30,20);
 printf("5. ESC :    .space:    ");
 _getch();    //         
 system("cls");
 welcometogame();
}
 
 
 
/**
 *     
 */
void endgame()
{
 system("cls");
 if(endgamestatus==1)
 {
  
 //Lostdraw();
 gotoxy(43,9);
  color(12);
 printf("GAME OVER !");
 }
 else if(endgamestatus==2)
 {
  
  //Lostdraw();
  gotoxy(43,9);
  color(12);
  printf("GAME OVER !");
 }
 else if(endgamestatus==3)
 {
 //Lostdraw();
 gotoxy(40,9);
  color(12);
  printf("     。");
 }
 gotoxy(43,12);
 color(13);
 printf("      %d",score);
 choose();
}
 
/**
 *          
 */
void choose()
{
 int n;
 gotoxy(25,23);
 color(12);
 printf("Continue ------ 1");
 gotoxy(52,23);
 printf("Exit ------ 2");
 gotoxy(45,25);
 color(11);
 printf("  : ");
 scanf("%d", &n);
 switch (n)
 {
 case 1:
 system("cls");   //  
 score=0;    //    
 sleeptime=200; //      
 add = 10; // add     ,       10,    
 welcometogame();
 break;
 case 2:
 exit(0);    //    
 break;
 default:
 gotoxy(35,27);
 color(12);
 printf("           !");
 system("pause >nul");
 endgame();
 choose();
 break;
 }
 
}
/**
 *     
 */
void Lostdraw()
{
 system("cls");
 int i;
 gotoxy(45,2);
 color(6);
 printf("\\\\\\|///");
 gotoxy(43,3);
 printf("\\\\");
 gotoxy(47,3);
 color(15);
 printf(".-.-");
 gotoxy(54,3);
 color(6);
 printf("//");
 
 gotoxy(44,4);
 color(14);
 printf("(");
 
 gotoxy(47,4);
 color(15);
 printf(".@.@");
 
 gotoxy(54,4);
 color(14);
 printf(")");
 
 gotoxy(17,5);
 color(11);
 printf("+------------------------");
 
 gotoxy(35,5);
 color(14);
 printf("oOOo");
 
 gotoxy(39,5);
 color(11);
 printf("----------");
 
 gotoxy(48,5);
 color(14);
 printf("(_)");
 
 gotoxy(51,5);
 color(11);
 printf("----------");
 
 gotoxy(61,5);
 color(14);
 printf("oOOo");
 
 gotoxy(65,5);
 color(11);
 printf("-----------------+");
 
 for(i = 6;i<=19;i++)  //   
 {
 gotoxy(17,i);
 printf("|");
 gotoxy(82,i);
 printf("|");
 }
 
 gotoxy(17,20);
 printf("+---------------------------------");
 
 gotoxy(52,20);
 color(14);
 printf("☆☆☆〃");
 
 gotoxy(60,20);
 color(11);
 printf("----------------------+");
 
}
 
/**
*    
*/
int main()
{ 
 system("mode con cols=100 lines=30"); //        
 //printsnake();
 welcometogame();
 
 keyboardControl();
 endgame();
 return 0;
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기