简单实现贪吃蛇玩法(非智能版还没那水平)

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
#include <graphics.h>
#define N 200
#define MAP_X 18
#define MAP_Y 35
#define SPEED 150
int start,end;
char G='T';
enum BLock
{
BLOCK_NULL,
BLOCK_FRAME,
BLOCK_BL,
SNAKE,
SNAKW,
FOOD
};
enum detectin
{
LEFT,
RIGHT,
UP,
DOWN, 
LU,
LD,
RU,
RD
};
typedef struct food
{
char x;
char y;//食物坐标
char Yes;//判断是否需要随机食物
}F;
typedef struct snake
{
char x[N];
char y[N];//蛇 以及蛇身地的坐标
char detection;
char num;//蛇身的节数
}S;
char MapArr[MAP_X][MAP_Y] = { 0 };
S Snake;
F SnF;
char key()//检测用户键入
{
if (_kbhit())
return _getch();
return 0;
}
void Food()
{


if (SnF.Yes != 'F')
{
SnF.x = rand() % 15 + 2;
SnF.y = rand() % 33 + 1;
MapArr[SnF.x][SnF.y] = FOOD;
SnF.Yes = 'F';
}
}


void SK()//初始化蛇
{
Snake.num = 4;
Snake.x[0] = 10;
Snake.y[0] = 10;
Snake.x[1] = 10;
Snake.y[1] = 9;
Snake.x[2] = 10;
Snake.y[2] = 8;
Snake.x[3] = 10;
Snake.y[3] = 7;
Snake.detection = RIGHT;//右移
}
void Move(int m, int n)//判断键入的是否为反向
{
if (Snake.detection != m)
Snake.detection = n;
}
void SnakeMove()//蛇移动
{
for (int i = Snake.num - 1; i >0; --i)
{
Snake.y[i] = Snake.y[i - 1];
Snake.x[i] = Snake.x[i - 1];
}
switch (Snake.detection)
{
case UP:
Snake.x[0]--;
break;
case DOWN:
Snake.x[0]++;
break;
case LEFT:
Snake.y[0]--;
break;
case RIGHT:
Snake.y[0]++;
break;
case LU:
Snake.x[0]--;
Snake.y[0]--;
break;
case RU:
Snake.x[0]--;
Snake.y[0]++;
break;
case LD:
Snake.x[0]++;
Snake.y[0]--;
break;
case RD:
Snake.x[0]++;
Snake.y[0]++;
break;
}
}
void Keyoptation()//改变蛇头方向
{
switch (key())
{
case 'W':
case 'w':
Move(DOWN, UP);
break;
case 'S':
case 's':
Move(UP, DOWN);
break;
case 'A':
case 'a':
Move(RIGHT, LEFT);
break;
case 'D':
case 'd':
Move(LEFT, RIGHT);
break;
case 'Q':
case 'q':
Move(RD, LU);
break;
case 'E':
case 'e':
Move(LD, RU);
break;
case 'Z':
case 'z':
Move(RU, LD);
break;
case 'C':
case 'c':
Move(LU, RD);
break;
}
SnakeMove();
}
void ISFood()
{
if (SnF.x == Snake.x[0] && SnF.y == Snake.y[0])
{
SnF.Yes = 'T';
Snake.num++;
}
}
void InitSnake(int m,int n)//复写
{
MapArr[Snake.x[0]][Snake.y[0]] = m;//蛇头
for (int i = 1; i < Snake.num; ++i)
{
MapArr[Snake.x[i]][Snake.y[i]] = n;//蛇身
}
}
void IsGsme()
{
for (int i = 1; i < Snake.num; ++i)
{
if ((Snake.x[i] == Snake.x[0] && Snake.y[i] == Snake.y[0]) || Snake.x[0] == 1 || Snake.x[0] == 17 || Snake.y[0] == 0 || Snake.y[0]==34)
{
G = 'F';
}
}
}
void InItGame()//初始化游戏
{
for (int i = 0; i < MAP_X; ++i)
{
for (int j = 0; j < MAP_Y; ++j)
{
if (i == 1 || j == 0 || i == MAP_X-1 || j == MAP_Y-1)
MapArr[i][j] = BLOCK_FRAME;
else
MapArr[i][j] = BLOCK_NULL;
}
}
SK();
InitSnake(SNAKE,BLOCK_BL);
start = clock();
}
void Update()//更新
{
Food();
ISFood();
InitSnake(BLOCK_NULL, BLOCK_NULL);
end = clock();
if (end - start >= SPEED)
{
IsGsme();
if (G == 'T')
Keyoptation();
start = end;
}
InitSnake(SNAKE, BLOCK_BL);
}
void Drawing()//渲染
{
/*for (int i = 0; i < MAP_X; ++i)
{
for (int j = 0; j < MAP_Y; ++j)
{
switch (MapArr[i][j])
{
case BLOCK_NULL:
printf("  ");
break;
case BLOCK_FRAME:
printf("█");
break;
case BLOCK_BL:
printf("◆");
break;
case SNAKE:
printf("□");
break;
case FOOD:
printf("☆");
break;
}
}
putchar('\n');
}*/
BeginBatchDraw();
for (int i = 0; i < MAP_X; ++i)
{
for (int j = 0; j < MAP_Y; ++j)
{
switch (MapArr[i][j])
{
case BLOCK_NULL:
//printf("  ");
setfillcolor(RGB(0, 0, 0));
setlinecolor(RGB(0, 0, 0));
fillrectangle(j * 25, i * 25, (j + 1) * 25, (i + i) * 25);
break;
case BLOCK_FRAME:
//printf("* ");
setfillcolor(RGB(0, 0, 255));
setlinecolor(RGB(255, 255, 255));
fillrectangle(j * 25, i * 25, (j + 1) * 25, (i + i) * 25);
break;
case BLOCK_BL:
//printf("# ");
setfillcolor(RGB(0, 255, 0));
setlinecolor(RGB(255, 255, 255));
fillrectangle(j * 25, i * 25, (j + 1) * 25, (i + i) * 25);
break;
case SNAKE:
//printf("# ");
setfillcolor(RGB(0, 255, 0));
setlinecolor(RGB(255, 255, 255));
fillrectangle(j * 25, i * 25, (j + 1) * 25, (i + i) * 25);
break;
case FOOD:
//printf("# ");
setfillcolor(RGB(255, 0, 0));
setlinecolor(RGB(255, 255, 255));
fillrectangle(j * 25, i * 25, (j + 1) * 25, (i + i) * 25);
break;
}
}
//printf("\n");
}
EndBatchDraw();
}
int main()
{
initgraph(880, 450);
SnF.Yes = 'T';
srand ((unsigned)time(NULL));
InItGame();
while (1)
{
Update();
Drawing();
//system("cls");
if (G == 'F')
break;
}
printf("GAME OVER\n");
closegraph();
system("pause");
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值