其他窗口操作:汉字对应的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':Logoutn"); 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



