#include <stdio.h>
/*
数组指针:
定义一个指针变量,让这个指针变量指向一维数组的元素
二维数组指针
行指针,用来指向二维数组的每一行,存放的是行的首地址
定义格式: 数据类型 (*行指针变量名)[数组第二维的长度];
二维数组指针的初始化
int a[2][3];
int b[2][2];
float f1[4][4];
//假设我要定义一个指向数组a的一个行指针
// a = &a[0] = &a[0][0] = a[0]
int (*p)[3] = a;
二维数组指针的使用
*(*(p+i)+j) //就是获取二维数组的每个元素
*/
int main(int argc, const char * argv[]) {
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
//二维数组指针
//二维数组指针可以替代数组名去使用
int (*p)[4] = a;
for (int i=0; i<3; i++) {
for (int j=0; j<4; j++) {
//遍历数组
printf("%d ",*(*(p+i)+j));
}
printf("
");
}
return 0;
}
//
// main.c
// 14-《推箱子》游戏代码实现(一)
//
// Created by apple on 15/1/8.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#include <stdio.h>
#define kRows 10
#define kCols 11
/**
* 打印地图
*
* @param map 地图的数组
*/
void printMap(char map[kRows][kCols]){
for (int i=0; i<kRows; i++) {
printf("%s
",map[i]);
}
}
/**
* 移动的函数
*
* @param map <#map description#>
* @param oldX <#oldX description#>
* @param oldY
* @param newX <#newX description#><#oldY description#>
* @param newY <#newY description#>
*/
void move1(char map[kRows][kCols],int oldX,int oldY,int newX,int newY){
//交换两个位置的字符
char temp;
temp = map[oldX][oldY];
map[oldX][oldY] = map[newX][newY];
map[newX][newY] = temp;
}
int main(int argc, const char * argv[]) {
//******** 定义变量 **********
//1、定义地图
char map[kRows][kCols]={
"##########",
"#O #### #",
"# X#### #",
"# #",
"###### #",
"# #### #",
"# #",
"# ######",
"# ",
"##########"};
//定义变量保存位置信息
//定义小人当前位置信息
int personX =1;
int personY =1;
//小人将要移动的下一个位置信息
int personNextX=personX;
int personNextY=personY;
//定义箱子的当前的位置
int boxX = 2;
int boxY = 2;
//定义变量接收用户输入的方向
char direction;
//定义路的字符
char street = ' ';
char box = 'X';
//******* 打印地图 **********
//2、打印一遍地图
printMap(map);
printf("请控制小人移动:w.上 s.下 a.左 d.右 q.退出
");
//******* 编写循环控制程序 *****
while (1) {
//3、接收用户输入的方向
scanf("%c",&direction);
getchar(); //获取一个字符从键盘上
//防止穿墙
//0
personNextX = personX; //1
personNextY = personY; //1
//4、判断方向
switch (direction) {
case 'w':
case 'W':
//下一个位置-1
personNextX--;
break;
case 's':
case 'S':
personNextX++;
break;
case 'a':
case 'A':
personNextY--;
break;
case 'd':
case 'D':
personNextY++;
break;
case 'q':
case 'Q':
printf("程序正在退出...
");
printf("程序已经退出!
");
return 0;
default:
break;
}
//5、根据用户输入的方向 判断如何移动
if (map[personNextX][personNextY] == street) {
// 先判断小人的下一个位置是否 是路
// 如果是路,先让小人移动
//移动
//让小人和路进行交换
move1(map,personX,personY,personNextX,personNextY);
//重新调整小人的位置
personX = personNextX;
personY = personNextY;
}else if (map[personNextX][personNextY] == box){
// 如果不是路,
//******* 判断模块 ***********
// 再次判断是否是箱子
// 如果是箱子,计算箱子的下一个位置
int boxNextX = boxX+(boxX-personX);
int boxNextY = boxY+(boxY-personY);
// 再次判断箱子的下一个位置是否是路
if (map[boxNextX][boxNextY] == street) {
// 如果箱子的下一个位置是路,要移动小人和箱子
// 如何移动小人和箱子呢?
// 1)移动箱子到箱子的下一个位置
move1(map, boxX, boxY, boxNextX, boxNextY);
// 2)让小人移动到箱子的原来的位置
move1(map, personX, personY, boxX, boxY);
//重新调整 箱子的位置和小人的位置
personX = personNextX;
personY = personNextY;
boxX = boxNextX;
boxY = boxNextY;
}
// 如果不是箱子,什么也不干
}
//****** 重绘地图 ***********
// 6、重绘地图
printMap(map);
//******* 判断是否走出来 ******
// 7、判断箱子是否被推出来了
if (boxY==kCols-2) {
printf("哇哦!你推出来了!
");
break;
}
//
}
return 0;
}