/***************************************
title: C语言–数字迷宫 Date: 2016/7/10
Description:
1、 系统主要地图为固定模式
2、 地图内部包含墙体、走廊、阿拉伯数字(1~7)、玩家头像(1个)四种不同内容
3、 用户通过上、下、左、右按键来控制玩家头像在地图范围内的走动
4、 在玩家走动过程中,碰撞墙壁时,该步的走动无效,玩家头像原地不变
5、 玩家允许在设计走廊内部进行走动
6、 玩家头像遇到阿拉布数字时,数字消失,并且对玩家走动无影响
7、 玩家头像遭遇所有数字之后(地图上无阿拉伯数字),该局游戏结束,并自动开始下一局游戏
8、 在某一局游戏中,游戏走廊、墙体与其他游戏相同,但数字位置会随机产生
9、 阿拉伯数字产生在走廊内而非墙体上
10、在玩家游戏过程中按下Esc键,游戏无条件退出。
11、在玩家未使用Esc键时,程序结束
***************************************/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include "windows.h"
#include <conio.h>
#pragma comment(lib,"winmm.lib")
int code[17][24]={ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0,-1,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0,-1,-1,-1, 0, 0,
0,-1, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0,
0,-1,-1,-1,-1,-1, 0,-1,-1,-1,-1,-1, 0,-1, 0,-1,-1,-1,-1,-1,-1,-1, 0, 0,
0,-1, 0, 0,-1, 0,-1, 0, 0, 0, 0,-1, 0,-1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0,
0,-1,-1,-1,-1,-1,-1, 0, 0, 0, 0,-1, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0,
0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1, 0,
0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,-1, 0, 0,-1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0,-1, 0,-1, 0, 0,-1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0,-1, 0,-1,-1,-1,-1, 0,-1,-1, 0,
0, 0, 0, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0, 0,-1, 0, 0,
0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0,
0, 0,-1,-1,-1,-1, 0, 0, 0, 0, 0, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0,
0,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} ;
int position1=1, position2=1; //迷宫的初始点
int x=2,y=1; //头像的初始位置
clock_t starttime,endtime; //计时
int object=20; //游戏的最高记录
int d=1; //游戏局数
/*
**函数名:gotoxy
**函数功能:该函数用于在x,y位置输出用户头像
**入口参数:x,y
**出口参数:无
*/
void gotoxy(int x, int y) //光标移动
{
COORD player;
player.X=x;
player.Y=y;
SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), player );
}
void color(int b) //颜色函数
{
HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ;
SetConsoleTextAttribute(hConsole,b) ;
}
/*
**函数名:setcode
**函数功能:该函数通过传入的值来判断并输出为:■,空格*2,或者数字本身
**入口参数:int i,int j
**出口参数:无
*/
void setcode(int i,int j)
{
gotoxy(2*j,i);
if(code[i][j]==0)
{
color(4);
printf("■");
}
else if(code[i][j]==-1)
{
printf(" ");
}
else
{
color(7);
printf("%d ",code[i][j]);
}
}
/*
**函数名:setwindow
**函数功能:生成地图主体函数:遍历公共数组,在位置部位(1,1)时,调用SetCode函数,并在(1,1)位置输出玩家头像
**入口参数:无
**出口参数:无
*/
void setwindow()
{
int i,j;
for(i=0;i<17;i++)
{
int k=i;
for(j=0;j<24;j++)
{
setcode(i,j);
}
printf("\n");
}
gotoxy(10,18);
color(7);
printf("目前游戏最快纪录 %d 秒",object);
printf("\n\n\t第 %d 局游戏正在进行中...",d++);
printf("\n Press up down left right key please !\t\n");
gotoxy(x,y); //笑脸起始位置
color(7);
printf("\1 ");
}
/*
**函数名:setnum
**函数功能:程序初始化时,用于使用随机函数在数组"走廊"位置生成1~7的阿拉伯数字
**入口参数:无
**出口参数:无
*/
void setnum()
{
int hang,lie;
int i=0;
srand(time(NULL));// srand初始化随机种子,rand产生随机数
while(i<7)
{
hang=rand()%17; //行在0-16内随机产生
lie=rand()%24; //列在0-23内随机产生
if(code[hang][lie]== -1)
{
if(hang!=1&&lie!=1)
{
code[hang][lie]=++i;
}
}
}
}
/*
**函数名:CheckLeftNum
**函数功能:该函数判断数组内剩余的数字(>0)数量,返回该数量
**入口参数:无
**出口参数:无
*/
int CheckLeftNum()
{
int i,j,num=0;
for(i=0;i<17;i++)
{
for(j=0;j<24;j++)
{
if(code[i][j]>0)
{
num++;
}
}
}
return num;
}
/*
**函数名:upkey downkey leftkey rightkey
**函数功能:玩家按下,上下左右按键时,分别调用的函数,该函数可判断玩家是否为被墙体阻挡、
正常行走、"吃"掉数字三种状态,并改变玩家头像的位置。
**入口参数:无
**出口参数:无
*/
void upkey() //上移
{
if(code[position1-1][position2]!= 0)
{
if(code[position1-1][position2]>0)
{
code[position1-1][position2]=-1; //遇到数字,换成-1
}
gotoxy(x,y);
printf(" ");
y--;
position1--;
}
}
void downkey() //下移
{
if(code[position1+1][position2]!= 0)
{
if(code[position1+1][position2]>0)
{
code[position1+1][position2]=-1; //遇到数字,换成-1
}
gotoxy(x,y);
printf(" ");
y++;
position1++;
}
}
void leftkey() //左移
{
if(code[position1][position2-1]!= 0)
{
if(code[position1][position2-1]>0)
{
code[position1][position2-1]=-1; //遇到数字,换成-1
}
gotoxy(x,y);
printf(" ");
x=x-2;
position2--;
}
}
void rightkey() //右移
{
if(code[position1][position2+1]!= 0)
{
if(code[position1][position2+1]>0)
{
code[position1][position2+1]=-1; //遇到数字,换成-1
}
gotoxy(x,y);
printf(" ");
x=x+2;
position2++;
}
}
/*
**函数名:begin
**函数功能:输入按键进行游戏
**入口参数:无
**出口参数:c
*/
int begin()
{
int num;
char c;
while(1)
{
gotoxy(x,y); //光标定位在新位置
printf("\1 ");
num=CheckLeftNum(); //随机数为零,重新一局
if(num==0)
{
break;
}
c=getch();
if(c==27) //返回Esc ,游戏结束
return c;
else if(c==72)
upkey();
else if(c==80)
downkey();
else if(c==75)
leftkey();
else if(c==77)
rightkey();
}
return 0;
}
/*
**函数名:main
**函数功能:主函数,连接各种子函数
**入口参数:无
**出口参数:无
*/
int main()
{
int end,n;
while(1)
{
PlaySound("d:\\Dub.wav",NULL,SND_LOOP|SND_ASYNC|SND_FILENAME); //播放背景音乐
starttime=time(NULL);
setnum();
setwindow();
end=begin();
endtime=time(NULL);
if(end==27) //游戏结束
{
break;
}
position1=1;
position2=1;
x=2;
y=1;
n=endtime-starttime; //游戏时间
if(n>object)
{
gotoxy(15,8);
printf("OUT!!! 很遗憾,游戏超时");
Sleep(4000);
break;
}
else if(n<object) //所用时间低于最好记录则更新最新记录
{
object=n;
gotoxy(15,8);
printf("恭喜您!用时%ld秒打破纪录!!",n);
}
else if(n>=object)
{
gotoxy(15,8);
printf("加油!本局游戏共用时%ld秒",n);
}
Sleep(4000);
}
return 0;
}