C 언어 로 비행기 타기 게임 실현

본 논문 의 사례 는 여러분 에 게 C 언어 로 비행기 게임 을 실현 하 는 구체 적 인 코드 를 공유 하 였 으 며,여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
컴 파일 환경:vs 2019
필요:
같은 평면 내 에서 대포 발사 의 세 방향 을 제어 하고,스페이스 바 로 포탄 을 발사 하 며,적군 과 아군 비행 기 는 줄곧 무 작위 로 하늘 을 날 아 갈 것 이 며,하늘 을 비행 하 는 적군 비행 기 를 명중 시 키 면 1 점 을 더 하고,아군 비행 기 를 명중 시 키 면 1 점 을 줄 일 것 이다.
생각:
먼저 프로그램 을 초기 화한 다음 에 설명 과 지 도 를 그리고 무한 순환 에 들어간다.순환 에서 비행기 가 끊임없이 하늘 을 날 고 awd 스페이스 바 를 통 해 게임 내용 을 제어 하 며 게임 조건 에 부합 할 때 세 가지 주요 절 차 를 가산 한다.
방법:
먼저 비행기의 애니메이션 효 과 를 실현 하려 면 본질 적 으로 콘 솔 에서 세 개의 x 축 에 하나의 문자열 을 출력 하고 이 세 개의 문자열 을 동시에 이동 하 는 것 처럼 보 여야 한다.여기 서 저 는 도박 대회 의 경험 을 빌 렸 습 니 다.첫 번 째 무한 순환 에서 각각 1,2,3 개의 문자열 을 순환 적 으로 출력 한 다음 에 세 개의 문자열 x 축 좌표 수 치 를 추가 하고 두 번 째 무한 순환 에서 지난 문자열 의 이동 흔적 을 제거 하 며 세 개의 문자열 을 각각 출력 하여 두 번 째 단 계 를 나 가 겠 다 고 했 습 니 다.내부 for 순환 에 휴면 함수 가 없 기 때문에 세 문자열 이 동시에 이동 하 는 효과 로 보 입 니 다.이렇게 하면 무한 순환 을 통 해 비행기 세 대가 끊임없이 이동 한 다 는 것 을 나 타 낼 수 있다.
다음은 getch 함 수 를 통 해 대포 의 방향(한 글자)을 바 꾸 는 것 입 니 다.포구 가 방향 을 바 꾸 는 동시에 포탄 이 초기 화 된 위치 도 변 합 니 다.빈 칸 을 누 르 면 포탄(한 글자)은 그의 초기 화 위치 에서 설 정 된 노선 을 따라 끊임없이 이동 합 니 다.가로 세로 축 좌표 가 비행기 좌표 와 일치 할 때 적군 비행기 인지 여 부 를 판단 합 니 다.예,득점 에 1 을 더 해 야 합 니 다.그렇지 않 으 면 득점 에서 1 을 빼 야 합 니 다.
그 밖 에 절차 에 많은 세부 사항 이 있 으 니,여기 서 일일이 군말 하지 않 는 다.
난점:
세 문자열 을 동시에 이동 시 키 는 것 같 습 니 다.이것 은 알고리즘 이 므 로 배 웠 으 면 기초 지식 을 기억 하 는 것 처럼 그 를 기억 해 야 한다.원 리 를 깨 달 은 후에 비교적 쉽게 파악 할 수 있다.
설명:
이것 은 간단 한 작은 프로그램 으로 이 프로그램의 똑 같은 효 과 를 실현 하 는 데 여러 가지 방법 이 있 고 저 는 배열 을 대량으로 사용 하여 다양한 데 이 터 를 저장 하고 통계 하 며 사용 합 니 다.사실은 유사 한 효 과 는 단일 체인 표를 통 해 이 루어 질 수 있 습 니 다.현재 내 인식 에서 배열 과 직접 출력 문자열 을 사용 하 는 쓰기 가 간결 하고 명료 하 다 는 장점 이 있다.그러나 효과 적 으로 치 명 적 인 결함 도 생 겼 다.
주의:
컴 파 일 러 때문에 프로그램 중kbhit()와getch()함 수 는 다른 컴 파일 러 에서 컴 파일 하 는 데 오류 가 발생 할 수 있 습 니 다.해결 방법 은 함수 앞의''를 제거 하 는 것 입 니 다.
실행 효과:

코드 구현:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#include <string.h>


void HideCursor();  //    
void gotoxy(int x, int y); //    

#define R 26  //       x     
#define N 20  //    

int ax[3] = { 0 };  //       ,  
int y[3] = { 3,7,11 }; //  y ,  ,        y    
    //                 ,         y       
int i;   //     
int fd[3];   //      

void cshcxhs()    //     
{
 system("title       ");  //  
 system("mode con cols=100 lines=30"); // 100, 30
 HideCursor();    //    

 gotoxy(46, 12);    //      
 printf("    :");
 gotoxy(36, 14);
 printf("w a d     ,       ");
 gotoxy(26, 16);
 printf("       |---0>    ,       >>>>>>    ");
 gotoxy(40, 18);
 printf("     %d     ",N);
 Sleep(2800);

 system("cls");
 
 int k;     //     
 gotoxy(40, R);    //     
 for (k = 0; k < 17; k++)
 printf("_");

 gotoxy(46, R);
 printf("[_O_]");
 gotoxy(48, 25);    //  x:48
 printf("|");

 int j;
 srand((unsigned)time(NULL));  //       
 for (j = 0; j < 3; j++)   //        x  ,      
 {
 ax[j] = rand() % R;
 fd[j] = rand() % 2;
 }

 gotoxy(0, R);
 printf("   :");   //  x  9
}

void hcfjhs()   //      
{
 gotoxy(ax[i], y[i]);  //             

 if (fd[i] == 1)  
 printf("|---0>"); 
 else    
 printf(">>>>>>"); 

 gotoxy(ax[i] - 1, y[i]); //           
 printf(" ");

 ax[i]++;   //         ,            
}

void dhpdxshs()   //    ,       x94     
{
 for (i = 0; i < 3; i++)  //        
 {
 hcfjhs();

 if (ax[i] + 6 >= 94) //            94
 {
  gotoxy(94, y[i]); //          94     
  printf(" ");
  if (ax[i]+6 > 100) //          100,        
  {
  ax[i] = rand() % R; //     R    
  fd[i] = rand() % 2;
  }
 }
 }
}

int da = 2;  //da = 1             ,    
int yip = 0;  //    ,0  ,1,2,3    
int rtde = 1;  //      ,          


int shells_x;  //    
int shells_y;

void ckkzhs()
{
 char ch;
 ch = _getch();

 if (ch == 'd' || ch == 'D')
 {
 gotoxy(49, 25);
 printf("/");  //    
 gotoxy(47, 25);
 printf(" ");
 da = 3;   //    
 }
 if (ch == 'A' || ch == 'a')
 {
 gotoxy(47, 25);
 printf("\\");  //      
 gotoxy(48, 25);
 printf(" ");
 da = 1;   //    
 }
 if (ch == 'W' || ch == 'w')
 {
 gotoxy(48, 25);
 printf("|");  
 gotoxy(47, 25);
 printf(" ");
 gotoxy(49, 25);
 printf(" ");
 da = 2;
 }

 if (ch == ' '&& rtde == 0) //          ,     
 {
 if (da == 2)  //      
  yip = 2;
 
 if (da == 1)  // 
 {
  yip = 1;
  shells_x = 45;  //        
 }
 if (da == 3)  // 
 {
  yip = 3;
  shells_x = 51;
 }
 shells_y = 23;  //        
 }
}

void dpfshs()   //           
{
 rtde = 1;   //  ,            
 if (yip == 2)
 {
 shells_x = 48;
 gotoxy(shells_x, shells_y-=2);
 printf("o");
 gotoxy(shells_x, shells_y+2);
 printf(" ");
 }
 if (yip == 1)
 {
 gotoxy(shells_x-=2, shells_y-=2);
 printf("o");
 gotoxy(shells_x+2, shells_y+2);
 printf(" ");
 }
 if (yip == 3)
 {
 gotoxy(shells_x+=2, shells_y-=2);
 printf("o");
 gotoxy(shells_x-2, shells_y+2);
 printf(" ");
 }

 if (shells_y <= 1)  //    ,    
 {
 yip = 0;  //    ,    
 gotoxy(48, 1);  //   
 printf(" ");
 gotoxy(23, 1);
 printf(" ");
 gotoxy(73, 1);
 printf(" "); 
 rtde = 0;  //    ,    ,        
 }
}

int score;   //  

void pdfsjzhs()  //           
{
 
 for (i = 0; i < 3; i++)
 {
  if (shells_x >= ax[i] && shells_x <= ax[i] + 6 && shells_y == y[i])//   
  {
  if(fd[i]==1)
   score++;   //    ,    
  else
  {
   score--;
   if (score <= 0)
   score = 0;
  }

  rtde = 0;   //   ,    

  gotoxy(ax[i]-1, y[i]);  //   ,           
  printf(" ");

  ax[i] = rand() % R;  //     10    
  fd[i] = rand() % 2;  //        

  gotoxy(shells_x, shells_y); //                  
  printf(" ");

  shells_x = 0, shells_y = 0; //      ,    ,             
  }
 }
 
 gotoxy(9, R);
 printf("%d",score);

 if (score >= N)  //      
 {
 system("cls"); //  
 gotoxy(39,15); 
 printf("    ,    :%d !", N);
 gotoxy(0, 29);
 exit(0);
 }

}

void process()  //  
{
 while (1)
 {
 dhpdxshs();  //      

 if (_kbhit()) 
 {
  ckkzhs(); //    
 }
 
 dpfshs();  //      
 pdfsjzhs();  //           

 Sleep(18);
 }
}

int main()
{
 cshcxhs(); //     

 process(); //  

 return 0;
}

void HideCursor()
{
 CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

void gotoxy(int x, int y)
{
 COORD pos = { x,y };
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
부족 한 점:
나 는 프로그램 에서 비행 기 를 출력 할 때 비행기 꼬리 에서 비행기 전 체 를 직접 출력 하 는 방법 을 사용 했다.이것 은 매우 멍청 하지만 매우 간단 한 방법 이다.이런 방법 으로 인해 비행 기 는 콘 솔 의 최대 폭 을 날 아 가 는 동시에 비행기 기 체 를 하나씩 제거 할 수 없 게 되 었 다.비행기 머리 가 콘 솔 의 최대 폭 을 넘 으 면 프로그램 출력 오류 가 발생 하기 때문에 나 는'비행기 가 한 마디 한 마디 몸 으로 경 계 를 날 아 갈 수 있 도록'라 는 비행 기 를 사라 지게 할 때 자 연 스 러 워 보 이 는 효 과 를 유지 하기 위해 서 이다.마지막 비행기 가 있 는 Y 축의 마지막 6 개의 x 축 칸 을 비행 기 를 가 리 는 판자 로 삼 아 유사 한 효 과 를 실현 할 수 밖 에 없다.
이 프로그램 이 창의 적 인 것 을 제외 하고 모두 본인 이 직접 쓴 것 입 니 다.제 능력 이 유한 하기 때문에 이 프로그램 을 쓰 는 동시에 제 프로그램 에 대량의 코드 재 활용 성,구조 엄밀 성,운영 효율 이 낮은 문제 가 존재 한 다 는 것 을 어렴풋이 느 꼈 습 니 다.또한 많은 함수 와 변 량 식별 자 는 제 가 낙서,중국어 병 음 으로 구 성 된 방법 을 사 용 했 습 니 다.
c 언어 초보 자로 서 저 는 알 수 없 는 지식 에 대해 항상 학습 과 겸손 한 태 도 를 가지 고 있 습 니 다.만약 에 귀 하 는 제 절차 에 대해 재 활용 성,엄밀 성,운영 효율 에 대한 건 의 를 할 수 있다 면 저 는 감사 하 겠 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기