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()함수 입 니 다.이 함 수 를 완전히 이해 하고 익히 면 전체'푸 시 박스'게임 도 매우 간단 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 체인 시계는 뱀을 탐식하는 작은 게임을 실현한다본고의 실례는 여러분에게 C 언어 체인표가 뱀 탐식 게임을 실현하는 구체적인 코드를 공유하여 참고하도록 하였으며, 구체적인 내용은 다음과 같다. 프로젝트 이름: 뱀놀이 운영 환경: Linux 프로그래밍 언어: C 언...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.