贪吃蛇。。应该没什么人没有玩过吧哈哈
贪吃蛇。。虽然很简单。。但也是人生中第一个自己写的游戏把!!
游戏开发是一直以来的梦想。。。
不多说,没什么难点,直接上代码(如果需要图形库文件和EasyX的可以给我留言。。也可以网上自己下载哈)
/***********************************************
文件名称:main.cpp
程序名称:贪吃蛇
编译环境:VS2013 && EasyX
最后修改:2016年6月30日
************************************************/
#include <stdio.h>
#include <graphics.h> //图形库的头文件
#include <mmsystem.h> //多媒体设备接口 音乐 视频 麦克风
#include <conio.h>
#include <time.h>
#pragma comment(lib, "winmm.lib")
#define X_LEN 640
#define Y_LEN 480
#define MAXLEN 100
#define SNAKE_SIZE 10
struct Coor
{
int x, y;
};
typedef enum Di
{
up = 72, down = 80, right = 77, left = 75
}Dir;
struct Snake
{
Coor zb[MAXLEN]; //蛇的坐标
int n; //蛇的长度
Dir dir; //蛇的方向
}snake;
struct Food
{
int flag;
Coor zb;
}food;
//初始化一条小蛇
void initsnake()
{
initgraph(X_LEN, Y_LEN); //初始化一个图形界面 创建一块画板
mciSendString(L"open 五环之歌.mp3 alias bk", 0, 0, 0);
mciSendString(L"Play bk repeat", 0, 0, 0);
setbkcolor(RGB(220, 120, 150));
cleardevice();
rectangle(0, 0, 10, 10);
snake.n = 1;
snake.zb[0].x = 0;
snake.zb[0].y = 0;
snake.dir = right;
food.flag = 0;
}
void drawsnake() //在图形界面上画蛇
{
for (int i = snake.n - 1; i >= 0; i--)
{
rectangle(snake.zb[i].x, snake.zb[i].y,
snake.zb[i].x + SNAKE_SIZE, snake.zb[i].y + SNAKE_SIZE);
}
setcolor(RGB(220, 120, 150));
rectangle(snake.zb[snake.n].x, snake.zb[snake.n].y,
snake.zb[snake.n].x + SNAKE_SIZE, snake.zb[snake.n].y + SNAKE_SIZE);
setcolor(RGB(255, 255, 255));
rectangle(snake.zb[snake.n - 1].x, snake.zb[snake.n - 1].y,
snake.zb[snake.n - 1].x + SNAKE_SIZE, snake.zb[snake.n - 1].y + SNAKE_SIZE);
}
void movesnake()
{
//让蛇自己向前动起来,用for循环来移动第0节后面的蛇
for (int i = snake.n; i > 0; i--)
{
//后面一节蛇的坐标等于它前面一节蛇的坐标
snake.zb[i].x = snake.zb[i - 1].x;
snake.zb[i].y = snake.zb[i - 1].y;
}
switch (snake.dir)
{
case up:
snake.zb[0].y -= SNAKE_SIZE;
break;
case down:
snake.zb[0].y += SNAKE_SIZE;
break;
case right:
snake.zb[0].x += SNAKE_SIZE;
break;
case left:
snake.zb[0].x -= SNAKE_SIZE;
break;
}
drawsnake();
}
//用键盘让蛇改变方向
void changesnake()
{
int move;
move = _getch();
switch (move)
{
case up:
if (snake.dir != down)
snake.dir = up;
break;
case down:
if (snake.dir != up)
snake.dir = down;
break;
case left:
if (snake.dir != right)
snake.dir = left;
break;
case right:
if (snake.dir != left)
snake.dir = right;
break;
}
}
//出现食物
void drawfood()
{
setcolor(RGB(255, 255, 255));
circle(food.zb.x + SNAKE_SIZE / 2, food.zb.y + SNAKE_SIZE / 2, SNAKE_SIZE / 2);
}
//决定食物的坐标
void coorfood()
{
food.zb.x = rand() % (X_LEN / SNAKE_SIZE) * SNAKE_SIZE;
food.zb.y = rand() % (Y_LEN / SNAKE_SIZE) * SNAKE_SIZE;
food.flag = 1; //表示食物还没被吃掉
}
void eatfood()
{
if (snake.zb[0].x == food.zb.x && snake.zb[0].y == food.zb.y)
{
snake.n += 1;
food.flag = 0;
setcolor(RGB(220, 120, 150));
circle(food.zb.x + SNAKE_SIZE / 2, food.zb.y + SNAKE_SIZE / 2, SNAKE_SIZE / 2);
}
}
int snakedeath()
{
if (snake.zb[0].x < 0 || snake.zb[0].x > X_LEN || snake.zb[0].y < 0 || snake.zb[0].y > Y_LEN)
return 1;
for (int i = 1; i <= snake.n - 1; i++)
{
if (snake.zb[i].x == snake.zb[0].x && snake.zb[i].y == snake.zb[0].y)
return 1;
}
return 0;
}
void gameover()
{
cleardevice();
setcolor(BLUE);
settextstyle(50, 0, L"华文彩云");
outtextxy(100, 50, L"XYQ");
outtextxy(100, 100, L"倾情制作");
getchar();
closegraph();
}
int main()
{
srand(time(0));
initsnake();
while (1)
{
if (food.flag == 0) //表示食物已经被吃掉
{
coorfood();
drawfood();
}
while (!_kbhit())
{
if (snakedeath())
{
gameover();
break;
}
eatfood();
movesnake();
Sleep(100);
}
changesnake();
}
return 0;
}