C語言寫的簡單貪喫蛇程序,實現WASD控制蛇運動,輸入輸出流爲C++

其實還是比較簡單的,總的來說就是運行的時候注意上下左右調整爲大寫輸入,

WASD控制上下左右,大笑
在程序內部有解釋程序的構造。

# include "snack.h"

int main()
{
    int counter = 50;
    InitFrame();
    Wall();
    InitSnack();
    Create_apple();
    char ch = 'D';
    char ch1 = ch;
    while(1)
    {
        Handle(0,N+2);
        if(_kbhit())//判斷是否鍵入
        {

            ch = _getch();
            if(!(ch1 == ch+3 || ch1 == ch-3 || ch1 == ch+4 || ch1 == ch-4))//判斷
             ch1 = ch;
            Shift_Snack(ch1);
            counter = 0;

        }
        else{
                Sleep(10);
                counter++;
        }
        if(counter >= 50)
        {
            Shift_Snack(ch1);
            counter = 0;

        }
        if (flag_1 == 0)
            break;
    }
    //getchar();
    Handle(0,N+2);
    return 0;
}
下面爲.h文件

#include <iostream>
using namespace std;
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>

#define N 20
#define ERROR 0
#define OK 1
typedef struct Snack
{
    int x;
    int y;
    int flag;
    char way;
}Snack;
bool flag_1 = 1;
Snack snack[N+1][N+1];//構建數據結構
Snack *head;
Snack *nail;
Snack *m_head;
Snack *m_nail;
Snack apple;

void InitFrame();//函數聲明
void InitSnack();//創建蛇身
void Wall();//創建城牆
void Handle(int x,int y);//光標位置
void Color(int color);//控制檯顏色函數
int Shift_Snack();//移動蛇身函數
void Remove_nail();//去除蛇尾函數
void Create_apple();//產生蘋果函數

void Create_apple()
{
    int x,y;
    srand(time(NULL));//產生隨機種子
    do{
    x = (int)(N * rand() / (RAND_MAX + 1.0));//產生隨機數
    y = (int)(N * rand() / (RAND_MAX + 1.0));//產生隨機數
    }while(snack[x][y].flag != 0);
    apple = snack[x][y];
    Handle(apple.x,apple.y);
    cout<<char(15);
}
void Remove_nail()
{
    if(head->x == apple.x && head->y == apple.y)//喫到蘋果則產生下一個蘋果
    {
        Create_apple();
    }
    else//如果沒有喫到蘋果則需要修改尾部位置
    {
        switch(nail->way)
    {
    case 'W':
        nail = &snack[nail->x][nail->y-1];break;
    case 'A':
        nail = &snack[nail->x-1][nail->y];break;
    case 'S':
        nail = &snack[nail->x][nail->y+1];break;
    case 'D':
        nail = &snack[nail->x+1][nail->y];break;
    }
        m_nail->flag = 0;//歸零
        Handle(m_nail->x,m_nail->y);
        cout<<" ";//抹去尾巴
    }

}
int Shift_Snack(char ch)//轉移蛇身
{
    m_head = &snack[head->x][head->y];
    m_nail = &snack[nail->x][nail->y];
    switch(ch)
    {
    case 'W':
        head = &snack[head->x][head->y-1]; m_head->way = 'W'; break;
    case 'A':
        head = &snack[head->x-1][head->y]; m_head->way = 'A'; break;
    case 'S':
        head = &snack[head->x][head->y+1]; m_head->way = 'S'; break;
    case 'D':
        head = &snack[head->x+1][head->y]; m_head->way = 'D'; break;
    }

    if (head->flag == 1){//如果撞牆或着撞蛇身,則死亡
            flag_1 = 0;
            return ERROR;
    }

    head->flag = 1;
    Handle(head->x,head->y);
    cout<<char(2);
    Handle(m_head->x,m_head->y);//把原來的舌頭替換爲蛇身狀態
    cout<<char(3);
    Remove_nail();
    return OK;
}
void InitFrame()//構造整體框架,並對數據結構賦值
{
    int i = 0, j = 0;
    for(;i <= N+1 ;i++)
      for(j = 0; j <= N+1; j++)
    {
        snack[i][j].x = i;
        snack[i][j].y = j;
        snack[i][j].flag = 0;//使每個點狀態值均爲零
    }
}
void InitSnack()
{
    head = &snack[2][1]; head->flag = 1; head->way = 'D';
    nail = &snack[1][1]; nail->flag = 1; nail->way = 'D';//初始狀態水平向右
    Handle(nail->x,nail->y);
    //Color(4);
    cout<<char(3);
    Handle(head->x,head->y);
    //Color(4);
    cout<<char(2);
    head->flag = nail->flag = 1;

}
void Handle(int x,int y)//使光標至於當前位置
{
    HANDLE hOut;
    COORD pos = {short(x),short(y)};
    hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOut, pos);
}
void Color(int color)//顏色分佈函數,得到不同的配色
{
    HANDLE hOut;
    hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hOut,color);
}
void Wall()
{
    int i,j;
    for(i = 0,j = 0; j <= N+1; j++)
    {
        snack[i][j].flag = 1;
        Handle(i,j);
        cout<<char(4);
    }
    for(i = 0,j = 0; i <= N+1; i++)
    {
        snack[i][j].flag = 1;
        Handle(i,j);
        cout<<char(4);
    }
    for(i = N+1,j = 0; j <= N+1; j++)
    {
        snack[i][j].flag = 1;
        Handle(i,j);
        cout<<char(4);
    }
    for(i = 0,j = N+1; i <= N+1; i++)
    {
        snack[i][j].flag = 1;
        Handle(i,j);
        cout<<char(4);
    }
}
如果有問題請留下大笑

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章