C语言实现迷宫小游戏
C大程的一个作业,实在无聊也可以用来娱乐~
//maze.h
// //maze.h #include <stdio.h> #include <windows.h> #include <stdlib.h> #define Wall 1 #define Road 0 #define Start 2 #define End 3 #define Up 1 #define Down 2 #define Left 3 #define Right 4 #define n1 25/*定义行范围*/ #define n2 25/*定义列范围*/ int Length, Width; //创建一个结构体存储数组信息 typedef struct node { int x; int y; int c; } linkstack; int map[n1][n2]; /*创建一个二维数组*/ linkstack top[n1 * n2]; /*创建一个N*N的栈*/ //移动坐标 void gotoxy(int x, int y); //隐藏光标 void hidden(); //随机生成迷宫 void create(int x, int y); //接收按键 int get_key(); //画迷宫 void paint(int x, int y); //控制 void game();
//maze.c
// //maze.c #include "maze.h" //移动坐标 void gotoxy(int x, int y) { COORD pos = { x, y }; HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);/* 获取标准输出设备句柄*/ SetConsoleCursorPosition(hOut, pos);/*两个参数分别是指定哪个窗体,具体位置*/ } //隐藏光标 void hidden() { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO cci; GetConsoleCursorInfo(hOut, &cci); cci.bVisible = 0;/*赋1为显示,赋0为隐藏*/ SetConsoleCursorInfo(hOut, &cci); } //随机生成迷宫 void create(int x, int y) { int c[4][2]={0,1,1,0,0,-1,-1,0}; int i, j, t; for(i=0;i<4;i++) { j=rand()%4; t=c[i][0];c[i][0]=c[j][0];c[j][0]=t; t=c[i][1];c[i][1]=c[j][1];c[j][1]=t; } map[x][y]=Road; for(i=0;i<4;i++) if(map[x + 2 * c[i][0]][y + 2 * c[i][1]]==Wall) { map[x + c[i][0]][y + c[i][1]]=Road; create(x+2*c[i][0], y+2*c[i][1]); } map[2][1]=Start;/*给定入口*/ map[Width - 1][Length]=End;/*给定出口*/ } //接收按键 int get_key() { char c; while (c = getch()) { c = getch(); if (c == 72) return Up;/*上*/ if (c == 80) return Down;/*下*/ if (c == 75) return Left;/*左*/ if (c == 77) return Right;/*右*/ } return 0; } //画迷宫 void paint(int x, int y) { int i; gotoxy(2 * y + 1, x + 7); switch (map[x][y]) { case Start: printf("入"); break;/*画入口*/ case End: printf("出"); break;/*画出口*/ case Wall: printf("%c%c", 0xa8, 0x80); break; /*画墙*/ case Road: printf("※"); break;/*画路*/ } } //控制 void game() { int x = 2, y = 1;/*玩家当前位置,刚开始在入口处*/ int c;/*用来接收按键*/ while (1) { gotoxy(2 * y + 1, x + 7); printf("★ ");/*画出玩家当前位置*/ if (map[x][y] == End)/*判断是否到达出口*/ { gotoxy(50, 15); printf("到达终点,按任意键结束"); gotoxy(2 * y + 1, x + Width - 13); break; } c = get_key(); switch (c) { case Up:/*向上走*/ if (map[x - 1][y] != Wall) { paint(x, y); x--; } break; case Down:/*向下走*/ if (map[x + 1][y] != Wall) { paint(x, y); x++; } break; case Left:/*向左走*/ if (map[x][y - 1] != Wall) { paint(x, y); y--; } break; case Right: /*向右走*/ if (map[x][y + 1] != Wall) { paint(x, y); y++; } break; } } }
//main.c
// //main.c #include "maze.h" int main() { system("COLOR 00"); int i, j, w; printf("欢迎来到迷宫小游戏! "); printf("生成迷宫请按:1 "); printf("退出游戏请按:2 "); printf(" "); printf("输入您的选择:"); scanf("%d", &w); switch (w)/*若输入的W为1或2,则继续程序*/ { case 1: printf("输入迷宫宽度(提示:不能大于25且必须为奇数):");/*W为1时*/ scanf("%d", &Width); printf("输入迷宫长度(提示:不能大于25且必须为奇数):");/*W为1时*/ scanf("%d", &Length); printf(" "); for (i = 65; i <= (Length + 64); i++) printf("%c ", i); printf(" "); for (i = 65; i <= (Length + 64); i++) printf(" %c ", i); system("COLOR 70"); srand((unsigned)time(NULL)); /*初始化随机种子*/ hidden();/*隐藏光标*/ for (i = 0; i <= Length + 1; i++) for (j = 0; j <= Width + 1; j++) if (i == 0 || i == Length + 1 || j == 0 || j == Width + 1) /*初始化迷宫*/ map[i][j] = Road; else map[i][j] = Wall; create(2 * (rand() % (Length / 2) + 1), 2 * (rand() % (Width / 2) + 1)); /*从随机一个点开始生成迷宫,该点行列都为偶数*/ for (i = 0; i <= Length + 1; i++)/*边界处理*/ { map[i][0] = Wall; map[i][Width + 1] = Wall; } for (j = 0; j <= Width + 1; j++)/*边界处理*/ { map[0][j] = Wall; map[Length + 1][j] = Wall; } for (i = 1; i <= Length; i++) for (j = 1; j <= Width; j++)/*画出迷宫*/ paint(i, j); game();/*开始游戏*/ getch(); return 0; break; case 2: printf("欢迎下次使用!"); break; default: break; } }
相关推荐
chensen 2020-11-14
拉斯厄尔高福 2020-11-04
杜倩 2020-10-29
拉斯厄尔高福 2020-10-19
嵌入式资讯精选 2020-10-15
zhaochen00 2020-10-13
penkgao 2020-10-13
yiyilanmei 2020-10-05
wanshiyingg 2020-09-29
Mars的自语 2020-09-27
shenwenjie 2020-09-24
一个逗逗 2020-09-22
flycony 2020-09-13
zhaochen00 2020-08-20
Biao 2020-08-20
qingsongzdq 2020-08-19
penkgao 2020-08-17
cetrolchen 2020-08-14
GuoSir 2020-08-07