C語言07 小游戲設計——走迷宮
目標:
我們要設計一個完整的小游戲“走迷宮”遣铝。你將可以通過控制鍵盤上的“W”佑刷、“S”、“A”酿炸、“D” 4個鍵來控制1個“小球”進行上瘫絮、下、左填硕、右麦萤,而你的目的就是讓這個“小球”從起點走出迷宮。來看看這個迷宮吧扁眯。
準備知識:
請看C語言筆記06
開始
Step 01:制造一個迷宮:
char a[15][30]={
"#######################",
"#O ## ### #",
"# # ## # # #",
"# ## # # ## #",
"# ### ## ### ########",
"# ### ## #### ",
"# ###### ## ## ###",
"# # # ## # ## #",
"## #### #### # ### ",
"#######################",
}
Step 02:將迷宮輸出到屏幕上:
char a[15][30]={
"#######################",
"#O ## ### #",
"# # ## # # #",
"# ## # # ## #",
"# ### ## ### ########",
"# ### ## #### ",
"# ###### ## ## ###",
"# # # ## # ## #",
"## #### #### # ### ",
"#######################",
}
for(i=0;i<=9;i++)
puts(a[i]); // 打印i行所有內容
Step 03:儲存小球初始位置和迷宮的出口位置:
char a[15][30]={
"#######################",
"#O ## ### #",
"# # ## # # #",
"# ## # # ## #",
"# ### ## ### ########",
"# ### ## #### ",
"# ###### ## ## ###",
"# # # ## # ## #",
"## #### #### # ### ",
"#######################",
}
int i,x,y,p,q;
x=1;y=1;p=5;q=22;
for(i=0;i<=9;i++)
puts(a[i]);
Sleep(5000); // 走出迷宮后5秒自動關閉程序壮莹,而用system("pause");的話就不會自動關閉,自己選擇用哪個姻檀。
Step 04:實現(xiàn)用WSAD控制小球:
Step 04-01:讓程序識別S鍵命满。
我們先來控制小球向下走,實現(xiàn)當我們按一下S绣版,小球就向下走1步胶台。
那么如何獲得“S”這個鍵呢?換句話說就是當按下“S”時杂抽,程序能夠識別你按下的是這個鍵概作。我們知道它的本質是一個字符,所以計算機只要讀取到這個字符就行了默怨,而計算機讀取字符有下面4種方法:
scanf("%c",&ch);
ch=getchar();
ch=getche();
ch=getch();
他們的區(qū)別我們在C語言筆記06中講過,這里不再說讯榕;因為我們不需要顯示輸入的字符,所以我們這里選擇getch()函數(shù)匙睹。
Step 04-02:實現(xiàn)按S鍵就識別墻體并且下移1單位愚屁。
我們需要用到2個if語句嵌套:
if(ch=='s')
{
if(a[x+1][y]!='#')
{
a[x][y]=' '; // 實現(xiàn)“原小球消失”
x++;
a[x][y]='O'; // 實現(xiàn)“小球出現(xiàn)在新位置”
}
}
這段代碼中,我們用if語句判斷是否是s字符痕檬,如果是則繼續(xù)判斷下一步是否是墻體“#”霎槐,如果不是,則小球往下移動一格梦谜,是則不執(zhí)行其他命令丘跌。
因為小球的位置有了變化袭景,我們還需要將新迷宮的狀態(tài)打印一次。在打印之前記得要將之前屏幕清屏闭树,代碼如下:
system("cls");
for(i=0;i<=5;i++)
puts(a[i]);
到這里我們小結一下:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
char a[15][30]={
"#######################",
"#O ## ### #",
"# # ## # # #",
"# ## # # ## #",
"# ### ## ### ########",
"# ### ## #### ",
"# ###### ## ## ###",
"# # # ## # ## #",
"## #### #### # ### ",
"#######################",
};
int i,x,y,p,q;
char ch;
x=1;y=1;p=5;q=22;
for(i=0;i<=9;i++)
puts(a[i]);
ch=getch();
if(ch=='s')
{
if(a[x+1][y]!='#')
{
a[x][y]=' ';
x++;
a[x][y]='O';
}
}
system("cls");
for(i=0;i<=9;i++)
puts(a[i]);
Sleep(5000);
return 0;
}
運行一下耸棒,按一下“S”鍵,是不是已經可以看到小球向下移動一步了氨ㄈ琛与殃?但是你只能移動一步。如何實現(xiàn)連續(xù)移動呢碍现?
Step 04-03:實現(xiàn)向下持續(xù)移動
很簡單幅疼,用while循環(huán)解決,我們暫時先用while(1)解決:
while(1)
{
ch=getch();
if(ch=='s')
{
if(a[x+1][y]!='#')
{
a[x][y]=' ';
x++;
a[x][y]='O';
}
}
system("cls");
for(i=0;i<=9;i++)
puts(a[i]);
}
完整代碼為:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
char a[15][30]={
"#######################",
"#O ## ### #",
"# # ## # # #",
"# ## # # ## #",
"# ### ## ### ########",
"# ### ## #### ",
"# ###### ## ## ###",
"# # # ## # ## #",
"## #### #### # ### ",
"#######################",
};
int i,x,y,p,q;
char ch;
x=1;y=1;p=5;q=22;
for(i=0;i<=9;i++)
puts(a[i]);
while(1)
{
ch=getch();
if(ch=='s')
{
if(a[x+1][y]!='#')
{
a[x][y]=' ';
x++;
a[x][y]='O';
}
}
system("cls");
for(i=0;i<=9;i++)
puts(a[i]);
}
Sleep(5000);
return 0;
}
試試運行一下,此時我們可以一直按“S”鍵來實現(xiàn)持續(xù)向下移動了昼接!現(xiàn)在我們要解決的問題就是小球要向其它3個方向也能實現(xiàn)持續(xù)移動爽篷!
Step 04-04:另外3個方向也要實現(xiàn)持續(xù)移動
其他方向和s差不多,要注意的是x在變化還是y在變化慢睡,是+1還是-1就可以了逐工。
完整代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
char a[15][30]={
"#######################",
"#O ## ### #",
"# # ## # # #",
"# ## # # ## #",
"# ### ## ### ########",
"# ### ## #### ",
"# ###### ## ## ###",
"# # # ## # ## #",
"## #### #### # ### ",
"#######################",
};
int i,x,y,p,q;
char ch;
x=1;y=1;p=5;q=22;
for(i=0;i<=9;i++)
puts(a[i]);
while(1)
{
ch=getch();
if(ch=='s')
{
if(a[x+1][y]!='#')
{
a[x][y]=' ';
x++;
a[x][y]='O';
}
}
if(ch=='w')
{
if(a[x-1][y]!='#')
{
a[x][y]=' ';
x--;
a[x][y]='O';
}
}
if(ch=='a')
{
if(a[x][y-1]!='#')
{
a[x][y]=' ';
y--;
a[x][y]='O';
}
}
if(ch=='d')
{
if(a[x][y+1]!='#')
{
a[x][y]=' ';
y++;
a[x][y]='O';
}
}
system("cls");
for(i=0;i<=9;i++)
puts(a[i]);
}
Sleep(5000);
return 0;
}
Step 05:走到出口顯示“You Win!”
這一步只需要將while循環(huán)的條件改動一下并且在末尾加入清屏和打印即可。
while循環(huán)改為:
while( x!=p || y!=q)
末尾清屏+打印勝利代碼;
system("cls");
printf("You win!\n");
完整代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
char a[15][30]={
"#######################",
"#O ## ### #",
"# # ## # # #",
"# ## # # ## #",
"# ### ## ### ########",
"# ### ## #### ",
"# ###### ## ## ###",
"# # # ## # ## #",
"## #### #### # ### ",
"#######################",
};
int i,x,y,p,q;
char ch;
x=1;y=1;p=5;q=22;
for(i=0;i<=9;i++)
puts(a[i]);
while( x!=p || y!=q )
{
ch=getch();
if(ch=='s')
{
if(a[x+1][y]!='#')
{
a[x][y]=' ';
x++;
a[x][y]='O';
}
}
if(ch=='w')
{
if(a[x-1][y]!='#')
{
a[x][y]=' ';
x--;
a[x][y]='O';
}
}
if(ch=='a')
{
if(a[x][y-1]!='#')
{
a[x][y]=' ';
y--;
a[x][y]='O';
}
}
if(ch=='d')
{
if(a[x][y+1]!='#')
{
a[x][y]=' ';
y++;
a[x][y]='O';
}
}
system("cls");
for(i=0;i<=9;i++)
puts(a[i]);
}
system("cls");
printf("You win!\n");
Sleep(5000);
return 0;
}
運行:
結束:
終于用C語言設計完成一個“走迷宮”游戲一睁,是不是有點成就感啦钻弄,加油佃却。感謝《啊哈C》這本優(yōu)秀的C語言入門書者吁,感興趣的話自己去看看吧。