效果比较简陋,但功能都可以实现的
先来是上几张图吧
哈哈大体效果就是这样的,Emmmm
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <stdlib.h>
#define Hight 20
#define Width 30
#define speed 200
void init();
void show();
void move();
void gotoxy(int a, int b);
void check();
int length;
char input;
int moveDirection;
int over = 0;
int food_x, food_y;
int i, j;
int flag;
char map[Hight][Width];
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, -1, 0, 1};
struct snake {
int x, y;
int Direction;
}fellow[100];
int main()
{
init(); //初始化
while (1)
{
show(); //显示图形
move(); //移动
}
return 0;
}
/*界面初始化*/
void init()
{
int i, j;
length = 5;
//设置地图
for (i = 0; i < Hight; i++)
{
for (j = 0; j < Width; j++)
{
map[i][j] = '*';
}
}
for (i = 1; i < Hight - 1; i++)
{
for (j = 1; j < Width - 1; j++)
{
map[i][j] = ' ';
}
}
//初始化蛇身蛇头数据
for (i = 0; i < 100; i++)
{
fellow[i].x = 0;
fellow[i].y = 0;
fellow[i].Direction = 0;
}
fellow[0].x = 1; fellow[0].y = 1;
fellow[1].x = 1; fellow[1].y = 2;
fellow[2].x = 1; fellow[2].y = 3;
fellow[3].x = 1; fellow[3].y = 4;
fellow[4].x = 1; fellow[4].y = 5;
fellow[4].Direction = 3; //初始化默认向右移动
map[fellow[4].x][fellow[4].y] = '@';
for (i = 0; i < length - 1; i++)
{
map[fellow[i].x][fellow[i].y] = 'X';
}
/*随机产生一个食物*/
food_x = rand() % 15 + 3;
food_y = rand() % 20 + 3;
if (map[food_x][food_y] == ' '&& map[food_x][food_y] != 'X')
{
map[food_x][food_y] = 'O';
}
}
/*显示图形*/
void show()
{
int i, j;
gotoxy(1, 1);
Sleep(speed);
for (i = 0; i < Hight; i++)
{
for (j = 0; j < Width; j++)
{
printf("%c", map[i][j]);
}
printf("\n");
}
}
/*蛇的移动*/
void move()
{
flag = length;
check();
if (flag == length)
{
for (i = 0; i < length - 1; i++)
{
if (i == 0)
{
//蛇尾清空, 将前一位坐标置给后一位
map[fellow[i].x][fellow[i].y] = ' ';
fellow[i].x = fellow[i + 1].x;
fellow[i].y = fellow[i + 1].y;
}
else
{
//将前一位坐标置给后一位
fellow[i].x = fellow[i + 1].x;
fellow[i].y = fellow[i + 1].y;
}
map[fellow[i].x][fellow[i].y] = 'X';
}
fellow[length - 1].x = fellow[length - 1].x + dx[fellow[length - 1].Direction];
fellow[length - 1].y = fellow[length - 1].y + dy[fellow[length - 1].Direction]; //将蛇头按照前进方向移动一个单位
map[fellow[length - 1].x][fellow[length - 1].y] = '@';
}
else
{
map[fellow[length - 2].x][fellow[length - 2].y] = 'X'; //原蛇头的位置变成‘X’
fellow[length - 1].Direction = fellow[length - 2].Direction;
fellow[length - 1].x = fellow[length - 2].x + dx[fellow[length - 2].Direction];
fellow[length - 1].y = fellow[length - 2].y + dy[fellow[length - 2].Direction];
map[fellow[length - 1].x][fellow[length - 1].y] = '@';
}
if (_kbhit())
{
input = _getch();
switch (input)
{
case 'W': fellow[length - 1].Direction = 0; break; //向上
case 'A': fellow[length - 1].Direction = 1; break; //向左
case 'S': fellow[length - 1].Direction = 2; break; //向下
case 'D': fellow[length - 1].Direction = 3; break; //向右
}
}
}
/*检测判断函数*/
void check()
{
int head_x, head_y;
head_x = fellow[length - 1].x + dx[fellow[length - 1].Direction];
head_y = fellow[length - 1].y + dy[fellow[length - 1].Direction];
/*如果小蛇撞墙or碰到自身则游戏结束*/
if (map[head_x][head_y] == '*' || map[head_x][head_y] == 'X')
{
//显示GAME OVER
map[8][8] = 'G'; map[8][9] = 'A'; map[8][10] = 'M'; map[8][11] = 'E';
map[8][13] = 'O'; map[8][14] = 'V'; map[8][15] = 'E'; map[8][16] = 'R';
map[8][12] = ' ';
show();
over = 1; //标志位置1
if (over)
{
over = 0;
printf("游戏结束重新开始请输入:K\n");
while (1)
{
if (_kbhit())
{
input = _getch();
if (input == 'K')
{
system("cls"); //清屏
for (i = 0; i < Hight; i++)
{
for (j = 0; j < Width; j++)
{
printf("%c", map[i][j] = ' ');
}
printf("\n");
} //清空数组
init();
flag = 5;
break;
}
}
}
}
}
/*检测到是否吃到食物*/
if (map[head_x][head_y] == 'O')
{
length++;
map[food_x][food_y] = ' '; //吃到食物后位置清空
food_x = rand() % 15 + 3;
food_y = rand() % 20 + 3;
if (map[food_x][food_y] == ' ' && map[food_x][food_y] != 'X')
{
map[food_x][food_y] = 'O'; //重新再产生一个食物
}
}
}
void gotoxy(int a, int b)
{
COORD pos;
pos.X = a - 1;
pos.Y = b - 1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}