简单的走迷宫小游戏(C语言编写,无指针,无链表)

article/2025/10/27 6:43:36

目录

前言

代码编写思路

      1.光标移动函数

      2.地图

      3.人物的移动(核心) 

      4.菜单、结束语句

      5.附完整代码:

总结

优点:

缺点:

前言

笔者乃初学C语言,萌新一枚。深感C语言之博大,自叹所学之浅薄。今突发奇想,尝试用最简单之所学,编写了一款走迷宫小游戏。望各位大佬看后能在忍俊不禁之余,多多指教。

代码编写思路

1.光标移动函数

考虑到此程序运行过程中,需要不断在界面不同位置打印输出各种语句和字符,因此先通过编写自定义函数的方式,实现将光标移动至指定位置。调用时只需将光标所需移动位置的横竖坐标输入。

注:横坐标x从左向右,纵坐标y从上向下,初始值为(0,0)。如图所示:

由于笔者的操作系统是windows,因此为文件添加了“windows.h”的头文件,其中包含了其他的 Windows 头文件,这些头文件的部分也包含了其他头文件:

Windef.h 基本数据类型定义。
Winnt.h 支持 Unicode 的类型定义。
Winbase.h Kernel(内核)函数。
Winuser.h 用户界面函数。
Wingdi.h 图形设备接口函数。

具体代码如下:

void goto_xy(int x,int y)  //移动光标到指定位置 
{HANDLE hout;hout=GetStdHandle(STD_OUTPUT_HANDLE);COORD pos={x,y};SetConsoleCursorPosition(hout,pos);
}

2.地图

定义一个静态全局二维数组map_way[20][20],其中我将用“0”代表通路,“1”代表墙壁,“2”代表陷阱,“3”代表终点。当调用自定义函数map时,将打印出地图。

代码如下(示例): 

static int map_way[20][20]={{1,1,1,1,1,1,1,1,1,1},{0,0,0,1,0,0,0,0,0,1},{1,1,0,0,0,2,1,1,0,1},{1,0,0,1,1,1,1,0,0,1},{1,2,1,1,0,0,0,0,1,1},{1,0,0,0,0,1,0,1,0,3},{1,0,1,1,1,1,0,1,0,1},{1,0,1,0,0,0,2,1,0,1},{1,0,0,0,1,0,0,0,0,1},{1,1,1,1,1,1,1,1,1,1}};void map()
{	int i,j;goto_xy(0,0);for(i=0;i<10;i++){for(j=0;j<10;j++){if(map_way[i][j]==1)printf("▓");//墙壁 else if(map_way[i][j]==2)printf("※");//陷阱 else if(map_way[i][j]==3)printf("★");//终点 else printf(" ");//通路 }printf("\n");}
}

调用函数效果如图所示:


3.人物的移动(核心)

定义两个全局变量man_x、man_y,分别代表当前人物所处坐标。这里我们需要对其初始化。因地图设计,入口位置为(0,1),所以初始化为man_x=0,man_y=1。当调用自定义函数move时,通过输入w、s、a、d,控制人物的上、下、左、右移动。当人物的坐标与之前定义的地图中各位置相重合时,执行不同的指令。

注:要考虑到字符的全角与半角,即像“▓”、“※”、“★”的这些字符,会占两个标准字符位置,故在调用光标移动函数及转义字符“\b”时,要考虑到

具体代码如下:

int man_x=0,man_y=1;
int move()  //为了能在运行过程中通过返回值的方式,提前退出当前函数,故将函数定义为了int型 
{	int i,j;char anjian;goto_xy(man_x,man_y);printf("☆");while(1){goto_xy(30,0);   //指定位置读入 anjian=getchar();switch(anjian)  //读入不同的字符,对应人物不同的移动方向 {case 'a':if(map_way[man_y][man_x-1]==1)  //与墙壁相冲突 {goto_xy(30,5); printf("撞墙!");  //打印提示语句 break;	}else if(map_way[man_y][man_x-1]==2) //掉入陷阱{goto_xy(30,4); printf("很遗憾,你掉入了陷阱!");  //打印提示语句  return 0;   //退出 } else if(map_way[man_y][man_x-1]==3)  //到达终点 {goto_xy(30,4);printf("恭喜你,成功通关!");  //打印提示语句 return 0; //退出 }else  //将人物向指定位置移动 {goto_xy(man_x*2,man_y);  //代表人物的字符☆占两个标准字符位置,应此要乘2 printf(" \b\b☆");  //原因同上 man_x--;goto_xy(30,5);printf("      ");  //抹去之前打印的提示语句 break;}case 'd':if(map_way[man_y][man_x+1]==1){goto_xy(30,5); printf("撞墙!");break;	}else if(map_way[man_y][man_x+1]==2){goto_xy(30,4); printf("很遗憾,你掉入了陷阱!"); return 0; } else if(map_way[man_y][man_x+1]==3){goto_xy(30,4);printf("恭喜你,成功通关!");return 0;}else {goto_xy(man_x*2,man_y);printf(" ");printf("☆"); man_x++;goto_xy(30,5);printf("      ");break;}case 'w':if(map_way[man_y-1][man_x]==1){goto_xy(30,5); printf("撞墙!");break;	}else if(map_way[man_y-1][man_x]==2){goto_xy(30,4); printf("很遗憾,你掉入了陷阱!");  return 0; } else if(map_way[man_y-1][man_x]==3){goto_xy(30,4);printf("恭喜你,成功通关!");return 0;}else {goto_xy(man_x*2,man_y);printf(" "); goto_xy(man_x*2,man_y-1);printf("☆");man_y--;goto_xy(30,5);printf("      ");break;}case 's':if(map_way[man_y+1][man_x]==1){goto_xy(30,5); printf("撞墙!");break;	}else if(map_way[man_y+1][man_x]==2){goto_xy(30,4); printf("很遗憾,你掉入了陷阱!"); return 0; } else if(map_way[man_y+1][man_x]==3){goto_xy(30,4);printf("恭喜你,成功通关!");return 0;}else {goto_xy(man_x*2,man_y);printf(" "); goto_xy(man_x*2,man_y+1);printf("☆");man_y++;goto_xy(30,5);printf("      ");break;}}}	
} 

4.菜单、结束语句

编写菜单函数,调用时将打印出游戏名称、各符号所代表的含义、操作方法等等。

编写结束语句函数,在程序运行最后调用。

具体代码如下:

void menu()
{goto_xy(0,12);printf("《迷宫》"); goto_xy(0,13);printf("上:w\t墙壁: \"▓\"\n下:s\t陷阱:\"※\"\n左:a\t终点:\"★\"\n右:d\t人物:\"☆\"\n(注:由于水平有限,每按一次移动按键都需按一下回车)");	
}  void end()
{goto_xy(30,5);printf("GAME OVER!");goto_xy(0,18);	
} 

调用函数效果如图所示:

5.附完整代码:

#include<stdio.h>
#include<windows.h>static int map_way[20][20]={{1,1,1,1,1,1,1,1,1,1},{0,0,0,1,0,0,0,0,0,1},{1,1,0,0,0,2,1,1,0,1},{1,0,0,1,1,1,1,0,0,1},{1,2,1,1,0,0,0,0,1,1},{1,0,0,0,0,1,0,1,0,3},{1,0,1,1,1,1,0,1,0,1},{1,0,1,0,0,0,2,1,0,1},{1,0,0,0,1,0,0,0,0,1},{1,1,1,1,1,1,1,1,1,1}};
int man_x=0,man_y=1;void goto_xy(int x,int y)  //移动光标到指定位置 
{HANDLE hout;hout=GetStdHandle(STD_OUTPUT_HANDLE);COORD pos={x,y};SetConsoleCursorPosition(hout,pos);
}void menu()
{goto_xy(0,12);printf("《迷宫》"); goto_xy(0,13);printf("上:w\t墙壁: \"▓\"\n下:s\t陷阱:\"※\"\n左:a\t终点:\"★\"\n右:d\t人物:\"☆\"\n(注:由于水平有限,每按一次移动按键都需按一下回车)");	
} void end()
{goto_xy(30,5);printf("GAME OVER!");goto_xy(0,18);	
} void map()
{	int i,j;goto_xy(0,0);for(i=0;i<10;i++){for(j=0;j<10;j++){if(map_way[i][j]==1)printf("▓");//墙壁 else if(map_way[i][j]==2)printf("※");//陷阱 else if(map_way[i][j]==3)printf("★");//终点 else //if(map_way[i][j]==0)printf(" ");//通路 }printf("\n");}
}int move()  //为了能在运行过程中通过返回值的方式,提前退出当前函数,故将函数定义为了int型 
{	int i,j;char anjian;goto_xy(man_x,man_y);printf("☆");while(1){goto_xy(30,0);   //指定位置读入 anjian=getchar();switch(anjian)  //读入不同的字符,对应人物不同的移动方向 {case 'a':if(map_way[man_y][man_x-1]==1)  //与墙壁相冲突 {goto_xy(30,5); printf("撞墙!");  //打印提示语句 break;	}else if(map_way[man_y][man_x-1]==2) //掉入陷阱{goto_xy(30,4); printf("很遗憾,你掉入了陷阱!");  //打印提示语句  return 0;   //退出 } else if(map_way[man_y][man_x-1]==3)  //到达终点 {goto_xy(30,4);printf("恭喜你,成功通关!");  //打印提示语句 return 0; //退出 }else  //将人物向指定位置移动 {goto_xy(man_x*2,man_y);  //代表人物的字符☆占两个标准字符位置,应此要乘2 printf(" \b\b☆");  //原因同上 man_x--;goto_xy(30,5);printf("      ");  //抹去之前打印的提示语句 break;}case 'd':if(map_way[man_y][man_x+1]==1){goto_xy(30,5); printf("撞墙!");break;	}else if(map_way[man_y][man_x+1]==2){goto_xy(30,4); printf("很遗憾,你掉入了陷阱!"); return 0; } else if(map_way[man_y][man_x+1]==3){goto_xy(30,4);printf("恭喜你,成功通关!");return 0;}else {goto_xy(man_x*2,man_y);printf(" ");printf("☆"); man_x++;goto_xy(30,5);printf("      ");break;}case 'w':if(map_way[man_y-1][man_x]==1){goto_xy(30,5); printf("撞墙!");break;	}else if(map_way[man_y-1][man_x]==2){goto_xy(30,4); printf("很遗憾,你掉入了陷阱!");  return 0; } else if(map_way[man_y-1][man_x]==3){goto_xy(30,4);printf("恭喜你,成功通关!");return 0;}else {goto_xy(man_x*2,man_y);printf(" "); goto_xy(man_x*2,man_y-1);printf("☆");man_y--;goto_xy(30,5);printf("      ");break;}case 's':if(map_way[man_y+1][man_x]==1){goto_xy(30,5); printf("撞墙!");break;	}else if(map_way[man_y+1][man_x]==2){goto_xy(30,4); printf("很遗憾,你掉入了陷阱!"); return 0; } else if(map_way[man_y+1][man_x]==3){goto_xy(30,4);printf("恭喜你,成功通关!");return 0;}else {goto_xy(man_x*2,man_y);printf(" "); goto_xy(man_x*2,man_y+1);printf("☆");man_y++;goto_xy(30,5);printf("      ");break;}}}	
} int main()
{menu(); map();move();end();system("pause");//若要生成可执行文件,加上此句可确保不会闪退 return 0;
}

运行效果图:

总结

优点:

1.地图搭建较为容易。只需改变定义的二维数组map_way,即可改变地图。(但需考虑到菜单等界面布局,不然只增大地图易导致部分输出内容重叠,产生未知错误)

2.采用数字代替特殊字符的方式,降低编写难度,增强代码的可读性。

3.涉及到的知识简单易懂,除了自定义的光标移动函数外,并未涉及到诸如指针、链表、文件等较为深奥的东西。(笔者在为自己的菜找借口)

缺点:

1.未能实现地图的随机生成,搭建地图的方式僵硬呆板。若要搭建更大的地图,例如40×40的地图,则需初始化总计1600个数字,工作量无疑是巨大的。

2.在输入控制人物移动的字符时,仍需输入一个字符按一下enter键,无疑影响游戏体验。

3.游戏界面只是基本的字符,没有复杂美观的图案,看起来单调乏味。


http://chatgpt.dhexx.cn/article/QCFiJlE9.shtml

相关文章

贪吃蛇小游戏——C语言编写

文章目录 1.效果展示2.设计思路2.1图案显示2.2蛇头的移动2.3食物的生成2.4蛇身体的生成与移动2.5判断是否撞墙和打印得分 3.完整代码 1.效果展示 2.设计思路 2.1图案显示 利用二维数组构建图案&#xff0c;总共有墙壁&#xff0c;蛇头&#xff0c;蛇身&#xff0c;食物&#…

用C语言编写贪吃蛇小游戏

实现功能 蛇最开始三节&#xff0c;向右移动。用户可以通过按上下左右来控制蛇的移动&#xff0c;食物随机产生&#xff0c;蛇吃到食物后蛇的身体会变长。蛇撞墙或者撞到自己身体后&#xff0c;游戏结束。 怎么实现 要实现一个贪吃蛇小游戏&#xff0c;首先要想清楚游戏里有…

用C语言编写2048游戏

2048_C_code 用C语言编写的2048 1 要实现我们的 2048 小游戏&#xff0c;需要涉及一些数据结构的知识&#xff0c;以及一些 Linux 的系统调用。此外&#xff0c;为了方便在屏幕上使用字符绘图&#xff0c;我们还需要使用一个文本界面的屏幕绘图库 ncurses &#xff0c;具体到…

C语言编写猜数字小游戏

C语言编写猜数字小游戏 经过对C语言的初步学习&#xff0c;为提高编程能力&#xff0c;可以敲一些稍费脑筋的代码&#xff0c;猜数字就是一个很好的选择。要想实现该游戏&#xff0c;那么首先我们应该知道制作的大体思路。 电脑应随机产生一个数字&#xff08;为便于玩家猜的…

C语言编写2048小游戏

一、原理 这里以向上移动为例&#xff0c;其他方向的移动类似。 因为纵向移动不会横向变化&#xff0c;所以可以单独拿出某一列来分析。 我们先假设一个具有代表性的例子&#xff0c;假设当前某列数据是【2】【0】【2】【8】&#xff08;0代表空白&#xff09;&#xff0c;如…

Linux C语言编写2048小游戏

2048 2048小游戏是用Linux C语言写的&#xff0c;运行在Ubuntu系统上&#xff0c;其中Ubuntu链接Ncuses库。首先&#xff0c;我们简单了解一下Ncurses。 Ncurses库是由原CURSES库发展而来的&#xff0c;这个库提供了C/C对屏幕以及光标、鼠标访问的特性。使得C/C简易写屏成为可能…

C语言编写小游戏:MinesWeeper(扫雷)闯关版

《扫雷》&#xff1a;大众类的益智小游戏&#xff0c;游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子&#xff0c;同时避免踩雷&#xff0c;踩到一个雷即全盘皆输。 话不多说&#xff0c;我们直接进入正题。 首先&#xff0c;我们得给用户显示一个菜单栏&…

(C语言)用C语言编写小游戏——三子棋

目录 三子棋效果展示 三子棋的功能实现 1、初始化棋盘格 2、打印棋盘 3、玩家下棋 4、电脑下棋 5、判断输赢&#xff08;玩家赢/电脑赢/平局&#xff09; 完整代码展示 三子棋小游戏的代码实现分为三个文件&#xff0c;test.c&#xff08;测试游戏功能&#xff09;、ga…

c语言编写的小游戏(c语言编写小游戏入门)

C语言编写是要注意什么&#xff1f; 因此&#xff0c;在编写选择语句之前&#xff0c;应该首先明确判断条件是什么&#xff0c;并确定当判断结果为“真”或“假”时应分别执行什么样的操作(算法) c语言编写小游戏请提供俄罗斯方块&#xff0c;坦克大战之类的小游戏的程序的c 应…

(C语言)用C语言编写小游戏——扫雷

目录 扫雷效果展示 扫雷的功能实现 1、初始化棋盘格 2、 打印棋盘 3、布置雷 4、排查雷 完整代码展示 扫雷小游戏的代码实现分为三个文件&#xff0c;test.c&#xff08;测试游戏功能&#xff09;、game.h&#xff08;头文件的包含和函数的声明&#xff09;、game.c&…

详解5个C语言简单易懂小游戏

文章目录 前言一、准备工作二、游戏菜单三、游戏内容1.猜数字2.三子棋3.扫雷4.五子棋5.飞行棋 总结 前言 我们通过5个简单易懂的小游戏来加强我们对C语言的认识&#xff0c;这五个小游戏不仅有单人&#xff0c;还有人机对战和人人对战。让我们在学习之余来上一局紧张刺激的小游…

C语言趣味小游戏——扫雷(详解版)

前言 ​ 全篇无任何废话&#xff0c;本文的解释大多数都在代码段中&#xff0c;所以一定要看代码&#xff0c;边看边学边理解。 这只是初学者入门的一个小游戏&#xff0c;不难懂&#xff0c;没有什么复杂的内容 可以先学习一下比扫雷还简单的猜数字和三子棋 C语言趣味小游戏—…

C语言小程序游戏

c语言小程序游戏 ​ 本代码是我大一刚学完c语言自己编写的&#xff0c;三个游戏分别是飞机竞速、走迷宫和魔塔&#xff0c;满满的都是回忆。 1、不可能的任务-飞机竞速 ​ 这种游戏在以前小时候玩的游戏机里面玩过&#xff0c;那时抱着个游戏机一玩就是一下午&#xff0c;如…

C语言简易小游戏

文章目录 前言一、猜数字游戏二、旋转光标三、多个字符从两端移动&#xff0c;向中间汇聚四、恶搞&#xff1a;关机小程序五、闪烁的五彩爱心六、扫雷七、三子棋 前言 本篇博客将带领大家自己动手写一下一些C语言小游戏&#xff1b;以增加对于C语言的兴趣&#x1f600;&#x…

c语言成绩管理系统(链表)

C语言实现了学生成绩管理系统&#xff0c;可以进行学生成绩的增加&#xff0c;删除&#xff0c;修改&#xff0c;查询&#xff0c;计算平均成绩和展示。 开发语言&#xff1a;C语言 开发工具&#xff1a;Dev c 开发者&#xff1a;呵呵up 创建学生成绩信息 2. 插入学生信息 3.…

C语言实现学生成绩管理系统设计

本系统有增加学生记录、修改学生记录、删除学生记录、按姓名查询学生记录、按C语言成绩对学生进行排序、退出系统6大功能。 能够对学生的姓名&#xff0c;学号&#xff0c;c语言成绩做相应的操作。 在检测到输入成绩大于55时&#xff0c;会自动加上5。 该管理系统设计功能模块…

c语言成绩管理系统常见错误,求教 学生成绩管理系统出错

已结贴√ 问题点数:20 回复次数:5 求教 学生成绩管理系统出错 小弟刚做了个学生成绩管理系统 编译无错误 但是运行的时候连选择函数都不能 特来求教 望高手解释 代码如下: #include #include #define N 20 #define M 100 struct score {int scr1; int scr2; int scr…

c语言课程设计 学生成绩管理系统

学生成绩管理系统要求&#xff1a; 1、系统功能以菜单方式工作&#xff1b; 2、数据的输入&#xff1b; 3、数据的插入&#xff1b; 4、数据的输出&#xff1b; 5、数据的删除&#xff1b; 6、数据的查找&#xff0c;通常以两种方式进行查找&#xff0c;如姓名、学号&#xff1…

C语言学生成绩管理系统详解

文章目录 一、系统概述二、数据类型三、自定义函数说明四、运行界面五、源代码 源代码请直接跳到最后 引言&#xff1a;最近写了C语言的大作业&#xff0c;感觉做得还行&#xff0c;记录一下&#xff0c;给后人一些参考&#xff0c;给自己留更深印象方便后续改进&#xff01; …

学生成绩管理系统 C语言

基础篇问题&#xff1a; 1.输出如下菜单&#xff1a; *********************学生成绩管理系统******************* * 1 成绩录入 2 成绩查询 3 计算平均分 * * 4 计算最高分 5 排名 6 退出 * ******************************…