C语言---数字迷宫

来源:互联网 发布:php while 死循环 编辑:程序博客网 时间:2024/06/08 00:46

/***************************************
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;}
原创粉丝点击