C语言控制台贪吃蛇2

显示游戏边框及蛇的位置初始化

  一、显示游戏边框

   1、定义二维数组,例如20*48,将并边框按行打印(运行显示边框会卡,暂时不会别的写法QAQ)

注:一个方块两个字节

//定义边框数组
char g_strgameback[20][48] = { 
    "■■■■■■■■■■■■■■■■■■■■■■■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■■■■■■■■■■■■■■■■■■■■■■■
"};

  二、小蛇位置的初始化(链表法后议)

  1、定义小蛇的数组(20*3)

    每个节点装三个数据:x,y,小蛇方向

#define DEF_SNAKE_LONG 20

//定义蛇数组
int g_arrSnake[DEF_SNAKE_LONG][3] = {0};

  2、设定小蛇方向(枚举)

//蛇方向
enum {to_east, to_west, to_south, to_north};

  3、设定小蛇的初始位置然后对节点初始化:用到随机数函数

//为蛇产生随机位置
void SetSnakeRandPos()
{
    int nX = -1;
    int nY = -1;

    //产生随机数
    srand((unsigned int)time(NULL));//中种子
    nX = rand()%19 + 1;//对19取余得0~18,+1得0~19
    nY = rand()%18 + 1;
} 

  4、将小蛇画到背景上

//遍历小蛇数组,将方块拷贝到背景上
strncpy(&g_strgameback[g_arrSnake[i][0]][g_arrSnake[i][1]], "", 2);

   其中用strcpy与strncpy的区别:前者在第二个参数中多出‘’ 导致结果出现以下情况:

  

  全部代码如下(对比之前有所调整)

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <time.h>

//三件套:添加音乐的函数
#include <Windows.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")

#define DEF_SNAKE_LONG 20

//定义边框数组
char g_strgameback[20][48] = { 
    "■■■■■■■■■■■■■■■■■■■■■■■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■                                          ■
",
    "■■■■■■■■■■■■■■■■■■■■■■■
"};

//定义蛇数组
int g_arrSnake[DEF_SNAKE_LONG][3] = {0};

//蛇方向
enum {to_east, to_west, to_south, to_north};

void Cover();//显示首页
void BGM();//播放音乐
void ButtonTest();//显示首页
void ShowBack();//打印游戏边框
void SetSnakeRandPos();//为蛇产生随机位置
void DrawSnake();//将蛇显示到背景上

int main()
{
    BGM();//播放音乐
    Cover();//显示首页
    ButtonTest();//检测按键
    PlaySound(NULL, 0, 0);//停止播放
    system("cls");//清屏

    SetSnakeRandPos();

    while(1)
    {
        system("cls");

        ShowBack();

        Sleep(500);
    }

    system("pause");
    return 0;
}

//显示首页
void Cover()
{
    printf("


			       <<SNAKE>>

");
    printf("


			<<W,S,A,D control move>>

");
    printf("


			    <<space begin>>



");
}

//播放音乐
void BGM()
{
    PlaySound("C:\Windows\Media\Alarm03.wav" , NULL, SND_FILENAME | SND_ASYNC);
    //以C盘系统文件中.wav文件为例
}

//检测按键
void ButtonTest()
{
    char chinput;

    //检测空格
    while(1)
    {
        chinput = _getch();
        if(' ' == chinput)
        {
            break;
        }
    }
}

//打印游戏边框
void ShowBack()
{
    int i = 0;

    for(; i < 20; i++)
    {
        printf(g_strgameback[i]);
    }
}

//为蛇产生随机位置
void SetSnakeRandPos()
{
    int nX = -1;
    int nY = -1;

    //产生随机数
    srand((unsigned int)time(NULL));//中种子
    nX = rand()%19 + 1;//对19取余得0~18,+1得0~19
    nY = rand()%18 + 1;

    //初始化的三个节点
    g_arrSnake[0][0] = nY;        //
    g_arrSnake[0][1] = nY*2;    //
    g_arrSnake[0][2] = to_east;    //方向

    g_arrSnake[1][0] = nY;        
    g_arrSnake[1][1] = nY*2 + 2;    
    g_arrSnake[1][2] = to_east;    

    g_arrSnake[2][0] = nY;        
    g_arrSnake[2][1] = nY*2 + 4;    
    g_arrSnake[2][2] = to_east;    

    //将蛇显示到背景上
    DrawSnake();
}

//将蛇显示到背景上
void DrawSnake()
{
    int i = 0;
    for(; g_arrSnake[i][0] != 0; i++)//遍历每行,遇到初始蛇的位置拷贝方块
    {
        strncpy(&g_strgameback[g_arrSnake[i][0]][g_arrSnake[i][1]], "", 2);
    }
}

运行结果如图:

  

    

原文地址:https://www.cnblogs.com/WinonaJia/p/7684117.html