推箱子游戏攻略第二关(老版推箱子游戏攻略)

2023-10-01 00:47:37
手游app游戏网 > 手游app游戏网 > 推箱子游戏攻略第二关(老版推箱子游戏攻略)

提问:请写一个读取关卡地图的类,或方法函数

chatGPT3.5答:

以下是一个读取文本文件作为地图的示例代码, 其中每个字符代表地图中的一个元素(如墙、空格、箱子等): ```python class Map: def __init__(self, map_file): self.map = [] with open(map_file, 'r') as f: for line in f: row = [] for ch in line.strip(): row.append(ch) self.map.append(row) def get_map(self): return self.map def set_map(self, new_map): self.map = new_map ``` 在上述代码中,我们首先定义了一个Map类, 通过`__init__`方法读取指定的地图文件并将其存储为二维列表。 地图文件中的每行表示地图的一行,行内的每个字符表示该位置的元素。 这样,我们就可以通过调用`get_map`方法来获取当前的地图状态, 并且可以通过调用`set_map`方法来修改地图状态。

追问1:地图中有100个关卡,应该怎么修改一下代码将所有关卡都读取出来呢

chatGPT3.5答:

您可以在代码中使用循环来读取所有的关卡。 例如,您可以将关卡存储为文本文件, 并用一个循环来遍历每个文本文件并读取其内容。 以下是一个示例代码片段: ```python class Level: def __init__(self, level_num): self.level_num = level_num self.layout = [] with open(f"levels/level{level_num}.txt") as f: for line in f: self.layout.append(line.strip()) # 读取所有关卡 levels = [] for i in range(1, 101): levels.append(Level(i)) ``` 通过这种方式,您可以创建一个包含所有100个关卡的Level对象列表 `levels`。 请注意,此示例假定您将所有关卡存储在名为 `levels` 的文件夹中, 并且关卡文件的名称为 `levelX.txt`,其中X表示关卡号。

追问2:不是这样的,我是一个文本文件中有100个关卡,所有关卡之间有一个空行隔开

chatGPT3.5答:

了解了,那我们可以使用一个循环来读取每个关卡,例如: ```python def read_levels(filename): """从文件中读取关卡""" levels = [] with open(filename, 'r') as f: level = [] for line in f: # 如果读到了空行,则表示当前关卡结束 if line.strip() == '': levels.append(level) level = [] else: level.append(line.strip()) if level: levels.append(level) return levels # 调用函数读取所有关卡 levels = read_levels('levels.txt') ``` 这个 `read_levels` 函数会从指定的文件中读取所有关卡, 将它们保存在一个列表中,每个关卡都是一个由字符串组成的列表。 在读取文件时,我们使用一个 `level` 列表来保存当前关卡的所有行, 如果遇到了一个空行,则将 `level` 添加到 `levels` 中, 并重新创建一个新的 `level` 列表来保存下一个关卡。 最后,需要额外的一步判断,因为最后一个关卡没有空行分隔。

效果:略。

每天一个C语言小项目,提升你的编程能力!

推箱子是一个来自日本的古老游戏,目的是在训练你的逻辑思考能力。在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。

效果展示:

1、游戏同时支持鼠标和键盘操作,鼠标操作时,可点击任意你想去的地方。

2、提供回复上一步的功能,可以回到任何一步走过的路径,可以给用户足够的思考空间,使用户的智力在游戏的乐趣中得到充分的锻炼。也可以一退到底。

3、屏幕上方显示当前的关数,您可以方便地选关进行游戏。

4、在目标文件夹里,可以用记事本打开文件,自行设计游戏关卡,加载界面及元素,添加后再次打开程序才能更新。

游戏中使用了图片

本项目编译环境:Visual Studio 2019/2022,EasyX插件

代码展示:

//////////////////////////////////////////////////////////// //游戏中用0表示空地,1表示人物,2表示箱子,3表示目的地,6表示围墙 // //画素材的x1和y1都是反的,因为x表示行,但是画出来x表示列,y同 //////////////////////////////////////////////////////////// #include #include #include int x, y; //人物坐标 int loop; //控制是否重新开始 IMAGE img[8]; //定义IMAGE对象数组来保存图片 /*******************函数声明*******************/ void blank(int x1, int y1); //画空地 void man (int x1, int y1); //画皮卡丘 void box (int x1, int y1); //画箱子 void dest (int x1, int y1); //画目的地 void man1 (int x1, int y1); //画在目的地上的皮卡丘 void box1 (int x1, int y1); //画在目的地上的箱子 void wall (int x1, int y1); //画围墙 void man1 (int x1, int y1); //画在胜利的皮卡丘 void print(int a[15][15]); //把数组里的全画出来 void move (int a[15][15], int x1, int y1); //移动 void find (int a[15][15]); //找人物坐标 int win (int a[15][15]); //判断游戏是否结束 int play (int a[15][15]); //游戏过程 void play1 (void); //游戏关卡 /*******************函数定义*******************/ //画空地 void blank(int x1, int y1) { putimage(y1, x1, &img[0]); // 在坐标 (y1, x1) 位置显示 IMAGE 对象 } //画皮卡丘 void man(int x1, int y1) { putimage(y1, x1, &img[1]); // 在坐标 (y1, x1) 位置显示 IMAGE 对象 } //画箱子 void box(int x1, int y1) { putimage(y1, x1, &img[2]); // 在坐标 (y1, x1) 位置显示 IMAGE 对象 } //画目的地 void dest(int x1, int y1) { putimage(y1, x1, &img[3]); // 在坐标 (y1, x1) 位置显示 IMAGE 对象 } //画在目的地上的皮卡丘 void man1(int x1, int y1) { putimage(y1, x1, &img[4]); // 在坐标 (y1, x1) 位置显示 IMAGE 对象 } //画在目的地上的箱子 void box1(int x1, int y1) { putimage(y1, x1, &img[5]); // 在坐标 (y1, x1) 位置显示 IMAGE 对象 } //画围墙 void wall(int x1, int y1) { putimage(y1, x1, &img[6]); // 在坐标 (y1, x1) 位置显示 IMAGE 对象 } //画胜利的皮卡丘 void man2(int x1, int y1) { putimage(y1, x1, &img[7]); // 在坐标 (y1, x1) 位置显示 IMAGE 对象 } //把数组里的全画出来 void print(int a[][10]) { for(int x1 = 0; x1 < 10; x1++) for(int y1 = 0; y1 < 10; y1++) putimage(60 * y1, 60 * x1, &img[a[x1][y1]]); } //移动 void move(int a[][10], int x1, int y1) { if(a[x + x1][y + y1] == 0 || a[x + x1][y + y1] == 3) { a[x][y]--; a[x + x1][y + y1]++; for(int i = 0; i < 60; i++) { blank(60 * x + i * x1, 60 * y + i * y1); //擦掉 man(60 * x + (i + 1) * x1, 60 * y + (i + 1) * y1); Sleep(1); //为了降低CPU且保存流畅 } if(a[x][y] == 3) dest(60 * x, 60 * y); x += x1; y += y1; if(a[x][y] == 4) man1(60 * x, 60 * y); } else if((a[x + x1][y + y1] == 2 || a[x + x1][y + y1] == 5) && (a[x + 2 * x1][y + 2 * y1] == 0 || a[x + 2 * x1][y + 2 * y1] == 3)) { a[x][y]--; a[x + x1][y + y1]--; a[x + 2 * x1][y + 2 * y1] += 2; for(int i = 0; i < 60; i++) { blank(60 * (x + x1) + i * x1, 60 * (y + y1) + i * y1); //擦掉 box(60 * (x + x1) + (i + 1) * x1, 60 * (y + y1) + (i + 1) * y1); blank(60 * x + i * x1, 60 * y + i * y1); //擦掉 man(60 * x + (i + 1) * x1, 60 * y + (i + 1) * y1); Sleep(1); //为了降低CPU且保存流畅 } if(a[x][y] == 3) dest(60 * x, 60 * y); x += x1; y += y1; if(a[x][y] == 4) man1(60 * x, 60 * y); if(a[x+x1][y+y1] == 5) box1(60 * (x + x1), 60 * (y + y1)); } } //找人物坐标想x,y void find(int a[][10]) { for(x = 0; x < 10; x++) for(y = 0; y < 10; y++) if(a[x][y] == 1) return; } //判断游戏是否结束 int win(int a[][10]) { for(int x1 = 0; x1 < 10; x1++) for(int y1 = 0; y1 < 10; y1++) if(a[x1][y1] == 2) return 0; //如果还有箱子返回假 return 1; //如果没有箱子返回真 } /************************游戏过程**********************/ //游戏过程 int play(int a[][10]) { loop = 0; print(a); find(a); //通过find函数寻找人物的x, y坐标 do { switch(getch()) //获取键盘 { case 'w': case 'W':move(a, -1, 0); break; //上移 case 'a': case 'A':move(a, 0, -1); break; //左移 case 'd': case 'D':move(a, 0, 1); break; //右移 case 's': case 'S':move(a, 1, 0); break; //下移 case 'r': case 'R': case ' ':loop = 1; return 0; //重新开始当前关 case 27:exit(0); break; //结束游戏 case 0: case 0xE0: //如果是方向键 switch(getch()) //再次获取键盘 { case 72:move(a, -1, 0); break; case 75:move(a, 0, -1); break; case 77:move(a, 0, 1); break; case 80:move(a, 1 , 0); } } }while(!win(a)); //通过win函数判断是否通过 man2(60 * x, 60 * y); //画一个开心的皮卡丘 getch(); return 0; } //游戏关卡 void play1(void) { int a[5][10][10]={ //定义三维地图数组 { {0}, {0, 0, 6, 6, 6}, {0, 0, 6, 3, 6}, {0, 0, 6, 0, 6, 6, 6, 6}, {6, 6, 6, 2, 0, 2, 3, 6}, {6, 3, 0, 2, 1, 6, 6, 6}, {6, 6, 6, 6, 2, 6}, {0, 0, 0, 6, 3, 6}, {0, 0, 0, 6, 6, 6} }, { {6, 6, 6, 6, 6}, {6, 1, 0, 0, 6}, {6, 0, 2, 2, 6, 0, 6, 6, 6}, {6, 0, 2, 0, 6, 0, 6, 3, 6}, {6, 6, 6, 0, 6, 6, 6, 3, 6}, {0, 6, 6, 0, 0, 0, 0, 3, 6}, {0, 6, 0, 0, 0, 6, 0, 0, 6}, {0, 6, 0, 0, 0, 6, 6, 6, 6}, {0, 6, 6, 6, 6, 6} }, { {0, 6, 6, 6, 6}, {0, 6, 1, 0, 6, 6, 6}, {0, 6, 0, 2, 0, 0, 6}, {6, 6, 6, 0, 6, 0, 6, 6}, {6, 3, 6, 0, 6, 0, 0, 6}, {6, 3, 2, 0, 0, 6, 0, 6}, {6, 3, 0, 0, 0, 2, 0, 6}, {6, 6, 6, 6, 6, 6, 6, 6} }, { {0, 6, 6, 6, 6, 6, 6, 6}, {0, 6, 0, 1, 3, 3, 3, 6}, {0, 6, 0, 0, 0, 6, 6, 6, 6}, {6, 6, 6, 2, 0, 0, 0, 0, 6}, {6, 0, 0, 0, 6, 2, 6, 0, 6}, {6, 0, 2, 0, 6, 0, 0, 0, 6}, {6, 0, 0, 0, 6, 6, 6, 6, 6}, {6, 6, 6, 6, 6} }, { {0, 6, 6, 6, 6, 6}, {0, 6, 0, 1, 0, 6, 6, 6}, {6, 6, 0, 6, 2, 0, 0, 6}, {6, 0, 5 ,3, 0, 3, 0, 6}, {6, 0, 0, 2, 2, 0, 6, 6}, {6, 6, 6, 0, 6, 3, 6}, {0, 0, 6, 0, 0, 0, 6}, {0, 0, 6, 6, 6, 6, 6} } }; int b[10][10]; //设置当前地图数组 for(int i = 0; i < 5; i++) { do { loop=0; //loop置为0 for(int x1 = 0; x1 < 10; x1++) for(int y1 = 0; y1 < 10; y1++) b[x1][y1] = a[i][x1][y1]; //对当前地图数组分别赋值 play(b); }while(loop); //如果loop被置为1则重新开始 } } /************************主函数***********************/ int main(void) { initgraph(600, 600); setbkcolor(WHITE); cleardevice(); loadimage(&img[0], "图片\\0.jpg"); loadimage(&img[1], "图片\\1.jpg"); loadimage(&img[2], "图片\\2.jpg"); loadimage(&img[3], "图片\\3.jpg"); loadimage(&img[4], "图片\\4.jpg"); loadimage(&img[5], "图片\\5.jpg"); loadimage(&img[6], "图片\\6.jpg"); loadimage(&img[7], "图片\\7.jpg"); play1(); closegraph(); return 0; }

大家赶紧去动手试试吧!

此外,我也给大家分享我收集的其他资源,从最零基础开始的教程到C语言C++项目案例,帮助大家在学习C语言的道路上披荆斩棘!

编程学习书籍分享:

编程学习视频分享:

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)最重要的是你可以在群里面交流提问编程问题哦!

对于C/C++感兴趣可以关注小编在后台私信我:【编程交流一起来学习哦!可以领取一些C/C++的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!

作者:admin | 分类:手游app游戏网 | 浏览:23 | 评论:0