分数:320 吃食物数量 20 1增加显示面板,主要显示分数和吃食物的数量以及插入图片;2增加判断死活的功能,蛇不能碰墙壁,不能碰自己的身体:3蛇吃食物后身体长度增加一节; 4蛇和食物换成图片,并且食物的种类可以增多, 5还可增加不可以食用的物品,蛇一旦食用就死亡
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#define N 120 //常量,蛇的最大长度
//定义蛇结构体
struct SNAKE{
int direction; //方向1往左走,2往右走,3往上走,4往下走
int life; //蛇的生命 0死亡,1正常
int score; //游戏积分
int level; //等级
int node; //蛇的初始长度
int X[N]; //蛇的X坐标,数组的长度表示蛇的矩形个数
int Y[N]; //蛇的Y坐标
}snake;
//食物结构体
struct FOOD{
int x;
int y;
int yes; //是否需要生成食物(1有食物,0没有食物)
}food;
//向左箭头
#define KEY_LEFT 293
//向上箭头
#define KEY_UP 294
//向右箭头
#define KEY_RIGHT 295
//向下箭头
#define KEY_DOWN 296
//声明函数
void wall();
void wall2();
void head();
void getfood();
void getfood2();
int gameover();
int gameover2();
int menu();
void level1();//第一关
void level2();
void level3();
int main(){
int cmd;
//图形界面初始化
initgraph(800,600,0);
while(1){
cmd = menu();
switch(cmd){
case 1:
level1();
break;
case 2:
level2();
break;
case 3:
level3();
break;
}
}
getch();
closegraph();
}
void level1(){
int i;
int key;
//初始化蛇
snake.direction = 2; //初始往右走
snake.life = 1; //生命
snake.level = 1; //等级
snake.node = 3; //蛇的默认长度
snake.score = 0; //得分
//蛇头的位置
snake.X[0] = 200;
snake.Y[0] = 100;
//第二节位置
snake.X[1] = 190;
snake.Y[1] = 100;
//第三节
snake.X[2] = 180;
snake.Y[2] = 100;
//初始化食物
food.yes = 1;
while(snake.life){
//显示标题
head();
//画墙
wall();
//生成食物
getfood();
//画蛇
//设置蛇的颜色
setcolor(0XFF0000);
for(i=0;i<snake.node;i++){
//画空心矩形rectangle
rectangle(snake.X[i],snake.Y[i],snake.X[i]+10,snake.Y[i]+10);
}
//延迟
delay_ms(100);
//最后一节的坐标画成背景颜色
setcolor(0x000000);
rectangle(snake.X[snake.node-1],snake.Y[snake.node-1],snake.X[snake.node-1]+10,snake.Y[snake.node-1]+10);
/*
让蛇动起来
1.蛇后一节的坐标等于前一节的坐标
2.修改蛇头的坐标
//方向1往左走,2往右走,3往上走,4往下走
*/
//1.蛇后一节的坐标等于前一节的坐标
for(i=snake.node-1;i>=1;i--){
snake.X[i] = snake.X[i-1]; //前一节x的值赋值给后一节
snake.Y[i] = snake.Y[i-1]; //前一节Y的值赋值给后一节
}
//读取键盘输入
if(kbhit()){ //判断有没有按键
//改变蛇头的方向
key = getch(); //获取方向键的值
switch(key){
case KEY_LEFT:
if(snake.direction != 2){
snake.direction = 1;
}
break;
case KEY_UP:
if(snake.direction != 4){
snake.direction = 3;
}
break;
case KEY_RIGHT:
if(snake.direction != 1){
snake.direction = 2;
}
break;
case KEY_DOWN:
if(snake.direction != 3){
snake.direction = 4;
}
break;
}
}
//2.修改蛇头的坐标
switch(snake.direction){
case 1: //往左走
snake.X[0] = snake.X[0] - 10;
break;
case 2: //往右走
snake.X[0] = snake.X[0] + 10;
break;
case 3: //往上走
snake.Y[0] = snake.Y[0] - 10;
break;
case 4: //往下走
snake.Y[0] = snake.Y[0] + 10;
break;
}
//判断食物的坐标与蛇头的坐标是否相等,相等就表示蛇吃到了食物
if(snake.X[0] == food.x && snake.Y[0] == food.y){
//蛇的长度加一
snake.node++;
snake.score += 10; //得分加10
food.yes = 1; //重新发食物
//升级,每100分升一级
if(snake.score != 0 && snake.score % 100 == 0){
snake.level++;
}
}
//判断游戏结束
if(gameover()){
//清空屏幕
cleardevice();
setcolor(0xff0000);
setfont(60,50,"微软雅黑");
outtextxy(180,250,"游戏结束");
getch();
break; //终止游戏的循环
}
}
}
void level2(){
int i;
int key;
//初始化蛇
snake.direction = 2; //初始往右走
snake.life = 1; //生命
snake.level = 2; //等级
snake.node = 3; //蛇的默认长度
snake.score = 0; //得分
//蛇头的位置
snake.X[0] = 200;
snake.Y[0] = 100;
//第二节位置
snake.X[1] = 190;
snake.Y[1] = 100;
//第三节
snake.X[2] = 180;
snake.Y[2] = 100;
//初始化食物
food.yes = 1;
while(snake.life){
//显示标题
head();
//画墙
wall2();
//生成食物
getfood2();
//画蛇
//设置蛇的颜色
setcolor(0XFF0000);
for(i=0;i<snake.node;i++){
//画空心矩形rectangle
rectangle(snake.X[i],snake.Y[i],snake.X[i]+10,snake.Y[i]+10);
}
//延迟
delay_ms(80);
//最后一节的坐标画成背景颜色
setcolor(0x000000);
rectangle(snake.X[snake.node-1],snake.Y[snake.node-1],snake.X[snake.node-1]+10,snake.Y[snake.node-1]+10);
/*
让蛇动起来
1.蛇后一节的坐标等于前一节的坐标
2.修改蛇头的坐标
//方向1往左走,2往右走,3往上走,4往下走
*/
//1.蛇后一节的坐标等于前一节的坐标
for(i=snake.node-1;i>=1;i--){
snake.X[i] = snake.X[i-1]; //前一节x的值赋值给后一节
snake.Y[i] = snake.Y[i-1]; //前一节Y的值赋值给后一节
}
//读取键盘输入
if(kbhit()){ //判断有没有按键
//改变蛇头的方向
key = getch(); //获取方向键的值
switch(key){
case KEY_LEFT:
if(snake.direction != 2){
snake.direction = 1;
}
break;
case KEY_UP:
if(snake.direction != 4){
snake.direction = 3;
}
break;
case KEY_RIGHT:
if(snake.direction != 1){
snake.direction = 2;
}
break;
case KEY_DOWN:
if(snake.direction != 3){
snake.direction = 4;
}
break;
}
}
//2.修改蛇头的坐标
switch(snake.direction){
case 1: //往左走
snake.X[0] = snake.X[0] - 10;
break;
case 2: //往右走
snake.X[0] = snake.X[0] + 10;
break;
case 3: //往上走
snake.Y[0] = snake.Y[0] - 10;
break;
case 4: //往下走
snake.Y[0] = snake.Y[0] + 10;
break;
}
//判断食物的坐标与蛇头的坐标是否相等,相等就表示蛇吃到了食物
if(snake.X[0] == food.x && snake.Y[0] == food.y){
//蛇的长度加一
snake.node++;
snake.score += 10; //得分加10
food.yes = 1; //重新发食物
//升级,每100分升一级
if(snake.score != 0 && snake.score % 100 == 0){
snake.level++;
}
}
//判断游戏结束
if(gameover2()){
//清空屏幕
cleardevice();
setcolor(0xff0000);
setfont(60,50,"微软雅黑");
outtextxy(180,250,"游戏结束");
getch();
break; //终止游戏的循环
}
}
}
void level3(){
cleardevice();
setcolor(0xff0000);
setfont(60,50,"微软雅黑");
outtextxy(180,250,"正在开发中.....");
}
void wall(){
int i;
//设置矩形颜色
setcolor(0xff0000);
//水平方向
for(i=0;i<=790;i+=10){
rectangle(i,60,i+10,70); //顶部
rectangle(i,590,i+10,600);//底部
}
//垂直方向
for(i=60;i<=590;i+=10){
rectangle(0,i,10,i+10); //左边
rectangle(790,i,800,i+10); //右边
}
}
void wall2(){
int i;
//设置矩形颜色
setcolor(0xff0000);
//水平方向
for(i=0;i<=790;i+=10){
rectangle(i,60,i+10,70); //顶部
rectangle(i,590,i+10,600);//底部
}
//垂直方向
for(i=60;i<=590;i+=10){
rectangle(0,i,10,i+10); //左边
rectangle(790,i,800,i+10); //右边
}
//画实心的障碍物
setfillstyle(6,0x00ff00);
setcolor(0x00ff00);
bar(200,200,250,400);
rectangle(200,200,250,400);
bar(600,200,650,400);
rectangle(600,200,650,400);
}
void head(){
int i;
char str[30]="贪吃蛇游戏";
setfillstyle(8,EGERGB(0, 255, 0));
bar(0,0,800,59);
setcolor(EGERGB(255,0,0));
setfont(20,30,"宋体");
outtextxy(250,20,str);
//打印等级和分数
char s[20];
setfont(20,20,"宋体");
sprintf(s,"等级:%d",snake.level);
outtextxy(10,20,s);
char s2[20];
sprintf(s2,"得分:%d",snake.score);
outtextxy(600,20,s2);
}
//生成食物
void getfood(){
int i;
int flag=1;
if(food.yes==1){ //1表示要重新发食物
//初始化随机种子
randomize();
//随机生成食物
while(1){
flag = 1;
food.x = random(760) + 20; //x的值必须在(20 ~780以内) ,要确保x的值是10的整数倍
while(food.x % 10 !=0){
food.x = random(760+20);
}
food.y = random(510) + 80; //y的值必须在(80~590以内) ,要确保y的值是10的整数倍
while(food.y % 10 !=0){
food.y = random(510) + 80;
}
//判断食物是否在蛇的内部
for(i=0;i<snake.node;i++){
if(food.x == snake.X[i] && food.y== snake.Y[i]){
flag=0;
break;
}
}
if(flag){
break;//终止循环,说明食物不在蛇的内部
}
}
//画食物
setcolor(0xff0000);
rectangle(food.x,food.y,food.x+10,food.y+10);
food.yes = 0;
}
}
//生成食物
void getfood2(){
int i;
int flag=1;
if(food.yes==1){ //1表示要重新发食物
//初始化随机种子
randomize();
//随机生成食物
while(1){
flag = 1;
food.x = random(760) + 20; //x的值必须在(20 ~780以内) ,要确保x的值是10的整数倍
while(food.x % 10 !=0){
food.x = random(760+20);
}
food.y = random(510) + 80; //y的值必须在(80~590以内) ,要确保y的值是10的整数倍
while(food.y % 10 !=0){
food.y = random(510) + 80;
}
//判断食物是否在蛇的内部
for(i=0;i<snake.node;i++){
if(food.x == snake.X[i] && food.y== snake.Y[i]){
flag=0;
break;
}
}
//判断是否在障碍物内部
if(food.x>=200 && food.x <=250 && food.y>=200 && food.y<=400){
flag=0;
}
if(food.x>=600 && food.x <=650 && food.y>=200 && food.y<=400){
flag=0;
}
if(flag){
break;//终止循环,说明食物不在蛇的内部
}
}
//画食物
setcolor(0xff0000);
rectangle(food.x,food.y,food.x+10,food.y+10);
food.yes = 0;
}
}
//游戏结束(撞墙)
int gameover(){
int flag = 0;
int i;
switch(snake.direction){
case 1: //往左走
if(snake.X[0]<=10){
flag = 1;
}
break;
case 2: //往右走
if(snake.X[0]>=790){
flag = 1;
}
break;
case 3: //往上走
if(snake.Y[0]<=70){
flag=1;
}
break;
case 4: //往下走
if(snake.Y[0]>=590){
flag=1;
}
break;
}
//蛇吃自己
for(i=3;i<snake.node;i++){
if(snake.X[0] == snake.X[i] && snake.Y[0]== snake.Y[i]){
flag=1;
break;
}
}
return flag;
}
int gameover2(){
int flag = 0;
int i;
switch(snake.direction){
case 1: //往左走
if(snake.X[0]<=10){
flag = 1;
}
break;
case 2: //往右走
if(snake.X[0]>=790){
flag = 1;
}
break;
case 3: //往上走
if(snake.Y[0]<=70){
flag=1;
}
break;
case 4: //往下走
if(snake.Y[0]>=590){
flag=1;
}
break;
}
//蛇吃自己
for(i=3;i<snake.node;i++){
if(snake.X[0] == snake.X[i] && snake.Y[0]== snake.Y[i]){
flag=1;
break;
}
}
//障碍物
if(snake.X[0]>=200 && snake.X[0] <=250 && snake.Y[0]>=200 && snake.Y[0]<=400){
flag=1;
}
if(snake.X[0]>=600 && snake.X[0] <=650 && snake.Y[0]>=200 && snake.Y[0]<=400){
flag=1;
}
return flag;
}
//主菜单
int menu(){
int key;
int cmd=1;
//定义图片变量
PIMAGE img = newimage();
//获取图片文件
getimage(img, "d:\\snake.jpg");
//画图
putimage(0, 0, img);
//删除图片变量,回收内存
delimage(img);
// delay_ms(1000);
// cleardevice();
//设置背景为透明
setbkmode(TRANSPARENT);
setcolor(0xff0000);
setfont(40,30,"微软雅黑");
outtextxy(70,20,"2020最新款贪吃蛇游戏");
outtextxy(270,120,"1.第一关");
outtextxy(270,220,"2.第二关");
outtextxy(270,320,"3.第三关");
// outtextxy(270,320,"4.返回主菜单");
outtextxy(270,420,"5.退出");
key = getch();
switch(key){
case 49: //按1
cmd = 1;
break;
case 50: //按2
cmd = 2;
break;
case 51: //按3
cmd = 3;
break;
case 52: //按4
cmd = 4;
break;
case 53: //按5
exit(1); //终止程序运行
break;
}
cleardevice();
return cmd;
}
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632