-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
一、迷宫的设计
迷宫形状:
* * * * * * * *
* O * *
* * * Exit
* * * * * *
* * *
* * * * * *
* *
* * * * * * * *
*代表墙壁,O代表操作者所在位置,exit是出口处。
二、展示迷宫及其代码
1、自己设计迷宫代码:
#include <stdio.h>
/**
* 向二维数组中添加元素
*
* @param m 二维数组行数
* @param n 二维数组列数
* @param a 二维数组
*/
void inputDoubleArrayElement(int m,int n,char a[m][n]){
for (int i=0; i<m; i++) {
for (int j=0; j<n; j++) {
printf("please enter the %d row %d column's number:\n",i+1,j+1);
scanf("%s",&a[i][j]);
//用@代替spacing,然后将两者进行互换。
if (a[i][j]=='@') {
int temp;
char spacing = ' ';
temp = a[i][j];
a[i][j] = spacing;
spacing = temp;
}
}
}
}
int main(){
int row,col;
printf("please enter a number:\n");
//设置二维数组的行数和列数。
scanf("%d,%d",&row,&col);
char a[row][col];
//function call.
inputDoubleArrayElement(row, col, a);
for (int i=0; i<row; i++) {
for (int j=0; j<col; j++) {
printf("%c\t",a[i][j]);
}
printf("\n");
}
}
其中因知识储备,无法直接输出空格,因此采用@和空格的替换。这种方式可以自己DIY迷宫,不用被初始迷宫限制。
2、直接展示迷宫
#include <stdio.h>
int main(){
char a[8][8] = {
{'*','*','*','*','*','*','*','*'},
{'*','O',' ','*',' ',' ',' ','*'},
{'*',' ','*',' ',' ','*',' ',' '},
{'*',' ','*',' ','*','*','*','*'},
{'*',' ','*',' ',' ',' ',' ','*'},
{'*',' ','*','*','*','*',' ','*'},
{'*',' ',' ',' ',' ',' ',' ','*'},
{'*','*','*','*','*','*','*','*'},
};
for (int i=0; i<8; i++) {
for (int j=0; j<8; j++) {
printf("%c\t",a[i][j]);
}
printf("\n");
}
}
输出结果是:
* * * * * * * *
* O * *
* * *
* * * * * *
* * *
* * * * * *
* *
* * * * * * * *
三、迷宫移动设计的实现
1、使用W,A,S,D分别代表O的移动方向
W——向上移动 | 在数组中应该是row-1 |
A——向左移动 | 在数组中应该是col-1 |
S——向下移动 | 在数组中应该是row+1 |
D——向右移动 | 在数组中应该是col+1 |
2、起点的地址是a[1][1],每次的移动,其实都是和空格进行一次互换。
3、如果碰到墙,则不能进行互换,但是为了游戏效果,不用输出任何文字。
全部代码实现如下:
#include <stdio.h>
char gameCommand();
void gameCommandExecute(int r,int c,char a[r][c]);
void printLabyrinth(int r,int c,char a[r][c]);
/**
* 方向上下左右的指令。
*
* @return 方向结果。
*/
char gameCommand(){
char move;
scanf("%c",&move);
return move;
}
/**
* 实现输入方向实现迷宫移动
*
* @param r 迷宫的行数
* @param c 迷宫的列数
* @param a 迷宫的二维数组
*/
void gameCommandExecute(int r,int c,char a[r][c]){
//定义迷宫的起始地址
r=1;c=1;
printf("please enter the move direction:\n");
//O的位置以后就是a[r][c],while 循环结束的条件是a[r][c]=a[2][7].一旦达成了条件也就是走到了出口,便可以结束程序。
while (a[r][c]!=a[2][7]) {
char temp = ' ';
char move = gameCommand();
if (move == 'w') {
//先验证向上走是不是墙,如果不是,变上下元素交换。
if (a[r-1][c] != '*') {
temp = a[r][c];
a[r][c] = a[r-1][c];
a[r-1][c] = temp;
printLabyrinth(8, 8, a);
//r=r-1是为了明确定义,新的r的位置。
r = r-1;
}
}
if (move == 's') {
if (a[r+1][c] != '*') {
temp = a[r][c];
a[r][c] = a[r+1][c];
a[r+1][c] = temp;
printLabyrinth(8, 8, a);
r = r + 1;
}
}
if (move == 'a') {
if (a[r][c-1] != '*') {
temp = a[r][c];
a[r][c] = a[r][c-1];
a[r][c-1] = temp;
printLabyrinth(8, 8, a);
c = c - 1;
}
}
if (move == 'd') {
if (a[r][c+1] != '*') {
temp = a[r][c];
a[r][c] = a[r][c+1];
a[r][c+1] = temp;
printLabyrinth(8, 8, a);
c = c + 1;
}
}
}
printf("you win!\n");
}
/**
* 显示整个迷宫的地图
*
* @param r 迷宫总行数
* @param c 迷宫总列数
* @param a 组建迷宫的每一个元素,由'*',' ','O'组成。
*/
void printLabyrinth(int r,int c,char a[r][c]){
for (int i=0; i<r; i++) {
for (int j=0; j<c; j++) {
printf("%c\t",a[i][j]);
}
printf("\n");
}
}
int main(){
printf("游戏开始\n");
printf("游戏说明:通过wasd来控制O进行上下左右的移动,到达出口E则获胜。\n");
char a[8][8] = {
{'*','*','*','*','*','*','*','*'},
{'*','O',' ','*',' ',' ',' ','*'},
{'*',' ','*',' ',' ','*',' ',' '},
{'*',' ','*',' ','*','*','*','*'},
{'*',' ','*',' ',' ',' ',' ','*'},
{'*',' ','*','*','*','*',' ','*'},
{'*',' ',' ',' ',' ',' ',' ','*'},
{'*','*','*','*','*','*','*','*'},
};
printLabyrinth(8, 8, a);
printf("游戏开始!\n");
gameCommandExecute(8, 8, a);
}