#include<stdio.h>
#include<conio.h>//按鍵處理 ,char ch=getch()不顯示的鍵盤輸入
#define MAPFILE "map.txt"
#include<stdlib.h>//系統
void ReadMap(int map[][16], int n);//讀取地圖檔案
void printMap(int map[][16]);//列印地圖
void keyDown(int map[][16]);//人物移動操作
void no(int map[][16]);
int boxs;
void initData(int map[][16])
{
int i, j;
//加載資料時讓用戶等待,一般情況加載資料比較快
printf("游戲加載中,請稍后.........");
//遍歷地圖中的資料
for(i = 0; i < 14; i++)
{
for(j = 0; j < 16; j++)
{
/
//遍歷到箱子,箱子的數目增加。boxs是前面定義的全域變數
if(map[i][j] == 52||map[i][j] == 103)
{
boxs++;
}
}
}
}
int main()
{
int map[14][16];
for(int n=1;n<44;n++)
{
ReadMap(map,n);
initData(map);
while(1)
{
system("cls");//清屏
printMap(map);
keyDown(map);
no(map);
if(boxs==0)
{
break;
}
}
}
system("pause");
}
void no(int map[][16])
{
for(int i = 0; i < 14; i++)
{
for(int j = 0; j < 16; j++)
{
//遍歷到2(人)時,記錄人的坐標。x, y是前面定義的全域變數
//遍歷到3時,箱子的數目增加。boxs是前面定義的全域變數
if(map[i][j] == 103)
{
boxs--;
}
}
}
}
void ReadMap(int map[][16], int n)
{
FILE *fp; //檔案指標
int i,j;
int step;
fp = fopen(MAPFILE, "r");
if (fp == NULL)
{
printf("打開地圖檔案錯誤!\n");
exit(1);
}
if (n<10) //1-9關
step = 257 * (n - 1) + 5;
else //10關以后
step = 257 * 9 + 258 * (n - 10) + 6;
fseek(fp, step, SEEK_SET); //定位檔案指標
for (i = 0; i<14; i++)
{
for (j = 0; j<16; j++)
{
map[i][j] = fgetc(fp);
}
fgetc(fp); //get 10
}
fclose(fp);
}
//列印地圖
void printMap(int map[][16])
{
int i,j;
for (i = 0; i<14; i++)
{
for (j = 0; j<16; j++)
{
switch (map[i][j])
{
case '0': //空地
printf(" ");
break;
case '1': //墻
printf("@");
break;
case '2': //內部空地
case 0:
printf(" ");
break;
case '3': //目的地
printf("×");
break;
case '4': //箱子
case 'f':
printf("&");
break;
case 'g': //箱子推到目的地后顯示
printf("#");
break;
case '6': //小人
case 'h':
case 'i':
printf("¥");
break;
}
}
printf("\n");
}
}
//人物移動
void keyDown(int map[][16])
{ //先確定人的位置
int i,j;
for(i=0;i<14;i++)
{
for(j=0;j<16;j++)
{
if(map[i][j]==54||map[i][j]==104||map[i][j]==105)
{
break;
}
}
if(map[i][j]==54||map[i][j]==104||map[i][j]==105)
{
break;
}
}
//方向鍵,移動人物
char key=getch();
switch(key)
{
case 'g'://向上
case 71:
if(map[i-1][j]==50||map[i-1][j]==51||map[i-1][j]==0)
{
map[i-1][j]+=54;
map[i][j]-=54;
}
else if(map[i-1][j]==103||map[i-1][j]==52||map[i-1][j]==102)
{
if(map[i-2][j]==50||map[i-2][j]==51||map[i-2][j]==0)
{
map[i][j]-=54;
map[i-1][j]+=2;
map[i-2][j]+=52;
}
}
break;
case 'b'://向下
case 66:
if(map[i+1][j]==50||map[i+1][j]==51||map[i+1][j]==0)
{
map[i+1][j]+=54;
map[i][j]-=54;
}
else if(map[i+1][j]==103||map[i+1][j]==52||map[i+1][j]==102)
{
if(map[i+2][j]==50||map[i+2][j]==51||map[i+2][j]==0)
{
map[i][j]-=54;
map[i+1][j]+=2;
map[i+2][j]+=52;
}
}
break;
case 'v'://向左
case 86:
if(map[i][j-1]==50||map[i][j-1]==51||map[i][j-1]==0)
{
map[i][j-1]+=54;
map[i][j]-=54;
}
else if(map[i][j-1]==103||map[i][j-1]==52||map[i][j-1]==102)
{
if(map[i][j-2]==50||map[i][j-2]==51||map[i][j-2]==0)
{
map[i][j]-=54;
map[i][j-1]+=2;
map[i][j-2]+=52;
}
}
break;
case 'n'://向右
case 78:
if(map[i][j+1]==50||map[i][j+1]==51||map[i][j+1]==0)
{
map[i][j+1]+=54;
map[i][j]-=54;
}
else if(map[i][j+1]==103||map[i][j+1]==52||map[i][j+1]==102)
{
if(map[i][j+2]==50||map[i][j+2]==51||map[i][j+2]==0)
{
map[i][j]-=54;
map[i][j+1]+=2;
map[i][j+2]+=52;
}
}
break;
}
}
map.txt檔案中的東西,我先貼了3關
[1]
0000000000000000
0000000000000000
0000000000000000
0000011100000000
0000013100000000
0000012111100000
0001114243100000
0001324611100000
0001111410000000
0000001310000000
0000001110000000
0000000000000000
0000000000000000
0000000000000000
[2]
0000000000000000
0000000000000000
0001111100000000
0001622100000000
0001244101110000
0001242101310000
0001112111310000
0000112222310000
0000122212210000
0000122211110000
0000111110000000
0000000000000000
0000000000000000
0000000000000000
[3]
0000000000000000
0000000000000000
0000000000000000
0000111111100000
0000122222111000
0001141112221000
0001262422421000
0001233124211000
0001133122210000
0000111111110000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/104403.html
標籤:C語言
