C语言---数字迷宫

1 篇文章 0 订阅

/***************************************
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;
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值