1. 程式人生 > >C語言控制臺貪吃蛇2

C語言控制臺貪吃蛇2

隨機數函數 edi mms ‘\0’ sign rand() 拷貝 printf rand

顯示遊戲邊框及蛇的位置初始化

  一、顯示遊戲邊框

   1、定義二位數組,例如20*48,將並邊框按行打印(運行顯示邊框會卡,暫時不會別的寫法QAQ)

註:一個方塊兩個字節

//定義邊框數組
char g_strgameback[20][48] = { 
    "■■■■■■■■■■■■■■■■■■■■■■■\n",
    "■                                          ■\n",
    "■                                          ■\n",
    "■                                          ■\n
", "■ ■\n", "■ ■\n", "■ ■\n", "■ ■\n", "■ ■\n", "■ ■\n
", "■ ■\n", "■ ■\n", "■ ■\n", "■ ■\n", "■ ■\n", "■ ■\n
", "■ ■\n", "■ ■\n", "■ ■\n", "■■■■■■■■■■■■■■■■■■■■■■■\n"};

  二、小蛇位置的初始化(鏈表法後議)

  1、定義小蛇的數組(20*3)

    每個節點裝三個數據:x,y,小蛇方向

#define DEF_SNAKE_LONG 20

//定義蛇數組
int g_arrSnake[DEF_SNAKE_LONG][3] = {0};

  2、設定小蛇方向(枚舉)

//蛇方向
enum {to_east = 2, to_west = -2, to_south = 1, to_north = -1};

  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的區別:前者在第二個參數中多出‘\0’ 導致結果出現以下情況:

  技術分享

  全部代碼如下(對比之前有所調整)

#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] = { 
    "■■■■■■■■■■■■■■■■■■■■■■■\n",
    "■                                          ■\n",
    "■                                          ■\n",
    "■                                          ■\n",
    "■                                          ■\n",
    "■                                          ■\n",
    "■                                          ■\n",
    "■                                          ■\n",
    "■                                          ■\n",
    "■                                          ■\n",
    "■                                          ■\n",
    "■                                          ■\n",
    "■                                          ■\n",
    "■                                          ■\n",
    "■                                          ■\n",
    "■                                          ■\n",
    "■                                          ■\n",
    "■                                          ■\n",
    "■                                          ■\n",
    "■■■■■■■■■■■■■■■■■■■■■■■\n"};

//定義蛇數組
int g_arrSnake[DEF_SNAKE_LONG][3] = {0};

//蛇方向
enum {to_east = 2, to_west = -2, to_south = 1, to_north = -1};

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("\n\n\n\t\t\t       <<SNAKE>>\n\n");
    printf("\n\n\n\t\t\t<<W,S,A,D control move>>\n\n");
    printf("\n\n\n\t\t\t    <<space begin>>\n\n\n\n");
}

//播放音樂
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);
    }
}

運行結果如圖:

  技術分享

    

C語言控制臺貪吃蛇2