其實還是比較簡單的,總的來說就是運行的時候注意上下左右調整爲大寫輸入,
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);
}
}
如果有問題請留下