#include
#include //图形界面头文件
#include
#include
#include
#pragma comment(lib,"winmm.lib")
#define N 1000 //蛇的最大节数
#define SIZE 20//蛇的大小
struct Coor //坐标
{
int x;
int y;
};
enum Ch{ up = 72, down = 80, left = 75, right = 77 }; //上下左右四个方向
//一条蛇 N节 数组
struct Snake
{
int n; //当前蛇的节数
Coor scr[N];//100节蛇的坐标数组
Ch ch;//蛇的方向
}snake;
struct Food
{
Coor fsr; //食物坐标
int flag; //标志,食物有没有被吃掉,1代表没有
}food;
void GameInit(); //初始化游戏
void SnakePaint(IMAGE touyou, IMAGE touzuo, IMAGE touup, IMAGE toudown, IMAGE she);
void SnakeMove(); //蛇移动
void ChangeSnakeCh(); //改变蛇的方向
void FoodCoor(); //食物坐标
void FoodPaint(IMAGE shiwu);//绘制食物
void EatFood(); //吃食物
void GameBreak(); //判断游戏退出
void OverGame(); //游戏结束标志
IMAGE touup, she, toudown, touzuo, touyou, shiwu;
//主函数
int main()
{
GameInit(); //初始化的函数.
mciSendString("open res/甩葱歌.mp3 alias scg", 0, 0, 0);
mciSendString("play scg repeat", 0, 0, 0);
while (1)
{
while (!kbhit()) //kbhit(检测键盘是否有消息)
{
if (food.flag == 0)//没有食物
FoodCoor(); //生成一个食物坐标
cleardevice(); //刷新
FoodPaint(shiwu); //绘制食物
SnakeMove(); //蛇移动
SnakePaint(touyou, touzuo, touup, toudown, she);
Sleep(200); //蛇的移动速度
EatFood(); //吃食物
GameBreak(); //判断游戏是否结束
}
ChangeSnakeCh();
}
while (1);
return 0;
}
//游戏初始化
void GameInit()
{
//打开一个窗口
initgraph(640, 480);
setbkcolor(WHITE);
cleardevice(); //使用设置好的背景颜色刷新屏幕
loadimage(&touyou, "./res/蛇头右.jpg", SIZE, SIZE);
loadimage(&touup, "./res/蛇头上.jpg", SIZE, SIZE);
loadimage(&toudown, "./res/蛇头下.jpg", SIZE, SIZE);
loadimage(&touzuo, "./res/蛇头左.jpg", SIZE, SIZE);
loadimage(&she, "./res/蛇身.jpg", SIZE, SIZE);
loadimage(&shiwu, "./res/草莓.jpg", SIZE, SIZE);
//蛇初始化
snake.scr[0].x = 0;//蛇头的x,y初始化为0
snake.scr[0].y = 0;
snake.n = 1;//当前有一节蛇
snake.ch = right;//方向往下
food.flag = 0; //初始化没有食物
}
//绘制蛇
void SnakePaint(IMAGE touyou, IMAGE touzuo, IMAGE touup, IMAGE toudown, IMAGE she)
{
switch (snake.ch)
{
case up:
putimage(snake.scr[0].x, snake.scr[0].y, &touup);
break;
case down:
putimage(snake.scr[0].x, snake.scr[0].y, &toudown);
break;
case left:
putimage(snake.scr[0].x, snake.scr[0].y, &touzuo);
break;
case right:
putimage(snake.scr[0].x, snake.scr[0].y, &touyou);
break;
default:
break;
}
//n节蛇 最大的下标是多少? n-1 100
for (int i = snake.n - 1; i > 0; i--)
{
putimage(snake.scr[i].x, snake.scr[i].y, &she);
}
}
//蛇移动
void SnakeMove()
{
for (int i = snake.n - 1; i > 0; i--)
{
snake.scr[i].x = snake.scr[i - 1].x;
snake.scr[i].y = snake.scr[i - 1].y;
}
switch (snake.ch)
{
case up:
snake.scr[0].y -= SIZE;
break;
case down:
snake.scr[0].y += SIZE;
break;
case left:
snake.scr[0].x -= SIZE;
break;
case right:
snake.scr[0].x += SIZE;
break;
}
}
//人来控制 检测到按键getchar getch
//通过不同的按键(分支结构 switch if)
// 改变蛇的方向
void ChangeSnakeCh()
{
switch (getch())
{
case 72: //up
if (snake.ch != down)
snake.ch = up;
break;
case 80: //down
if (snake.ch != up)
snake.ch = down;
break;
case 75:
if (snake.ch != right)
snake.ch = left;
break;
case 77:
if (snake.ch != left)
snake.ch = right;
break;
}
}
void FoodCoor() //食物坐标
{
srand((unsigned int)time(NULL));
food.fsr.x = (rand() % 31 + 1) * SIZE; //0 10 20 30 40 50 ... 630 0-63 *10
food.fsr.y = (rand() % 23 + 1) * SIZE; //0 10 20 30... 470 0-47 *10
food.flag = 1; //食物没有被吃
}
void FoodPaint(IMAGE shiwu)//绘制食物
{
putimage(food.fsr.x, food.fsr.y, &shiwu);
}
void EatFood()//吃食物
{
if (snake.scr[0].x == food.fsr.x&&snake.scr[0].y == food.fsr.y)
{
snake.n++;
food.flag = 0;
}
}
//判断游戏退出
void GameBreak()
{
//撞墙
if (snake.scr[0].y < -1 || snake.scr[0].y>471 || snake.scr[0].x < -1 || snake.scr[0].x>631)
{
//退出
OverGame();
}
for (int i = snake.n - 1; i > 0; i--)
{
if (snake.scr[0].x == snake.scr[i].x&&snake.scr[0].y == snake.scr[i].y)
{
//退出
OverGame();
}
}
}
void OverGame()
{
cleardevice();
settextcolor(GREEN);
settextstyle(50, 0, "黑体");
outtextxy(200, 200, "game over");
Sleep(2000);
exit(0);
}
人打赏
1人 点赞
主帖获得的天涯分:0
举报 |
楼主
|
楼主发言:2次 发图:2张 | 添加到话题 |