分数:320 吃食物数量 20 1.增加显示面板,主要显示分数和吃食物的数量以及插入图片(蛇);2增加判断死活的功能,蛇不能碰墙壁,不能碰自己的身体:3蛇吃食物后身体长度增加一节; 4蛇和食物换成图片,并且食物的种类(水果)可以增多, 5还可增加不可以食用的物品,蛇一旦食用就死亡 以下为我打的代码 #include #include #include #define MAX 30 #define LEFT 106 #define RIGHT 108 #define UP 105 #define DOWN 107 struct Snake{ int x[MAX]; int y[MAX]; int dir; int status; int length; }snake; struct Food{ int x,y; int r; int status; }food; void sence(){ setcolor(BROWN); setfillcolor(BROWN); for(int i=0;i<32;i++){ fillrectangle(i*20,0,i*20+20,20); fillrectangle(i*20,460,i*20+20,480); for(int j=0;j<24;j++){ fillrectangle(0,j*20,20,j*20+20); fillrectangle(620,j*20,640,j*20+20); } } } void initsnake(){ snake.x[0]=16; snake.y[0]=12; snake.x[1]=15; snake.y[1]=12; snake.x[2]=14; snake.y[2]=12; snake.dir=1; snake.status=1; snake.length=3; setcolor(BLACK); setfillcolor(GREEN); for(int i=0;i0;i--){ snake.x[i]=snake.x[i-1]; snake.y[i]=snake.y[i-1]; } switch(snake.dir){ case 0: snake.x[0]=snake.x[0]-1; break; case 1: snake.x[0]=snake.x[0]+1; break; case 2: snake.y[0]=snake.y[0]-1; break; case 3: snake.y[0]=snake.y[0]+1; break; } setcolor(BLACK); setfillcolor(GREEN); for(int j=0;j
// 添加头文件
#include <graphics.h>
#include <conio.h>
#include <time.h>
// 定义常量
#define MAX 30
#define LEFT 106
#define RIGHT 108
#define UP 105
#define DOWN 107
#define FOOD_NUM 3 // 食物种类数量
#define FRUIT 0 // 水果
#define POISON 1 // 毒草
#define BOMB 2 // 炸弹
// 定义结构体
struct Snake{
int x[MAX];
int y[MAX];
int dir;
int status;
int length;
}snake;
struct Food{
int x,y;
int r;
int status;
int type; // 食物种类
}food;
// 定义全局变量
int score = 0; // 分数
int food_count = 0; // 吃食物数量
IMAGE snake_img; // 蛇的图片
IMAGE fruit_img[FOOD_NUM]; // 水果的图片
IMAGE poison_img; // 毒草的图片
IMAGE bomb_img; // 炸弹的图片
// 函数声明
void sence();
void initsnake();
void drawsnake();
void changesnake();
void createfood();
void drawfood();
void checkfood();
void checkdead();
void gameover();
void initimage();
void drawscore();
void drawfoodcount();
int main(){
initgraph(640, 480);
sence();
initsnake();
initimage();
createfood();
while(snake.status){
drawsnake();
changesnake();
checkfood();
checkdead();
delay_fps(10);
}
gameover();
getch();
closegraph();
return 0;
}
// 初始化图片
void initimage(){
// 加载蛇的图片
loadimage(&snake_img, _T("snake.jpg"), 20, 20);
// 加载水果的图片
loadimage(&fruit_img[0], _T("apple.jpg"), 20, 20);
loadimage(&fruit_img[1], _T("banana.jpg"), 20, 20);
loadimage(&fruit_img[2], _T("orange.jpg"), 20, 20);
// 加载毒草的图片
loadimage(&poison_img, _T("poison.jpg"), 20, 20);
// 加载炸弹的图片
loadimage(&bomb_img, _T("bomb.jpg"), 20, 20);
}
// 绘制分数
void drawscore(){
settextcolor(YELLOW);
settextstyle(20, 0, _T("宋体"));
TCHAR str[20];
_stprintf_s(str, _T("分数:%d"), score);
outtextxy(20, 20, str);
}
// 绘制吃食物数量
void drawfoodcount(){
settextcolor(YELLOW);
settextstyle(20, 0, _T("宋体"));
TCHAR str[20];
_stprintf_s(str, _T("吃食物数量:%d"), food_count);
outtextxy(400, 20, str);
}
// 绘制场景
void sence(){
setbkcolor(WHITE);
cleardevice();
setcolor(BROWN);
setfillcolor(BROWN);
for(int i=0;i<32;i++){
fillrectangle(i*20,0,i*20+20,20);
fillrectangle(i*20,460,i*20+20,480);
for(int j=0;j<24;j++){
fillrectangle(0,j*20,20,j*20+20);
fillrectangle(620,j*20,640,j*20+20);
}
}
drawscore();
drawfoodcount();
}
// 初始化蛇
void initsnake(){
snake.x[0]=16;
snake.y[0]=12;
snake.x[1]=15;
snake.y[1]=12;
snake.x[2]=14;
snake.y[2]=12;
snake.dir=1;
snake.status=1;
snake.length=3;
}
// 绘制蛇
void drawsnake(){
for(int i=0;i<snake.length;i++){
putimage(snake.x[i]*20, snake.y[i]*20, &snake_img);
}
}
// 改变蛇的位置
void changesnake(){
for(int i=snake.length-1;i>0;i--){
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
switch(snake.dir){
case 0:
snake.x[0]=snake.x[0]-1;
break;
case 1:
snake.x[0]=snake.x[0]+1;
break;
case 2:
snake.y[0]=snake.y[0]-1;
break;
case 3:
snake.y[0]=snake.y[0]+1;
break;
}
}
// 创建食物
void createfood(){
srand((unsigned)time(NULL));
food.x=rand()%30;
food.y=rand()%24;
food.r=rand()%FOOD_NUM; // 随机生成食物种类
food.status=1;
food.type = FRUIT; // 默认为水果
}
// 绘制食物
void drawfood(){
switch(food.type){
case FRUIT:
putimage(food.x*20, food.y*20, &fruit_img[food.r]);
break;
case POISON:
putimage(food.x*20, food.y*20, &poison_img);
break;
case BOMB:
putimage(food.x*20, food.y*20, &bomb_img);
break;
}
}
// 检查是否吃到食物
void checkfood(){
if(snake.x[0]==food.x && snake.y[0]==food.y && food.status){
food.status=0;
score += 10;
food_count++;
snake.length++;
if(food.r == POISON){ // 吃到毒草,蛇死亡
snake.status = 0;
}else if(food.r == BOMB){ // 吃到炸弹,分数清零
score = 0;
}else{ // 吃到水果
createfood();
}
sence();
drawsnake();
drawfood();
drawscore();
drawfoodcount();
}
}
// 检查是否死亡
void checkdead(){
// 碰到墙壁
if(snake.x[0]<0 || snake.x[0]>31 || snake.y[0]<0 || snake.y[0]>23){
snake.status=0;
}
// 碰到自己的身体
for(int i=1;i<snake.length;i++){
if(snake.x[0]==snake.x[i] && snake.y[0]==snake.y[i]){
snake.status=0;
break;
}
}
}
// 游戏结束
void gameover(){
settextcolor(RED);
settextstyle(50, 0, _T("宋体"));
outtextxy(200, 200, _T("游戏结束"));
}