問我是怎么做的。我一直想把這個(gè)程序的整個(gè)過程寫一份詳細(xì)的東西,與各位編程愛好者分享,一直沒空。正好現(xiàn)在放假了,而且離回家還有幾天。于是我就把這個(gè)程序重新寫了一遍,盡量使程序的結(jié)構(gòu)比較清晰好懂一些。同時(shí)寫了下面的這份東西。
//此小游戲使用C語(yǔ)言編寫,編譯環(huán)境VS2008
#include
#include
#include
int i,j;
void draw_map(int map[10][12]); //聲明畫圖函數(shù)
int main()
{
char input;
int count=0; //定義記分變量
/*下面定義一個(gè)二維數(shù)組,其中的元素是不同圖像的ID號(hào),在后面的函數(shù)中將講解不同數(shù)字分別代表的圖像元素*/
int map[10][12] = {
{2,2,2,2,2,1,1,1,1,1,2,2},
{1,1,1,1,2,1,0,0,0,1,1,2},
{1,0,0,1,1,1,0,1,0,0,1,2},
{1,0,4,3,3,3,3,3,1,0,1,1},
{1,0,0,1,1,3,3,3,4,0,0,1},
{1,0,0,0,0,4,1,1,4,1,0,1},
{1,0,4,1,4,0,0,0,4,0,0,1},
{1,1,0,6,0,1,1,1,4,1,0,1},
{2,1,1,1,1,1,2,1,0,0,0,1},
{2,2,2,2,2,2,2,1,1,1,1,1}
};
while (1) //死循環(huán),等待用戶命令
{
system('CLS');
for (i=0;i<>
{
printf('%d',i);
}
printf('\n');
/*for (i=1;i<>
{
printf('%d\n',i);
}*/
printf('\n');
draw_map(map);
printf('當(dāng)前得分:%d\n',count);
//找初始位置
for (i=0;i<>
{
for (j=0;j<>
{
if (map[i][j]==6||map[i][j]==9)
break;
}
if (map[i][j]==6||map[i][j]==9)
break;
}
printf('您的當(dāng)前坐標(biāo)(%d,%d)',i,j);
input = getch(); //用getch()函數(shù)無需回車確認(rèn)地獲取用戶輸入,用于控制行走方向。
switch (input)
{
case'w':
//如果人前面是空地。 //0代表空地 6代表人 //3代表目的地
if(map[i-1][j]==0)
{
map[i-1][j]=6+0; //人往前走一步,ID為人的ID()加上空地的ID()。
if(map[i][j]==9) //如果當(dāng)前人站的位置為目的地,則ID為(即人的ID()加上目的地ID())。
map[i][j]=3; //將人往前走一步后原地的ID修改為空地ID()。
else
map[i][j]=0; //否則原地ID修改為空地ID 。
}
//如果人前面是目的地。
elseif((map[i-1][j]==3)||(map[i-1][j]==9))
{
map[i-1][j]=6+3; //人往前走一步,ID為人ID+目的地ID=9。
if(map[i][j]==9) //如果原地也是目的地(ID為)。
map[i][j]=3; //人走后把原地ID修改回目的地ID。
else
map[i][j]=0; //否則原地ID修改為為空地ID
}
//如果人前面是箱子。//4代表箱子 //7箱子進(jìn)入目的地
elseif(map[i-1][j]==4)
{
//如果人前面是箱子,而箱子前面是空地。
if (map[i-2][j]==0)
{
map[i-2][j]=4; //人推箱子往前走一步,把空地ID修改為箱子ID()
//下面是對(duì)箱子原地進(jìn)行判斷
if(map[i-1][j]==7) //如果箱子原地為目的地。
map[i-1][j]=9; //人站在箱子的原地(目的地)時(shí)該地ID應(yīng)該為人的ID+目的地ID=9。
else
map[i-1][j]=6; //否則,人站在了原來的空地上,ID應(yīng)該為+0=6。
//下面是對(duì)人原地進(jìn)行判斷
if(map[i][j]==9) //如果之前是目的地。
map[i][j]=3; //人走了之后修改回目的地ID。
else
map[i][j]=0; //否則就是空地。
}
//如果人的前面是箱子,而箱子前面是目的地。
elseif (map[i-2][j]==3)
{
map[i-2][j]=7; //ID為(目的地ID()+箱子ID()=7),表示已經(jīng)把箱子推入了目的地。
count++;
//下面是對(duì)箱子原先位置的判斷,同上。
if(map[i-1][j]==7)
map[i-1][j]=9;
else
map[i-1][j]=6;
//下面是對(duì)人原先位置進(jìn)行判斷,同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子(ID=7)。
elseif(map[i-1][j]==7)
{
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子,而箱子前面是空地。
if(map[i-2][j]==0)
{
count--;
map[i-2][j]=4; //把箱子重新推到空地上,ID=箱子ID+空地ID=4。
map[i-1][j]=9; //人自然而然的就站在了原先的目的地上了。
//下面是對(duì)人原先地進(jìn)行判斷,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子,而箱子前面是另一目的地。
if(map[i-2][j]==3)
{
map[i-2][j]=7; //把箱子推入了另一目的地,自然,ID也應(yīng)是。
map[i-1][j]=9; //人站在了目的地上。
//下面是對(duì)人原先站立地進(jìn)行判斷,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
break;
case's':
//如果人前面是空地。
if(map[i+1][j]==0)
{
map[i+1][j]=6+0; //人往前走一步,ID為人的ID()加上空地的ID()。
if(map[i][j]==9) //如果當(dāng)前人站的位置為目的地,則ID為(即人的ID()加上目的地ID())。
map[i][j]=3; //將人往前走一步后原地的ID修改為空地ID()。
else
map[i][j]=0; //否則原地ID修改為空地ID 。
}
//如果人前面是目的地。
elseif(map[i+1][j]==3)
{
map[i+1][j]=6+3; //人往前走一步,ID為人ID+目的地ID=9。
if(map[i][j]==9) //如果原地也是目的地(ID為)。
map[i][j]=3; //人走后把原地ID修改回目的地ID。
else
map[i][j]=0; //否則原地ID修改為為空地ID
}
//如果人前面是箱子。
elseif(map[i+1][j]==4)
{
//如果人前面是箱子,而箱子前面是空地。
if (map[i+2][j]==0)
{
map[i+2][j]=4; //人推箱子往前走一步,把空地ID修改為箱子ID()
//下面是對(duì)箱子原地進(jìn)行判斷
if(map[i+1][j]==7) //如果箱子原地為目的地。
map[i+1][j]=9; //人站在箱子的原地(目的地)時(shí)該地ID應(yīng)該為人的ID+目的地ID=9。
else
map[i+1][j]=6; //否則,人站在了原來的空地上,ID應(yīng)該為+0=6。
//下面是對(duì)人原地進(jìn)行判斷
if(map[i][j]==9) //如果之前是目的地。
map[i][j]=3; //人走了之后修改回目的地ID。
else
map[i][j]=0; //否則就是空地。 (加群: 571545210 學(xué)習(xí)編程,在群里獲得更多的學(xué)習(xí)資料)
}
//如果人的前面是箱子,而箱子前面是目的地。
elseif (map[i+2][j]==3)
{
map[i-2][j]=7; //ID為(目的地ID()+箱子ID()=7),表示已經(jīng)把箱子推入了目的地。
count++;
//下面是對(duì)箱子原先位置的判斷,同上。
if(map[i+1][j]==7)
map[i+1][j]=9;
else
map[i+1][j]=6;
//下面是對(duì)人原先位置進(jìn)行判斷,同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子(ID=7)。
elseif(map[i+1][j]==7)
{
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子,而箱子前面是空地。
if(map[i+2][j]==0)
{
count--;
map[i+2][j]=4; //把箱子重新推到空地上,ID=箱子ID+空地ID=4。
map[i+1][j]=9; //人自然而然的就站在了原先的目的地上了。
//下面是對(duì)人原先地進(jìn)行判斷,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子,而箱子前面是另一目的地。
if(map[i+2][j]==3)
{
map[i+2][j]=7; //把箱子推入了另一目的地,自然,ID也應(yīng)是。
map[i+1][j]=9; //人站在了目的地上。
//下面是對(duì)人原先站立地進(jìn)行判斷,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
break;
case'a':
//如果人前面是空地。
if(map[i][j-1]==0)
{
map[i][j-1]=6+0; //人往前走一步,ID為人的ID()加上空地的ID()。
if(map[i][j]==9) //如果當(dāng)前人站的位置為目的地,則ID為(即人的ID()加上目的地ID())。
map[i][j]=3; //將人往前走一步后原地的ID修改為空地ID()。
else
map[i][j]=0; //否則原地ID修改為空地ID 。
}
//如果人前面是目的地。
elseif(map[i][j-1]==3)
{
map[i][j-1]=6+3; //人往前走一步,ID為人ID+目的地ID=9。
if(map[i][j]==9) //如果原地也是目的地(ID為)。
map[i][j]=3; //人走后把原地ID修改回目的地ID。
else
map[i][j]=0; //否則原地ID修改為為空地ID
}
//如果人前面是箱子。
elseif(map[i][j-1]==4)
{
//如果人前面是箱子,而箱子前面是空地。
if (map[i][j-2]==0)
{
map[i][j-2]=4; //人推箱子往前走一步,把空地ID修改為箱子ID()
//下面是對(duì)箱子原地進(jìn)行判斷
if(map[i][j-1]==7) //如果箱子原地為目的地。
map[i][j-1]=9; //人站在箱子的原地(目的地)時(shí)該地ID應(yīng)該為人的ID+目的地ID=9。
else
map[i][j-1]=6; //否則,人站在了原來的空地上,ID應(yīng)該為+0=6。
//下面是對(duì)人原地進(jìn)行判斷
if(map[i][j]==9) //如果之前是目的地。
map[i][j]=3; //人走了之后修改回目的地ID。
else
map[i][j]=0; //否則就是空地。
}
//如果人的前面是箱子,而箱子前面是目的地。
elseif (map[i][j-2]==3)
{
count++;
map[i][j-2]=7; //ID為(目的地ID()+箱子ID()=7),表示已經(jīng)把箱子推入了目的地。
//下面是對(duì)箱子原先位置的判斷,同上。
if(map[i][j-1]==7)
map[i][j-1]=9;
else
map[i][j-1]=6;
//下面是對(duì)人原先位置進(jìn)行判斷,同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子(ID=7)。
elseif(map[i][j-1]==7)
{
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子,而箱子前面是空地。
if(map[i][j-2]==0)
{
count--;
map[i][j-2]=4; //把箱子重新推到空地上,ID=箱子ID+空地ID=4。
map[i][j-1]=9; //人自然而然的就站在了原先的目的地上了。
//下面是對(duì)人原先地進(jìn)行判斷,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子,而箱子前面是另一目的地。
if(map[i][j-2]==3)
{
map[i][j-2]=7; //把箱子推入了另一目的地,自然,ID也應(yīng)是。
map[i][j-1]=9; //人站在了目的地上。
//下面是對(duì)人原先站立地進(jìn)行判斷,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
break;
case'd':
//如果人前面是空地。
if(map[i][j+1]==0)
{
map[i][j+1]=6+0; //人往前走一步,ID為人的ID()加上空地的ID()。
if(map[i][j]==9) //如果當(dāng)前人站的位置為目的地,則ID為(即人的ID()加上目的地ID())。
map[i][j]=3; //將人往前走一步后原地的ID修改為空地ID()。
else
map[i][j]=0; //否則原地ID修改為空地ID 。
}
//如果人前面是目的地。
elseif(map[i][j+1]==3)
{
map[i][j+1]=6+3; //人往前走一步,ID為人ID+目的地ID=9。
if(map[i][j]==9) //如果原地也是目的地(ID為)。
map[i][j]=3; //人走后把原地ID修改回目的地ID。
else
map[i][j]=0; //否則原地ID修改為為空地ID
}
//如果人前面是箱子。
elseif(map[i][j+1]==4)
{
//如果人前面是箱子,而箱子前面是空地。
if (map[i][j+2]==0)
{
map[i][j+2]=4; //人推箱子往前走一步,把空地ID修改為箱子ID()
//下面是對(duì)箱子原地進(jìn)行判斷
if(map[i][j+1]==7) //如果箱子原地為目的地。
map[i][j+1]=9; //人站在箱子的原地(目的地)時(shí)該地ID應(yīng)該為人的ID+目的地ID=9。
else
map[i][j+1]=6; //否則,人站在了原來的空地上,ID應(yīng)該為+0=6。
//下面是對(duì)人原地進(jìn)行判斷
if(map[i][j]==9) //如果之前是目的地。
map[i][j]=3; //人走了之后修改回目的地ID。
else
map[i][j]=0; //否則就是空地。
}
//如果人的前面是箱子,而箱子前面是目的地。
elseif (map[i][j+2]==3)
{
count++;
map[i][j+2]=7; //ID為(目的地ID()+箱子ID()=7),表示已經(jīng)把箱子推入了目的地。
//下面是對(duì)箱子原先位置的判斷,同上。
if(map[i][j+1]==7)
map[i][j+1]=9;
else
map[i][j+1]=6;
//下面是對(duì)人原先位置進(jìn)行判斷,同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子(ID=7)。
elseif(map[i][j+1]==7)
{
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子,而箱子前面是空地。
if(map[i][j+2]==0)
{
count--;
map[i][j+2]=4; //把箱子重新推到空地上,ID=箱子ID+空地ID=4。
map[i][j+1]=9; //人自然而然的就站在了原先的目的地上了。
//下面是對(duì)人原先地進(jìn)行判斷,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
//如果人前面是已經(jīng)進(jìn)入某目的地的箱子,而箱子前面是另一目的地。
if(map[i][j+2]==3)
{
map[i][j+2]=7; //把箱子推入了另一目的地,自然,ID也應(yīng)是。
map[i][j+1]=9; //人站在了目的地上。
//下面是對(duì)人原先站立地進(jìn)行判斷,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
break;
}
if(count==8) //如果分?jǐn)?shù)達(dá)到分
{
system('CLS'); //清屏
draw_map(map);
break; //退出死循環(huán)
}
}
printf('\n恭喜你,過關(guān)了??!\n'); //過關(guān)提示
return 0;
}
void draw_map(int map[10][12])
{
for(i=0;i<>
{
for(j=0;j<>
{
switch(map[i][j])
{
case 0:
printf(' '); //數(shù)字代表道路
break;
case 1:
printf('#'); //數(shù)字代表墻壁
break;
case 2:
printf(' '); //數(shù)字是游戲邊框的空白部分
break;
case 3:
printf('!'); //數(shù)字代表目的地
break;
case 4:
printf('*'); //數(shù)字代表箱子
break;
case 7:
printf('$'); //數(shù)字代表箱子進(jìn)入目的地
break;
case 6:
printf('@'); //數(shù)字代表人
break;
case 9:
printf('@'); //數(shù)字代表人進(jìn)入目的地
break;
}
}
printf('\n'); //分行輸出
}
}
(加群: 571545210 學(xué)習(xí)編程,在群里獲得更多的學(xué)習(xí)資料)