凤凰谪仙 2023-05-30 22:33 采纳率: 100%
浏览 97
已结题

C语言频闪问题与时间显示

C语言迷宫游戏设计如何解决屏幕严重刷屏问题同时实现运行时间的显示?


/* 迷宫游戏.exe 3.0 */ 
#include<stdio.h> //标准输入输出头文件 
#include<stdlib.h> //函数system():发出一个DOS命令 
#include<conio.h> //函数kbhit():检测键盘是否按下; 函数getch():获取用户输入(无需回车) 
#include<windows.h> //函数Sleep():将程序挂起一段时间 
#include<time.h> //计算游戏时间 
#define N 50
#define M 50
void Show(int maze[][M],int n,int m);
void MazeUpdate(int maze[][M],int n,int m,double start); 
int maze[N][M] =
{{1,1,1,1,1,1,1,1,1,1,1,1,1,1,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,2,1},
 {1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
 {1,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1},
 {1,0,1,0,1,0,1,1,1,0,1,1,0,0,1,0,1,0,0,1,0,1,1,0,1},
 {1,0,1,0,1,0,0,0,1,0,0,1,0,1,1,0,0,0,0,1,1,0,1,1,1},
 {1,0,0,0,1,1,1,0,1,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,1},
 {1,0,1,1,1,0,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1,1,0,1},
 {1,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1},
 {1,0,1,0,1,0,1,0,1,1,0,1,1,0,1,1,1,1,0,1,1,1,0,1,1},
 {1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,3},
 {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};
double times;
int main(void)
{
    clock_t start; //首先用clock_t定义两个变量储存开始与结束值 
    printf("游戏加载中...\n");
    Sleep(500);
    system("PAUSE");
    start = clock(); //记录开始时间
    int n = 12,m = 25;  // n行m列 
    Show(maze,n,m);  
    MazeUpdate(maze,n,m,start);
    
    return 0;
}


//函数功能:显示迷宫地图 
void Show(int maze[][M],int n,int m) 
{
    int i,j;
    for (i=0;i<n;i++) //显示n行m列迷宫地图数据 
    {
        for (j=0;j<m;j++)
        {
            if (maze[i][j]==0)
            {
                printf("  "); //显示路径 
            }
            else if (maze[i][j]==1)
            {
                printf("▓ "); //显示障碍物 
            }
            else if (maze[i][j]==2)
            {
                printf("☆"); //显示电子鼠    
            }
            else if (maze[i][j]==3)
            {
                printf("★");
            }
        }
        printf("\n"); 
    }
}

//函数功能:完成与用户输入有关的迷宫更新
void MazeUpdate(int maze[][M],int n,int m,double start)
{
    int x = 1,y = 23; //初始位置
    int exitX = 10, exitY = 24; //迷宫出口
    char input;
    clock_t end; 
    while (x!=exitX || y!=exitY) //判断是否达到迷宫出口 
    {
        if (kbhit()) //检查是否有键盘输入,没有就继续循环
        {
            input = getch(); //从键盘获取输入(不会在屏幕显示) 
            if (input=='a' && maze[x][y-1]!=1) //左移
            {
                maze[x][y] = 0;
                y--;
                maze[x][y] = 2;    
            }
            if (input=='d' && maze[x][y+1]!=1) //右移
            {
                maze[x][y] = 0;
                y++;
                maze[x][y] = 2;    
            }
            if (input=='w' && maze[x-1][y]!=1) //上移
            {
                maze[x][y] = 0;
                x--;
                maze[x][y] = 2;
            }
            if (input=='s' && maze[x+1][y]!=1) //下移 
            {
                maze[x][y] = 0;
                x++;
                maze[x][y] = 2; 
            }
        } 
        system("cls"); //清屏
        printf("    \t\t迷宫游戏3.0.exe\n"); 
        if (x!=exitX || y!=exitY) //副标题提示进行和结束 
        {
            printf("    \t\t    进行中\n");
        } 
        else
        {
            printf("    \t\t    已结束\n");
        }
        Show(maze,n,m); //显示更新后的迷宫
        Sleep(100); //延时100ms
        
        end = clock(); //记录结束时间 
        times = ((double)(end-start))/CLK_TCK;
        printf("总用时间%.1fs",times); 
        
          
    }
    printf("You win!\n");
    system("PAUSE"); //Windows系统下暂停程序运行 
} 


img

  • 写回答

4条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-06-01 23:04
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7693362
    • 你也可以参考下这篇文章:C语言 详解如何编写闪烁显示字符串的函数
    • 你还可以看下c语言参考手册中的 c语言-成员访问与间接
    • 除此之外, 这篇博客: C语言双向链表实现对字符串的存储中的 构造展示双向链表元素的函数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
      // 展示字符串内容的函数 
      void displayLink(link *head){
      	while(head != NULL){
      		for(int i = 0; i < linkNum; i++){
      			printf("%c", head->a[i]);
      		}
      		head = head->next;
      	}
      	printf("\n"); 
      }
      
    • 您还可以看一下 贺利坚老师的C语言及程序设计初步课程中的 数值数据类型及表示小节, 巩固相关知识点
    • 以下回答来自chatgpt:

      针对迷宫游戏频繁刷屏导致用户体验下降的问题,一个解决方案是使用ncurses库,在控制台中使用其提供的函数进行控制台输出的刷新,避免频繁刷屏。具体步骤如下:

      1. 安装ncurses库:在Linux中使用命令sudo apt-get install libncurses5-dev安装ncurses库。

      2. 在程序中包含ncurses.h头文件。

      3. 在需要输出的位置,使用ncurses库提供的函数进行输出,例如使用move()函数移动光标到指定的位置,使用printw()函数进行输出。

      4. 使用refresh()函数刷新输出。

      相关代码示例:

      #include <ncurses.h> 
      int main() 
      { 
          initscr(); //初始化
          printw("Hello, World!"); //输出
          refresh(); //刷新
          getch(); //等待输入
          endwin(); //结束
          return 0; 
      }
      

      针对时间的显示,一个解决方案是使用time.h头文件中的函数获取当前时间,并使用ncurses库输出时间信息。具体步骤如下:

      1. 包含time.h头文件。

      2. 使用time()函数获取当前时间。

      3. 使用localtime()函数将时间转换为本地时间结构体tm类型。

      4. 使用strftime()函数将tm类型的时间格式化为字符串。

      5. 使用ncurses库输出时间字符串。

      相关代码示例:

      #include <time.h>
      #include <ncurses.h>
      
      int main() 
      {
          time_t current_time;
          struct tm * time_info;
          char time_string[9]; //存储时间字符串
          initscr();
          time(&current_time); //获取当前时间
          time_info = localtime(&current_time); //转换为本地时间
          strftime(time_string, sizeof(time_string), "%H:%M:%S", time_info); //格式化为字符串
          printw("Current Time: %s", time_string); //输出
          refresh();
          getch();
          endwin();
          return 0;
      }
      

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 请提交代码 7月14日
  • 系统已结题 6月11日
  • 已采纳回答 6月3日
  • 修改了问题 5月30日
  • 展开全部

悬赏问题

  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 C#连接不上服务器,
  • ¥15 angular项目错误