• c语言贪吃蛇详解-2.画出蛇


    c语言贪吃蛇详解-2.画出蛇

    前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解。我将分几步来教大家写一个贪吃蛇小游戏。由于大家c语言未学完,这个教程只涉及数组和函数等知识点。

    蛇的身体就是一些点,我们可以用二维数组把这些点的坐标存起来。

    先声明一个足够大的二维数组。虽然我觉得你们玩不了这么长(手动滑稽)。

    int s[H*W][2];

    这样s[0][0]表示蛇头的i坐标,s[0][1]表示蛇头的j坐标。s[i][0]表示蛇第i+1个点的i坐标。s[i][1]同理。

    然后再声明一个int变量存储蛇的长度。然后把这些初始化操作都放进上面init函数里面。

    int sLength;        //蛇的长度
    sLength=4;          //让蛇的最初长度为4

     然后给刚开始的蛇身几个初始坐标

    s[0][0]=H/2;
    s[0][1]=W/2;      
    for(i=1;i<4;i++)
    {
      s[i][0]=s[0][0]+i;
      s[i][1]=s[0][1]; //给刚开始的蛇身几个初始坐标
    }

    然后接下来我们把蛇画出来,我这里有一个函数(百度的),可以实现移动光标到指定点。注:要添加头文件windows.h

    如下:

    void gotoxy(int i,int j)
    {
        COORD position={j,i};
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),position);
    }

    然后就可以先画地图,然后通过移动光标在地图上画出蛇。

    void drawSnake()
    {
        int i;
        for(i=0;i<sLength;i++)
        {
            gotoxy(s[i][0],s[i][1]);        //移动关标到蛇的坐标
            printf("@");                    //在这个位置画蛇
        }
    }

    好,看看效果

    蛇确实出来了,但是那个光标很碍事,在init函数开始时加入下面代码可隐藏关标

    CONSOLE_CURSOR_INFO cursor_info = {1, 0}; 
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);

     

    这样就没有光标了。

    到现在为止的代码。

    #include <stdio.h>
    #include <stdlib.h>
    #include<windows.h>
    
    #define H 23
    #define W 75
    
    int a[H][W];        //地图数组
    int s[H*W][2];      //蛇身坐标数组
    int sLength;        //蛇的长度
    void init()         //程序开始时的初始化操作
    {
        CONSOLE_CURSOR_INFO cursor_info = {1, 0};
        SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);    //隐藏关标
        int i,j;
        for(i=0; i<H; i++)
        {
            a[i][0]=1;          //让第一列为1
            a[i][W-1]=1;        //让最后一列为1
        }
        for(j=0; j<W; j++)
        {
            a[0][j]=1;      //让第一行为1
            a[H-1][j]=1;    //让最后一行为1
        }
        sLength=4;          //让蛇的最初长度为4
        s[0][0]=H/2;
        s[0][1]=W/2;        //给蛇头坐标赋值
        for(i=1;i<4;i++)
        {
            s[i][0]=s[0][0]+i;
            s[i][1]=s[0][1];  //给刚开始的蛇身几个初始坐标
        }
    
    }
    
    void gotoxy(int i,int j)        //移动光标
    {
        COORD position={j,i};
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),position);
    }
    
    void drawMap()                  //画地图
    {
        int i,j;
        for(i=0;i<H;i++)
        {
            for(j=0;j<W;j++)            //两重for循环遍历数组
            {
                if(a[i][j]==0)          //为0输出空格
                    printf(" ");
                else                    //为1输出#
                    printf("#");
            }
            printf("
    ");               //别忘了换行
        }
    }
    
    void drawSnake()                //画蛇
    {
        int i;
        for(i=0;i<sLength;i++)
        {
            gotoxy(s[i][0],s[i][1]);        //移动关标到蛇的坐标
            printf("@");                    //在这个位置画蛇
        }
    }
    
    int main()
    {
        init();                     //程序开始时的初始化操作
        drawMap();                  //画地图
        drawSnake();                //画蛇
        getchar();
        return 0;
    }
  • 相关阅读:
    .NET 6 Minimal APIs
    ABP标准模型来处理异常
    分析Clean Architecture
    Visual Studio单元测试命令行方式之MSTest.exe命令
    NuGet的使用、部署、搭建私有服务
    版本号的语义化版本控制 2.0.0 标准
    Visual Studio的各个历史版本下载及安装教程
    PyQt5 事件机制
    PyQt5 QObject 对象删除
    PyQt5 定时器事件
  • 原文地址:https://www.cnblogs.com/hjw1/p/7911995.html
Copyright © 2020-2023  润新知