C 언어 는 간단 한 푸 시 박스 게임 을 실현 합 니 다.

C 언어 를 사용 하여 아주 간단 한 푸 시 게임 을 실현 합 니 다.참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
이 글 을 열 어 주 셔 서 감사합니다.
또한 이 프로그램 에 맞 게 간단 하고 전용 푸 시 박스 지도 편집기 로 16*16 대 지도 조건 에서 도 지 도 를 쉽게 편집 할 수 있 습 니 다.
링크:지도 편집기
이 프로그램 은 지도 파일 이 감지 되 지 않 은 상태 에서 도 혼자 실행 할 수 있 습 니 다!코드 에 푸 시 박스 게임 의 첫 번 째 관문 의 표준 지 도 를 저장 하여 지도 파일 이 없 는 상태 에서 도 전체 프로그램의 절 차 를 익 힐 수 있 습 니 다!
물론 지도 파일 이 있 으 면 더 좋 은 게임 체험 을 할 수 있 으 니 스스로 편집 하 세 요.
잔말 말고!
다음은 기술 부분 에 들 어 갑 니 다.
C 언어 판 다기 능 푸 시 박스
컴 파일 환경:Windows VS 2019
다른 컴 파일 러 는 다음 의'주의사항'을 통 해 코드 를 다른 플랫폼 에서 정상 적 인 버 전 으로 수정 할 수 있 습 니 다.
필요:
캐릭터 를 제어 하여 상 자 를 목표 중 으로 밀어 목표 가 모두 완성 하여 다음 관문 에 진입 합 니 다.
생각:
2 차원 배열 을 사용 하여 서로 다른 숫자 를 저장 하고 숫자 는 지도 에 있 는 모든 요 소 를 포함 하 며 버튼 을 누 르 면 인물 이 상 자 를 밀어 내 는 작업 을 완성 하고 관문 안의 모든 목 표를 달성 하면 자동 으로 다음 관문 에 들어간다.
방법:
주요 논리 이동 푸 시 박스 부분:방향 버튼 을 누 른 후 이중 순환 으로 인물 을 찾 아 이동 방향 에 따라 인물,인물 앞,상자,상자 앞 4 대 기초 정 보 를 저장 하고 전방 배열 값 이 벽,목표 인지 판단 하여 인물 이동 과 상자 이동 작업 을 한다.
구체 적 이 고 상세 한 방법 은 일일이 볼 수 있 도록 코드 주석 에 정리 되 어 있 습 니 다.
지식 포인트 에 사용:
순환,2 차원 배열,파일 읽 기
난점:
인물 과 상자 가 이동 하 는 동시에 인물 이 미 완성 목표 로 이동 하거나 이미 완 성 된 목표,상자 가 이미 완 성 된 목표 로 이동 한 상황 에 주의해 야 한다.이런 상황 은 인물/상자 가 떠 난 후에 제자리 에서 다시 원소 로 변 하 는 것 을 판단 해 야 한다.
설명:
프로그램 앞부분 에 파일 이 감지 되 지 않 은 상황 논리 와 관문 선택 논 리 를 쓰 는 데 사용 되 는 코드 가 많 습 니 다.핵심 코드 를 직접 보 려 면 operation()으로 이동 하 십시오.캐릭터 함수 와 gbszszhs(char ch)를 조작 합 니 다.2 차원 배열 함 수 를 수정 하 다.
주의:
컴 파 일 러 때문에 프로그램 중kbhit()와getch()함 수 는 다른 컴 파일 러 에서 컴 파일 하 는 데 오류 가 발생 할 수 있 습 니 다.해결 방법 은 함수 앞의''를 제거 하 는 것 입 니 다.
동시에 파일 을 열 함수 fopens(&fp, FLPA, “r”);fp=fopen(FLPA,"r")으로 변경 하기;
fcanf_s fcanf 로 변경 scanf_s()scanf 로 변경
실행 효과:
메뉴 선택:

게임 진행:

코드 구현:

#include <stdio.h>
#include <windows.h>
#include <conio.h>


//0    ,1   ,2        ,3    ,4    ,5         ,
//6              ,7              ,8               

#define WH 16  //     
#define BYT 529  //                       ,          ,      BYT    
#define FLPA "C:\\Users\\ASUS\\Desktop\\     .txt" //                     !!
        //               

//  :                 !

#define INITMAP      \
 int mapch_init[WH][WH] = {    \
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 {0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, \
 {0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0}, \
 {0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0}, \
 {0, 0, 0, 0, 1, 1, 1, 3, 0, 3, 2, 1, 0, 0, 0, 0}, \
 {0, 0, 0, 0, 1, 2, 0, 3, 4, 1, 1, 1, 0, 0, 0, 0}, \
 {0, 0, 0, 0, 1, 1, 1, 1, 3, 1, 0, 0, 0, 0, 0, 0}, \
 {0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0}, \
 {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0}, \
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \
};

int mapch[WH][WH];

//              ,     
void HideCursor(); //    
void gotoxy(int x, int y);//    
void scmbxyhs(); //            
void wjzdwjzjjrqk(); //              
int gkxzhs();  //      
void cwjzjrwkdhs(); //           
void gnxzjm();  //     
void cshhs();  //     

void tranmap();  //       
void detection(); //              
void gktgszxhs(); //        ,       
void operation(); //        ***
void gbszszhs(char ch); //        
int updatetime(); //           
void process();  //    

int main()
{
 cshhs();  //     

 process();  //    

 return 0;
}

//         
void scmbxyhs()  //          
{
 gotoxy(34, 17);  
 printf("       :");
 gotoxy(34, 19);
 printf("      :");
 gotoxy(32, 21);
 printf("          !");
 gotoxy(49, 19);
 printf("0"); //       0
}

void wjzdwjzjjrqk() //              
{
 system("cls");
 printf("       ,
"); INITMAP // for (int i = 0; i < WH; i ) // for (int j = 0; j < WH; j ) // mapch[i][j] = mapch_init[i][j]; Sleep(2000); // system("cls"); // tranmap(); // detection(); // scmbxyhs(); // } int n = 1; // ** int maxn = 0; // int dczdgshs() // { FILE* fp = NULL; // , maxn fopen_s(&fp, FLPA, "r"); if (fp == NULL) { wjzdwjzjjrqk(); // return 0; } int temp = 0; // rewind(fp); // while (!feof(fp)) // { fgetc(fp); // , temp ; // , } fclose(fp); // maxn = temp / BYT 1; // return 1; } int gkxzhs() // { system("cls"); // gotoxy(26, 8); printf(" :( )"); if (!dczdgshs()) // , 0 , return 0; gotoxy(36, 10); printf(" 1- %d ", maxn);// srgk: // gotoxy(41, 12); scanf_s("%d", &n); if (n<1 || n>maxn) // { gotoxy(36, 12); printf(" "); gotoxy(33, 11); printf(" "); goto srgk; // } return 1; // 1 } void cwjzjrwkdhs() // , { // n 1 FILE* fp = NULL; fopen_s(&fp, FLPA, "rb"); if (fp == NULL) { wjzdwjzjjrqk(); // return; // } // , n // , ,n 1 int skip = (n - 1) * BYT; // n 512 fseek(fp, skip, 0); // skip int i, j; for (i = 0; i < WH; i ) // 512 { for (j = 0; j < WH; j ) { fscanf_s(fp, "%d ", &mapch[i][j]);// , mapch printf("%d ", mapch[i][j]); } printf("
"); } fclose(fp); // , system("cls"); } void gnxzjm() // { system("cls"); gotoxy(39, 8); printf(" "); gotoxy(34, 10); printf(" 1 "); gotoxy(34, 12); printf(" 2 "); gotoxy(34, 14); printf(" 3 "); Head: // gotoxy(34, 17); char chn=_getch(); // if (chn == '3') { system("cls"); // gotoxy(34, 12); printf(" "); Sleep(2000); gotoxy(0, 24); exit(0); // } else if (chn == '2') { if (!gkxzhs()) // return; // 0 , // 1 } else if (chn == '1') n = 1; // , else { gotoxy(34, 16); printf(" :"); goto Head; // , } // 1 : cwjzjrwkdhs(); // detection(); // tranmap(); // scmbxyhs(); // } int detunf;// , , , void detection() // { //detunf detunf = 0; // 0 int i, j; for (i = 0; i < WH; i ) for (j = 0; j < WH; j ) if (mapch[i][j] == 2) detunf ; gotoxy(50,17); // printf("%d", detunf); } void cshhs() // { system("title ");// system("mode con cols=84 lines=26");// , , 32 16 gnxzjm(); // HideCursor(); // dczdgshs(); // } // void tranmap() // { gotoxy(26, 1); // , int i, j; for (i = 0; i < WH; i ) { for (j = 0; j < WH; j ) { if (mapch[i][j] == 1) printf("■"); else if (mapch[i][j] == 2) printf("★"); else if (mapch[i][j] == 3 || mapch[i][j] == 8) printf("●"); else if (mapch[i][j] == 4 || mapch[i][j] == 6 || mapch[i][j] == 7) printf("♀"); else if (mapch[i][j] == 5) printf("--"); else printf(" "); } gotoxy(26, i 1); // y y , } } int opnum; // int time; int time_2; void gktgszxhs() // , { if (detunf == 0) // 0 { n ; // if (n > maxn) // n { tranmap(); // gotoxy(26, 22); printf(" ,3 !"); Sleep(3000); // opnum = 0, time = updatetime(),time_2 = 0;// , 0, ,\ time_2 - gnxzjm(); // } else { tranmap(); // Sleep(2000); // cwjzjrwkdhs(); // 0 , detection(); // scmbxyhs(); // opnum = 0, time = updatetime(),time_2 = 0;// 297 // } } } int i, j; // int box_x, box_y; // int boxnext_x, boxnext_y; // int peonext_x, peonext_y; // void gbszszhs(char ch) // ** { for (i = 0; i < WH; i ) // i y ,j x { for (j = 0; j < WH; j ) { if (mapch[i][j] == 4 || mapch[i][j] == 6 || mapch[i][j] == 7) // { if (ch == 'w') // 、 、 { box_y = i - 1; box_x = j; // boxnext_y = i - 2; boxnext_x = j; // peonext_y = i - 1; peonext_x = j; // } else if (ch == 'a') { box_y = i; box_x = j - 1; boxnext_y = i; boxnext_x = j - 2; peonext_y = i; peonext_x = j - 1; } else if (ch == 's') { box_y = i 1; box_x = j; boxnext_y = i 2; boxnext_x = j; peonext_y = i 1; peonext_x = j; } else if (ch == 'd') { box_y = i; box_x = j 1; boxnext_y = i; boxnext_x = j 2; peonext_y = i; peonext_x = j 1; } // if (mapch[box_y][box_x] == 3 || mapch[box_y][box_x] == 8) // if (mapch[boxnext_y][boxnext_x] == 1 || mapch[boxnext_y][boxnext_x] == 3 || mapch[boxnext_y][boxnext_x] == 8) return; // if (mapch[box_y][box_x] == 1) // return; // opnum ; // , gotoxy(49, 19); printf("%d", opnum);// // if (mapch[box_y][box_x] == 3 || mapch[box_y][box_x] == 8) // { // : if (mapch[box_y][box_x] == 3) // mapch[box_y][box_x] = 0; // else if (mapch[box_y][box_x] == 8) // mapch[box_y][box_x] = 5; // // : if (mapch[boxnext_y][boxnext_x] == 2) // { mapch[boxnext_y][boxnext_x] = 5; // detunf--; // 1 gotoxy(50, 17); // printf("%d", detunf); } else if (mapch[boxnext_y][boxnext_x] == 0) // mapch[boxnext_y][boxnext_x] = 3; // else if (mapch[boxnext_y][boxnext_x] == 5) // mapch[boxnext_y][boxnext_x] = 8; // } // if (mapch[i][j] == 6) mapch[i][j] = 2; // 2 else if (mapch[i][j] == 7) mapch[i][j] = 5; // 5 else if (mapch[i][j] == 4) mapch[i][j] = 0; // 4 // if (mapch[peonext_y][peonext_x] == 0 || mapch[peonext_y][peonext_y] == 3)// mapch[peonext_y][peonext_x] = 4; // if (mapch[peonext_y][peonext_x] == 2) // mapch[peonext_y][peonext_x] = 6; // if (mapch[peonext_y][peonext_x] == 5) // mapch[peonext_y][peonext_x] = 7; // if (mapch[peonext_y][peonext_x] == 8) // mapch[peonext_y][peonext_x] = 7; // goto L1; // , } } } L1: // gktgszxhs(); // } void operation() // { char ch = _getch(); // _getch() switch (ch) { case 'w': // gbszszhs(ch); // , break; case 'a': gbszszhs(ch); break; case 's': gbszszhs(ch); break; case 'd': gbszszhs(ch); break; } tranmap(); // } int updatetime() // { int now; SYSTEMTIME system_time; GetLocalTime(&system_time); now = system_time.wMinute * 60 system_time.wSecond; return now; } void process() // { time = updatetime(); // while (1) { time_2 = updatetime() - time; // time_2, gotoxy(39, 21); printf("%d s", time_2); // if(_kbhit()) operation(); // 、 Sleep(20); // } } void gotoxy(int x, int y) // { COORD pos = { x,y }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } void HideCursor() // { CONSOLE_CURSOR_INFO cursor_info = { 1, 0 }; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); }
주요 함수:gbszszhs()안의 논 리 는 비교적 복잡 하 다.나 는 당시 에 이 코드 를 쓸 때 도 여러 번 반복 적 으로 수정 하고 심지어 뒤 집 고 다시 해 야 이런 논 리 를 잘 이해 할 수 있다.
만약 프로그램 코드 주석 에 제 가 명확 하 게 쓰 지 못 한 부분 이 있다 면,댓 글 아래 에 댓 글 을 달 아 문의 하 시 는 것 을 환영 합 니 다.만약 제 가 본다 면 최선 을 다 해 당신 의 의혹 을 풀 어드 리 겠 습 니 다.
부족 한 점:
지 도 는 화면 에 표시 할 때 오류 가 발생 하기 쉬 우 므 로 닫 힌 글자 수 를 조정 해 야 합 니 다.원인 은 명확 하지 않다.
저 자 는 C 언어 에 대한 학습 이 아직 얕 기 때문에 코드 가 게임 을 초기 화 하 는 두 가지 모드(파일 이 있 고 파일 이 없 음)까지 쓸 때 생각 이 혼 란 스 러 워 코드 가 이 부분 에 많은 결함 이 있 지만 최종 프로그램의 효 과 는 나 왔 다.
그러나 전체 코드 에 있어 서 가장 중요 한 부분 은 gbszszhs()함수 입 니 다.이 함 수 를 완전히 이해 하고 익히 면 전체'푸 시 박스'게임 도 매우 간단 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기