贪吃蛇
/* 1.创建界面 2.随机产生数
3.蛇头的移动 4蛇的长度变化 */
#include<stdio.h>
#include<graphics.h>//创建界面头文件
#include<windows.h>//sleep和clear的头文件
#include<mmsystem.h>
#include<conio.h>//kbhit的头文件
#include<time.h>
//#include<stedlib.h>
#pragma comment(lib,"winmm.lib")
#define NUM 200
#define SIZE 10
enum ch{ up = 72,down=80,left=75,right=77 };//这里的数值不能变
struct coor//坐标
{
int x;
int y;
};
struct Snack
{
int a;//蛇的节数
char ch;//蛇的方向
coor szb[NUM];
};
struct Food
{
int x;
int y;
bool iseat=true;
};
Snack snack;
Food food;
void snackstart()//蛇的初始状态
{
snack.a = 3;
snack.ch = right;
snack.szb[0].x=100;
snack.szb[0].y=100;
snack.szb[1].x=90;
snack.szb[1].y=100;
snack.szb[2].x=90;
snack.szb[2].y=110;
}
void snackdraw()//画出蛇
{
cleardevice();//清屏
int i;
setfillcolor(BLUE);
fillrectangle(snack.szb[0].x, snack.szb[0].y, snack.szb[0].x + SIZE, snack.szb[0].y + SIZE);
for (i = 1; i < snack.a; i++)
rectangle(snack.szb[i].x, snack.szb[0].y,
snack.szb[i].x + SIZE, snack.szb[i].y + SIZE);
setfillcolor(GREEN);//绘制食物
fillroundrect(food.x, food.y, food.x + SIZE, food.y + SIZE, 5, 5);
}
void snackmove()//蛇的移动
{
int i;
for (i = snack.a; i > 0; i--)
{
snack.szb[i].x = snack.szb[i - 1].x;
snack.szb[i].y = snack.szb[i - 1].y;
}
switch (snack.ch)
case up:
{ snack.szb[0].y -= SIZE;
break;
}
switch (snack.ch)
case down:
{ snack.szb[0].y += SIZE;
break;
}
switch (snack.ch)
case left:
{ snack.szb[0].x -= SIZE;
break;
}
switch (snack.ch)
case right://记得加括号case只能读取一个句子
{ snack.szb[0].x += SIZE;
break;
}
}
void snackchange()//蛇方向的改变
{
char key;
key = _getch();//注意为啥不能用getchar和getch
switch(key)
case up:
{
if (snack.ch != down)
snack.ch = up;
break;
}
switch (key)
case down:
{
if (snack.ch != up)
snack.ch =down;
break;
}
switch (key)
case left:
{
if (snack.ch != right)
snack.ch = left;
break;
}
switch (key)
case right:
{
if (snack.ch != left)
snack.ch = right;
break;
}
}
void foodcreat()//创建食物
{
bool flag = false;//保证食物和蛇不重合
if (food.iseat == true)
{
while (1)
{
food.x = rand() % 64*10;
food.y = rand() % 48*10;
for (int i = 0; i < snack.a; i++)
{
if (food.x == snack.szb[i].x && food.y == snack.szb[i].y)
{
flag = true;
break;//跳出for这个循环
}
}
if (!flag)
{
food.iseat = false;
break;//跳出while这个循环
}
}
}
}
void eatfood()//吃食物
{
if (snack.szb[0].x == food.x && snack.szb[0].y == food.y)
snack.a++;
}
int gameover()//游戏结束
{
if (snack.szb[0].x<= 0 || snack.szb[0].x>=640 || snack.szb[0].y <= 0 || snack.szb[0].y>=480)
return 1;
for (int i = 1; i < snack.a; i++)
{
if (snack.szb[0].x == snack.szb[i].x && snack.szb[0].y == snack.szb[i].y)
return 1;
}
return 0;
}
int main()
{
// int kbhit(void);//使用这个函数需要先声明
initgraph(640, 480);
mciSendString(L"open 怎么做怎么过怎么活.mp3", 0, 0, 0);
mciSendString(L"play 怎么做怎么过怎么活.mp3", 0, 0, 0);
snackstart();
while(1)
{
while (!_kbhit())//需要头文件,用来检测是否从键盘输入信息了
{
snackmove();//移动和花舍不能调换位置
snackdraw();
eatfood();
foodcreat();
if (gameover())
{
break;//退出内层循环
}
//eatfood();
Sleep(500);
}
if (gameover())
{
break;//跳出外层循环
}
snackchange();//不能与break换位置
}
closegraph();//关闭程序运行界面
printf("加油再接再厉\n");//这里是程序结束后可以随便输出
// getchar();
return 0;
}

浙公网安备 33010602011771号