其他窗口 *** 作:汉字对应的ASCLL
引入窗口控制头文件
windwos.h
定义游戏中所有实物
{" ", "■", "", "☆", "□", "▲", "", "★", "▲"};
将游戏中所有的实物赋予不同的颜色
{0, FOREGROUND_RED, -1, FOREGROUND_GREEN, FOREGROUND_GREEN, FOREGROUND_GREEN, -1, BACKGROUND_GREEN, FOREGROUND_GREEN}
// 输出终端字符的颜色
void Color (int m) {
HANDLE consolehwnd;/*创建句柄*/
consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);/*实例化句柄*/
SetConsoleTextAttribute(consolehwnd, m);
}
将文件中的数据地图存储到数组中
while(!feof(fp)) {
fscanf(fp,"%d",&map[mapRow][mapCol++]);
if(mapCol%LIE==0) {
mapRow++;
mapCol=0;
}
}
在地图中绘制各种实物
case 0: // 空
case 1: // 墙
case 3: // 目的地
case 4: // 箱子
case 5: // 人
case 7: // 箱子+目的地
case 8: //人+目的地
Color(mapBrickColor[now]); // 设置颜色
printf(mapBrickChar[now]); // 输出字符
break;
选择关卡
case 1:
case 2:
case 3:
case 4:
case 5:
case 6: { // 关卡选择
char s[30] = "";
sprintf(s, path, k);
if((fp=fopen(s,"rt"))==NULL) {
return 2;
}
}
以上均为废话,为了凑字数
代码中有注释
#include
#include
#include
#include
// C99或C11模式【所以文件后缀.c改为.cpp】
#define f(i, a, b) for(int (i)=(a);(i)<(b);(i)++)
//地图为10列对应txt文本中的内容:墙为1 空地为0 箱子为4 人为5 目的地为3
#define LIE 10
// 定义一些地图中的符号:空位置、墙、目的地、箱子、人 、箱子+目的地、人+目的地
const char mapBrickChar[][5] = {" ", "■", "", "☆", "□", "▲", "", "★", "▲"};
// 每个字符对应的颜色颜色点进去看
const int mapBrickColor[] = {0, FOREGROUND_RED, -1, FOREGROUND_GREEN, FOREGROUND_GREEN, FOREGROUND_GREEN, -1, BACKGROUND_GREEN, FOREGROUND_GREEN};
int map[20][LIE]; // 存地图
char path[30] = "./关卡%d.txt"; // 关卡路径
int k; // 保存关卡
int mapRow=0; // 地图的长度
int mapCol=0; // 遍历地图时作为索引使用,无使用价值
// 人的坐标
int ROW, COL;
// 输出终端字符的颜色
void Color (int m) {
HANDLE consolehwnd;/*创建句柄*/
consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);/*实例化句柄*/
SetConsoleTextAttribute(consolehwnd, m);
}
int createmap() { // 读取并保存地图
scanf("%d",&k);
FILE *fp;
switch (k) {
case 0: { // 输入0退出
return 1;
}
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6: { // 关卡选择
char s[30] = "";
sprintf(s, path, k);
if((fp=fopen(s,"rt"))==NULL) {
return 2;
}
}
break;
}
mapRow = mapCol = 0;
while(!feof(fp)) {
fscanf(fp,"%d",&map[mapRow][mapCol++]);
if(mapCol%LIE==0) {
mapRow++;
mapCol=0;
}
}
if(fclose(fp)) return 2;
return 0;
}
// 绘制地图
void DrawMap() {
system("cls");
printf("方向键控制上下左右,r重新游戏,t退出游戏\n");
f(i, 0,mapRow) {
f (j, 0, LIE) {
int now = map[i][j]; // 当前位置代号
switch (now) {
case 0: // 空
case 1: // 墙
case 3: // 目的地
case 4: // 箱子
case 5: // 人
case 7: // 箱子+目的地
case 8: //人+目的地
Color(mapBrickColor[now]); // 设置颜色
printf(mapBrickChar[now]); // 输出字符
break;
}
}
printf("\n");
}
}
//获取到当前人的下标 时刻都能够确定人的下标
void getPersonPosition() {
int row, col; //人的行和列
f(i, 0, mapRow) { //控制变量 0-6
f(j, 0, LIE) { //控制变量 0-9
if (map[i][j] == 5||map[i][j] == 8) {
row = i; //i 0-6
col = j; //j 0-9
}
}
}
if(ROW!=row||COL!=col) {
Color(15);
printf("(%d,%d)\n", row, col);
}
ROW = row;
COL = col;
}
// 修改地图数据
int PlayGame() {
int flag=0; // 标记人是否移动过
getPersonPosition();
char input; //定义一个字符变量
input = getch(); //变量接受键盘的输入
switch (input) {
case 72: //上
if (map[ROW - 1][COL] == 0||map[ROW-1][COL]==3) { //如果人的前面是空地或者目的地
map[ROW][COL] -= 5; //人的ID有可能是5 也有可能是8
map[ROW - 1][COL] += 5;
flag=-1;
} else if (map[ROW - 1][COL] == 4 || map[ROW - 1][COL] == 7) { //人的前面是箱子
if (map[ROW - 2][COL] == 0 || map[ROW - 2][COL] == 3) { //箱子的前面是空地
map[ROW - 2][COL] += 4;
map[ROW - 1][COL] += (5-4);
map[ROW][COL] -= 5;
flag=-1;
}
}
break;
case 80: //下
if (map[ROW + 1][COL] == 0 || map[ROW + 1][COL] == 3) { //如果人的前面是空地或者目的地
map[ROW][COL] -= 5; //人的ID有可能是5 也有可能是8
map[ROW + 1][COL] += 5;
flag=-2;
} else if (map[ROW + 1][COL] == 4 || map[ROW + 1][COL] == 7) { //人的前面是箱子
if (map[ROW + 2][COL] == 0 || map[ROW + 2][COL] == 3) { //箱子的前面是空地
map[ROW + 2][COL] += 4;
map[ROW + 1][COL] += 1;
map[ROW][COL] -= 5;
flag=-2;
}
}
break;
case 75: //左
if (map[ROW][COL - 1] == 0 || map[ROW][COL - 1] == 3) { //如果人的前面是空地或者目的地
map[ROW][COL] -= 5; //人的ID有可能是5 也有可能是8
map[ROW][COL - 1] += 5;
flag=-3;
} else if (map[ROW][COL - 1] == 4 || map[ROW][COL - 1] == 7) { //人的前面是箱子
if (map[ROW][COL - 2] == 0 || map[ROW][COL - 2] == 3) { //箱子的前面是空地
map[ROW][COL - 2] += 4;
map[ROW][COL - 1] += 1;
map[ROW][COL] -= 5;
flag=-3;
}
}
break;
case 77: //右
if (map[ROW][COL + 1] == 0 || map[ROW][COL + 1] == 3) { //如果人的前面是空地或者目的地
map[ROW][COL] -= 5; //人的ID有可能是5 也有可能是8
map[ROW][COL + 1] += 5;
flag=-4;
} else if (map[ROW][COL + 1] == 4 || map[ROW][COL + 1] == 7) { //人的前面是箱子
if (map[ROW][COL + 2] == 0 || map[ROW][COL + 2] == 3) { //箱子的前面是空地
map[ROW][COL + 2] += 4;
map[ROW][COL + 1] += 1;
map[ROW][COL] -= 5;
flag=-4;
}
}
break;
case 'r': // 重新开始
mapRow=0;
mapCol=0;
ROW=0;
COL=0;
flag=-10;
createmap();
break;
case 't': // 退出游戏
return 1;
break;
}
return flag;
}
// 判断是否成功
int success() {
f(i, 0, mapRow) {
f(j, 0, LIE) {
if (map[i][j]==3) { // 是否还有目的地没变成箱子
return 0;
}
}
}
return 1;
}
int main() {
// 屁:脚本打开网页
ShellExecute(NULL,"open","https://blog.csdn.net/qq_44009311",NULL,NULL,SW_SHOWNORMAL);
while(1) {
printf("请选择关卡\n");
printf("退出'0':Logout\n");
printf("关卡'1':非常简单\n");
printf("关卡'2':简单\n");
printf("关卡'3':常规\n");
printf("关卡'4':困哪\n");
printf("关卡'5':较难\n");
printf("关卡'6':非常困难\n");
// 读取并保存地图数据
int t = createmap();
if(t != 0) return 0; //0正常、 返回1:输入0退出、返回2:文件打开失败
DrawMap();
while (1) {
// 修改地图
int tp = PlayGame();
if(tp > 0) { // 退出游戏
Color(10);
printf("退出!\n");
break;
} else if(tp==0) {
} else {
if(success()) { // 成功
Color(10);
printf("成功!\n");
system("pause");
break;
}
DrawMap();
}
}
system("cls");
}
return 0;
}
关卡1.txt
0 0 0 0 1 1 1 0 0 0
0 0 0 0 1 3 1 0 0 0
1 1 1 1 1 4 1 1 1 1
1 3 0 0 4 5 4 0 3 1
1 1 1 1 1 4 1 1 1 1
0 0 0 0 1 3 1 0 0 0
0 0 0 0 1 1 1 0 0 0
关卡2.txt
0 1 1 1 1 1 1 1 0 0
0 1 3 3 3 3 0 1 0 0
1 1 1 3 3 3 4 1 1 1
1 0 0 4 1 4 0 4 0 1
1 0 4 4 0 0 1 4 0 1
1 0 0 0 5 1 0 0 0 1
1 1 1 1 0 0 0 1 1 1
0 0 0 1 1 1 1 1 0 0
关卡3.txt
0 0 1 1 1 1 1 1 0 0
1 1 1 0 0 0 1 1 1 1
1 0 0 0 4 0 4 0 0 1
1 0 4 0 0 0 4 5 0 1
1 1 1 4 4 1 1 1 1 1
0 0 1 0 0 3 3 1 0 0
0 0 1 3 3 3 3 1 0 0
0 0 1 1 1 1 1 1 0 0
关卡4.txt
1 1 1 1 1 1 1 1 1 0
1 0 0 0 1 1 0 0 1 0
1 0 1 0 4 0 4 0 1 0
1 0 0 7 3 1 0 0 1 0
1 1 0 1 3 0 3 1 1 0
1 1 4 1 1 1 5 1 1 1
1 0 0 0 0 0 4 0 0 1
1 0 0 0 1 1 0 1 0 1
1 1 1 1 1 1 0 0 0 1
0 0 0 0 0 1 1 1 1 1
关卡5.txt
0 0 0 0 0 1 1 1 1 1
0 1 1 1 1 1 0 0 0 1
0 1 0 3 3 0 4 1 0 1
0 1 0 1 3 7 0 0 0 1
1 1 0 7 3 1 0 5 1 1
1 0 4 0 0 4 4 0 1 0
1 0 0 0 1 1 0 0 1 0
1 1 1 1 1 1 1 1 1 0
关卡6.txt
0 1 1 1 1 0 0 0 0 0
0 1 0 0 1 1 1 1 1 0
1 1 4 0 1 1 0 0 1 0
1 0 0 4 5 4 0 0 1 0
1 0 0 0 1 1 4 0 1 0
1 1 1 3 1 1 0 1 1 1
0 1 3 3 3 4 0 4 0 1
0 1 1 3 3 0 0 0 0 1
0 0 1 1 1 1 1 1 1 1
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)