完成基本贪吃蛇游戏元素
初始化函数
源代码
运行结果
蛇 食物 地图
void init()
{
//生成食物要用到随机种子
srand((unsigned int)time(NULL));
initgraph(640, 480);
setbkcolor(BLUE);
//要初始化蛇 食物
for (int i = 0; i < 3; i++) //xy[0]这个位置做蛇头
{
snake.xy[2 - i].x = 10 * i;
snake.xy[2 - i].y = 0;
}
snake.num = 3;
snake.direction = right;
food();
}
蛇 我们要用到数据 数据首先得存
变量 数组 结构体
蛇 一节一节的躯干 用图形画出来
每一节躯干都是一样的 长得一毛一样
有什么不一样? 位置不一样 数组存什么?
int a[100]={0}; //位置是x,y
结构体
食物自己长在地上 随机的 随机数
a[1]=a[0] 001 蛇的每一节被后一节代替
void draw()
{
//蛇 食物
//蛇的躯干有个座标//fillrectangle
for (int i = 0; i < snake.num; i++)//画蛇
{
setlinecolor(RED);
fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10);
}
//画食物
fillrectangle(foodxy.x, foodxy.y, foodxy.x + 10, foodxy.y + 10);
}
蛇的移动 通过什么?键盘
绘蛇和食物graphics.h
循环以上
void move()
{
//移动蛇
for (int i = snake.num; i > 0; i--)
{
snake.xy[i].x = snake.xy[i - 1].x;
snake.xy[i].y = snake.xy[i - 1].y;
}
switch (dir = snake.direction)
{
case right:snake.xy[0].x += 10; break;
case left:snake.xy[0].x -= 10; break;
case down:snake.xy[0].y += 10; break;
case up:snake.xy[0].y -= 10; break;
}
}
判断游戏的结束 蛇自食 蛇撞墙
我们没按键的时候 蛇动不动?
_getch()阻塞式 _kbhit()非阻塞 有按键它的返回值就非0 键盘监听
无按键它的返回值就是0
while(_kbhit()) 当键盘没有按的时候
{ _getch();}
void over()
{
//游戏结束
//蛇自食 撞墙
if (snake.xy[0].x > 640 || snake.xy[0].x<0 || snake.xy[0].y>480 || snake.xy[0].y < 0)
{
MessageBox(GetHWnd(), L"游戏失败!!", L"游戏结束", 0);
exit(0);
}
for (int i = 1; i < snake.num; i++)
if (snake.xy[0].x == snake.xy[i].x&&snake.xy[0].y == snake.xy[i].y)
{
MessageBox(GetHWnd(), L"游戏失败!!", L"游戏结束", 0);
exit(0);
}
}
我们要通过按键改变蛇的方向
二;源代码
#include<stdio.h>
#include<conio.h>//按键
#include<graphics.h>//画蛇专用
#include<time.h>//随机种子 随机数
#include<stdlib.h>
#include<mciapi.h>
#pragma comment(lib,"winmm.lib")
#define MAX 100
typedef struct { int x; int y; }PLACE;//位置
struct mySnake//蛇
{
int num; //记蛇体节数
PLACE xy[MAX];//蛇皮数组
char direction;//方向
}snake;
PLACE foodxy;//食物位置
enum direction{ up, down, left, right };
//函数声明 函数原型
char dir;//上一次方向
void init();//初始化
void food();//生成食物
void keyDown();//蛇头动向
void move();//移动蛇
void draw();//绘蛇和食物
void eat();//蛇恰饭
void over();//游戏结束判断
void run();//运行
int main()
{
run();
return 0;
}
void init()
{
//生成食物要用到随机种子
srand((unsigned int)time(NULL));
initgraph(640, 480);
setbkcolor(BLUE);
//要初始化蛇 食物
for (int i = 0; i < 3; i++) //xy[0]这个位置做蛇头
{
snake.xy[2 - i].x = 10 * i;
snake.xy[2 - i].y = 0;
}
snake.num = 3;
snake.direction = right;
food();
}
void keyDown()
{
//确定方向
//顺序结构 循环结构 分支结构
switch (_getch())//wa 这个问题的根源在哪
{
case 'w'://蛇先往右 还没动就往左了 把原先的方向改变了 但是还没动
case 'W':if (dir != down)
snake.direction = up; break;
case 's':
case 'S':if (dir != up)
snake.direction = down; break;
case 'a':
case 'A':if (dir != right)
snake.direction = left; break;
case 'd':
case 'D':if (dir != left)
snake.direction = right; break;
}
}
void move()
{
//移动蛇
for (int i = snake.num; i > 0; i--)
{
snake.xy[i].x = snake.xy[i - 1].x;
snake.xy[i].y = snake.xy[i - 1].y;
}
switch (dir = snake.direction)
{
case right:snake.xy[0].x += 10; break;
case left:snake.xy[0].x -= 10; break;
case down:snake.xy[0].y += 10; break;
case up:snake.xy[0].y -= 10; break;
}
}
void draw()
{
//蛇 食物
//蛇的躯干有个座标//fillrectangle
for (int i = 0; i < snake.num; i++)//画蛇
{
setlinecolor(RED);
fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10);
}
//画食物
fillrectangle(foodxy.x, foodxy.y, foodxy.x + 10, foodxy.y + 10);
}
void food()
{
foodxy.x = rand() % 64 * 10;
foodxy.y = rand() % 48 * 10;
//食物不能长在蛇的身上
int i = 0;
while (i < snake.num)
if (foodxy.x == snake.xy[i++].x&&foodxy.y == snake.xy[i++].y)
{
foodxy.x = rand() % 64 * 10;
foodxy.y = rand() % 48 * 10;
i = 0;
}
}
void eat()
{
if (snake.xy[0].x == foodxy.x&&snake.xy[0].y == foodxy.y)
{
snake.num++;
food();
}
}
void over()
{
//游戏结束
//蛇自食 撞墙
if (snake.xy[0].x > 640 || snake.xy[0].x<0 || snake.xy[0].y>480 || snake.xy[0].y < 0)
{
MessageBox(GetHWnd(), L"游戏失败!!", L"游戏结束", 0);
exit(0);
}
for (int i = 1; i < snake.num; i++)
if (snake.xy[0].x == snake.xy[i].x&&snake.xy[0].y == snake.xy[i].y)
{
MessageBox(GetHWnd(), L"游戏失败!!", L"游戏结束", 0);
exit(0);
}
}
void run()
{
init();
mciSendString(L"open mm.mp3", 0, 0, 0);
mciSendString(L"play mm.mp3", 0, 0, 0);
while (1)
{
cleardevice();//清除图形屏幕
while (_kbhit())//无按键返回0,按键返回 !0
keyDown();
move();
eat();
over();
draw();
Sleep(300);//蛇移动间隔时间
}//当蛇往右走的时候 按了wa
}