好吧,我又来了,先说一声抱歉,我是真不知道哪些是无关代码。
编译环境:vs2019,错误(117个)类似于:
LNK2005 "private: void __thiscall EasyX::GlobalMemory::Clear(void)" (?Clear@GlobalMemory@EasyX@@AAEXXZ) 已经在 EasyXw.lib(EasyX.GlobalMemory.obj) 中定义
LNK2005 "public: __thiscall EasyX::GlobalMemory::GlobalMemory(void)" (??0GlobalMemory@EasyX@@QAE@XZ) 已经在 EasyXw.lib(EasyX.GlobalMemory.obj) 中定义
的错误。
尝试过#ifndef以及#pragma once 。
以下是几个文件的内容:
ceshi.h:
#pragma once
#include<graphics.h>
#define graphlength 1000//创建窗口的长度
#define graphwidth 680//创建窗口的宽度
#define picsize 20//图片尺寸a*a
#define width 19//边框的宽度
#define horizonx 700//水平边框的右坐标
#define verticaly 661//竖直边框的底部坐标
#define up 'w'
#define down 's'
#define left 'a'
#define right 'd'
#define quit 'q'
//结构体部分
typedef struct record//记录结构体
{
int framework;
int year;
int mon;
int day;
int hour;
int min;
int sec;
}record;
typedef struct foods//食物结构体
{
int x;
int y;
}food1;
typedef struct _POINTS//奖励性食物结构体
{
int x;
int y;
}point1;
typedef struct fastfood//加速食物结构体
{
int x;
int y;
}fast1;
typedef struct slow//减速食物结构体
{
int x;
int y;
}slow1;
typedef struct snakes//蛇身结构体
{
int x;
int y;
struct snakes* next;
}snake;
void transparentimage(int x, int y, IMAGE* srcimg, IMAGE* maskimg);
extern IMAGE bac[11], bodysrc[10], bodymask[10], foodsrc, foodmask, pointsrc, pointmask, fastsrc, fastmask, lowsrc, lowmask;
extern snake* head, * tail, * snake_2, * snake_1;
extern int i;
extern int map;
extern int score;
extern int n;
extern int speed, count0, count0_1, addnumber, count1, count1_1, count2, count2_1;
extern char key1, key;
extern food1 food;
extern fast1 fast;
extern slow1 slow;
extern point1 point;
1.h:
#pragma once
#pragma comment(lib, "Winmm.lib")//调用有关多媒体的动态连接库
//函数声明部分
int Cmpfunc(const void* a, const void* b);//数组排序函数
void eatfood();//蛇进食后身长
void stamp();//蛇身以及食物打印
void scoreshow();//得分显示
void Free();//释放蛇的内存
void creatfood();//普通食物
void creatslow();//减速型食物
void creatfast();//加速型食物
void creatpoint();//奖励性食物
void chosedifficult();//选择难度
void instructions();//游戏说明
void archive();//游戏记录存档
void ranklist();//显示排行
void welcome();//开始界面
2.h:
#pragma once
#pragma comment(lib, "Winmm.lib")//调用有关多媒体的动态连接库
void mapbgm();//设置地图bgm
void loadpic();//存储图片
void chosemap();//选择地图
void creatframe();//创建边框
3.h:
#pragma once
#pragma comment(lib, "Winmm.lib")//调用有关多媒体的动态连接库
int keyboard();//从键盘获得输入信号
void move_snake();//蛇的移动
void snakebody(int a, int b);//蛇的移动过程坐标变换
int endgame();//判断是否违反规则结束游戏
void End();//结束界面
void creatsnake();//创建蛇身
ceshi.cpp:
#include"ceshi.h"
//函数声明
// 透明贴图函数
// 参数:
// x, y: 目标贴图位置
// srcimg: 源 IMAGE 对象指针。NULL 表示默认窗体
// maskimg:掩码 IMAGE
void transparentimage(int x, int y, IMAGE* srcimg, IMAGE* maskimg)
{
putimage(x, y, maskimg, SRCAND);
putimage(x, y, srcimg, SRCPAINT);
}
main.cpp:
#include"ceshi.h"
#include"1.h"
#include"2.h"
#include"3.h"
IMAGE bac[11], bodysrc[10], bodymask[10], foodsrc, foodmask, pointsrc, pointmask, fastsrc, fastmask, lowsrc, lowmask;
snake* head, * tail, * snake_2, * snake_1;
int i = 0;
int map = 1;
int score = 0;
int n;
int speed = 100, count0 = 0, count0_1 = 0, addnumber = 15, count1 = 0, count1_1 = 0, count2 = 0, count2_1 = 0;
char key1 = 'd', key = 'd';
food1 food;
fast1 fast;
slow1 slow;
point1 point;
//主函数
int main()
{
initgraph(graphlength, graphwidth);
setbkmode(TRANSPARENT);
loadpic();
welcome();
return 0;
}
1.cpp:
#undef UNICODE
#undef _UNICODE
#include<stdio.h>
#include<time.h>
#include"1.h"
#include"2.h"
#include"3.h"
#include"ceshi.h"
//开始界面
void welcome()
{
clearcliprgn();//清空屏幕
mciSendString(_T("open music\\welcome.mp3 alias welcomebgm"), NULL, 0, NULL);//打开欢迎音乐
mciSendString("setaudio welcomebgm volume to 200", NULL, 0, NULL);//控制音量大小
mciSendString(_T("play welcomebgm repeat"), NULL, 0, NULL); //播放欢迎音乐
putimage(0, 0, &bac[7]);
int n;
settextcolor(LIGHTRED);
outtextxy(graphlength / 2, 100, _T("贪吃蛇"));
outtextxy(graphlength / 2, 150, _T("1.开始游戏"));
outtextxy(graphlength / 2, 200, _T("2.选择难度"));
outtextxy(graphlength / 2, 250, _T("3.选择地图"));
outtextxy(graphlength / 2, 300, _T("4.查看排行榜"));
outtextxy(graphlength / 2, 350, _T("5.游戏说明"));
outtextxy(graphlength / 2, 400, _T("6.退出游戏"));
outtextxy(graphlength / 2, 450, _T("请选择:1.2.3.4.5.6"));
scanf("%d", &n);
mciSendString(_T("close welcomebgm"), NULL, 0, NULL);//关闭欢迎界面bgm
cleardevice();
switch (n)
{
case 1:
mapbgm();
creatframe();
creatsnake();
creatfood();
creatpoint();
creatfast();
creatslow();
keyboard();
break;
case 2:
chosedifficult();
break;
case 3:
chosemap();
welcome();
break;
case 4:
ranklist();
welcome();
break;
case 5:
instructions();
welcome();
break;
case 6:
exit(0);
break;
default:
outtextxy(220, 120, _T("请输入有效的数字"));
system("pause");
while (getchar() != '\n');
welcome();
break;
}
}
//释放蛇的各节点的内存
void Free()
{
snake* p = head;
while (head->next != NULL)
{
head = head->next;
free(p);
p = head;
}
free(p);
}
//创造食物
void creatfood()
{
snake* p;
srand((unsigned)time(NULL));
label:
food.x = (rand() % (horizonx / 20 - 2) + 1) * 20;
food.y = (rand() % ((verticaly - 1) / 20 - 1) + 1) * 20;
p = head;
while (p->next != NULL)
{
if (food.x == p->x && food.y == p->y)
{
goto label;
}
p = p->next;
}
if (food.x == fast.x && food.y == fast.y)
{
goto label;
}
if (food.x == point.x && food.y == point.y)
{
goto label;
}
if (food.x == slow.x && food.y == slow.y)
{
goto label;
}
}
//创造奖励性食物
void creatpoint()
{
snake* p;
srand((unsigned)time(NULL));
label:
point.x = (rand() % (horizonx / 20 - 2) + 1) * 20;
point.y = (rand() % ((verticaly - 1) / 20 - 1) + 1) * 20;
p = head;
while (p->next != NULL)
{
if (point.x == p->x && point.y == p->y)
{
goto label;
}
p = p->next;
}
if (point.x == fast.x && point.y == fast.y)
{
goto label;
}
if (point.x == food.x && point.y == food.y)
{
goto label;
}
if (point.x == slow.x && point.y == slow.y)
{
goto label;
}
}
//减速型食物
void creatslow()
{
snake* p;
srand((unsigned)time(NULL));
label:
slow.x = (rand() % (horizonx / 20 - 2) + 1) * 20;
slow.y = (rand() % ((verticaly - 1) / 20 - 1) + 1) * 20;
p = head;
while (p->next != NULL)
{
if (slow.x == p->x && slow.y == p->y)
{
goto label;
}
p = p->next;
}
if (slow.x == fast.x && slow.y == fast.y)
{
goto label;
}
if (slow.x == food.x && slow.y == food.y)
{
goto label;
}
if (slow.x == point.x && slow.y == point.y)
{
goto label;
}
}
//创造加速食物
void creatfast()
{
snake* p;
srand((unsigned)time(NULL));
label:
fast.x = (rand() % (horizonx / 20 - 2) + 1) * 20;
fast.y = (rand() % ((verticaly - 1) / 20 - 1) + 1) * 20;
p = head;
while (p->next != NULL)
{
if (fast.x == p->x && fast.y == p->y)
{
goto label;
}
p = p->next;
}
if (fast.x == food.x && fast.y == food.y)
{
goto label;
}
if (fast.x == point.x && fast.y == point.y)
{
goto label;
}
if (fast.x == slow.x && fast.y == slow.y)
{
goto label;
}
}
//难度选择
void chosedifficult()
{
cleardevice();
mciSendString(_T("open music\\chosedifficult.mp3 alias chosedifficultbgm"), NULL, 0, NULL);//打开难度选择BGM
mciSendString("setaudio chosedifficultbgm volume to 180", NULL, 0, NULL);//控制音量大小
mciSendString(_T("play chosedifficultbgm repeat"), NULL, 0, NULL); //播放难度选择BGM
putimage(0, 0, &bac[5]);
int n;
outtextxy(graphlength / 2, 100, _T("选择难度"));
outtextxy(graphlength / 2, 150, _T("1.简单难度"));
outtextxy(graphlength / 2, 200, _T("2.一般难度"));
outtextxy(graphlength / 2, 250, _T("3.困难难度"));
outtextxy(graphlength / 2, 300, _T("4.炼狱难度"));
outtextxy(graphlength / 2, 350, _T("请选择:1.2.3.4"));
scanf("%d", &n);
switch (n)
{
case 1:
speed = 150;break;
case 2:
speed = 100;break;
case 3:
speed = 50;break;
case 4:
speed = 30;break;
default:
outtextxy(320, 350, _T("请输入有效的数字"));
system("pause");
while (getchar() != '\n');
chosedifficult();
}
mciSendString(_T("close chosedifficultbgm"), NULL, 0, NULL);//关闭选择难度bgm
welcome();
}
//游戏说明
void instructions()
{
cleardevice();
outtextxy(graphlength / 2, 50, _T("欢迎玩贪吃蛇这款游戏"));
outtextxy(graphlength / 2, 100, _T("通过按w,a,s,d控制蛇的移动"));
outtextxy(graphlength / 2, 150, _T("通过吃鸡腿来加速"));
outtextxy(graphlength / 2, 200, _T("通过吃猪排来减速"));
outtextxy(graphlength / 2, 250, _T("通过吃汉堡获取大量分数"));
outtextxy(graphlength / 2, 300, _T("通过吃蛋长大"));
outtextxy(graphlength / 2, 350, _T("吃到普通食物后会随机变换身体"));
outtextxy(graphlength / 2, 450, _T("游戏最终版权归chc小组所有"));
system("pause");
}
//游戏记录存档
void archive()
{
time_t timep;
tm *ti;
time(&timep);
ti = localtime(&timep);
record* data = (record*)malloc(sizeof(record));
data->year = ti->tm_year;
data->mon = ti->tm_mon;
data->day = ti->tm_mday;
data->hour = ti->tm_hour;
data->min = ti->tm_min;
data->sec = ti->tm_sec;
FILE* fp;
fp = fopen("out.text","ab");
if (fp == NULL)
{
fp = fopen("out.text","wb");
}
fwrite(data,sizeof(record),1,fp);
fclose(fp);
free(data);
}
//数组排序函数
int Cmpfunc(const void* a, const void* b)
{
return(*(int*)b - *(int*)a);//降序排序
}
void ranklist()
{
cleardevice();
mciSendString(_T("open music\\rank.mp3 alias rankbgm"), NULL, 0, NULL);//打开排行榜音乐
mciSendString(_T("play rankbgm repeat"), NULL, 0, NULL); //播放排行榜音乐
putimage(0, 0, &bac[0]);
int i = 0;
record data[1000];
FILE* fp = fopen("out.text", "rb");
if (fp == NULL)
{
outtextxy(graphlength / 2, 50, _T("暂无游戏记录"));
system("pause");
welcome();
}
rewind(fp);
while (!feof(fp))
{
fread(&data[i], sizeof(record), 1, fp);
i++;
}
qsort(data, i - 1, sizeof(record), Cmpfunc);
outtextxy(graphlength / 2, 50, _T("排行榜"));
outtextxy(graphlength / 2 - 200, 80, _T("得分"));
outtextxy(graphlength / 2 + 200, 80, _T("时间"));
for (int j = 0;j < i - 1;j++)
{
char score1[100] = "";
char a = ':';
sprintf(score1, "%d", data[j].framework);
outtextxy(graphlength / 2 - 200, 100 + j * 20, score1);
sprintf(score1, "%d%c", data[j].year + 1900, a);
outtextxy(graphlength / 2 + 200, 100 + j * 20, score1);
sprintf(score1, "%d%c", data[j].mon + 1, a);
outtextxy(graphlength / 2 + 250, 100 + j * 20, score1);
sprintf(score1, "%d%c", data[j].day, a);
outtextxy(graphlength / 2 + 300, 100 + j * 20, score1);
sprintf(score1, "%d%c", data[j].hour, a);
outtextxy(graphlength / 2 + 350, 100 + j * 20, score1);
sprintf(score1, "%d%c", data[j].min, a);
outtextxy(graphlength / 2 + 400, 100 + j * 20, score1);
sprintf(score1, "%d", data[j].sec);
outtextxy(graphlength / 2 + 450, 100 + j * 20, score1);
}
fclose(fp);
system("pause");
mciSendString(_T("close rankbgm"), NULL, 0, NULL);//关闭排行榜bgm
}
//得分显示
void scoreshow()
{
char score1[100] = { 0 };
sprintf(score1, "%d", score);
outtextxy(horizonx + 50, 30, _T("得分是:"));
outtextxy(horizonx + 120, 30, score1);
outtextxy(horizonx + 50, 70, _T("鸡蛋是普通食物"));
outtextxy(horizonx + 50, 110, _T("汉堡是奖励性食物"));
outtextxy(horizonx + 50, 150, _T("鸡腿是加速食物"));
outtextxy(horizonx + 50, 190, _T("猪排是减速食物"));
outtextxy(horizonx + 50, 230, _T("不能穿墙,不能咬到自己"));
outtextxy(horizonx + 50, 270, _T("用w a s d控制蛇的移动"));
outtextxy(horizonx + 50, 310, _T("按q退出游戏"));
}
//蛇身以及食物打印
void stamp()
{
snake* p;
p = head;
cleardevice();
BeginBatchDraw();
putimage(0, 0, &bac[map]);
creatframe();
transparentimage(food.x, food.y, &foodsrc, &foodmask);
if (count0_1 >= 4)
{
transparentimage(point.x, point.y, &pointsrc, &pointmask);
}
if (count1_1 >= 4)
{
transparentimage(fast.x, fast.y, &fastsrc, &fastmask);
}
if (count2_1 >= 4)
{
transparentimage(slow.x, slow.y, &lowsrc, &lowmask);
}
while (1)
{
if (p->next == NULL)
{
break;
}
transparentimage(p->x, p->y, &bodysrc[i], &bodymask[i]);
p = p->next;
}
scoreshow();
FlushBatchDraw();
EndBatchDraw();
}
//蛇的伸长
void eatfood()
{
srand(time(NULL));
snake* add;//add为新建的节点,用于蛇的伸长
add = (snake*)malloc(sizeof(snake));
if (add == NULL)
{
printf("内存分配不成功");
exit(0);
}
if (head->x == point.x && head->y == point.y)//判断蛇是否吃到奖励性食物,每吃到5个食物出现一个奖励性食物,且奖励性食物只出现8次
{
if (count0 < 8 && count0_1 >= 4)
{
count0++;
score += 15;
creatpoint();
count0_1 -= 4;
}
}
if (head->x == fast.x && head->y == fast.y)//判断蛇是否吃到加速食物,每吃到5个食物出现一个加速食物,且加速食物只出现8次
{
if (count1 < 8 && count1_1 >= 4)
{
count1++;
score += 5;
creatfast();
count1_1 -= 4;
speed -= 5;
}
}
if (head->x == slow.x && head->y == slow.y)//判断蛇是否吃到减速食物,每吃到5个食物出现一个减速食物,且减速食物只出现8次
{
if (count2 < 8 && count2_1 >= 4)
{
count2++;
score += 5;
creatslow();
count2_1 -= 4;
speed += 5;
}
}
if (head->x == food.x && head->y == food.y)
{
i = rand() % 10;
score += 5;
creatfood();
count0_1++;
count1_1++;
count2_1++;
}
if (score >= addnumber)//如果分数达到伸长所需分数,则将蛇伸长
{
addnumber += 15;
add->next = head->next;
head->next = add;
}
}
2.cpp:
#include<stdio.h>
#include<string.h>
#include"1.h"
#include"2.h"
#include"3.h"
#include"ceshi.h"
//设置地图bgm
void mapbgm()
{
if (map == 1)
{
mciSendString(_T("open music\\map1.mp3 alias map1bgm"), NULL, 0, NULL);//打开地图一bgm
mciSendString(_T("play map1bgm repeat"), NULL, 0, NULL); //播放地图一bgm
}
else if (map == 2)
{
mciSendString(_T("open music\\map2.mp3 alias map2bgm"), NULL, 0, NULL);//打开地图二bgm
mciSendString(_T("play map2bgm repeat"), NULL, 0, NULL); //播放地图二bgm
}
else if (map == 3)
{
mciSendString(_T("open music\\map3.mp3 alias map3bgm"), NULL, 0, NULL);//打开地图三bgm
mciSendString(_T("play map3bgm repeat"), NULL, 0, NULL); //播放地图三bgm
}
else if (map == 4)
{
mciSendString(_T("open music\\map4.mp3 alias map4bgm"), NULL, 0, NULL);//打开地图四bgm
mciSendString(_T("play map4bgm repeat"), NULL, 0, NULL); //播放地图四bgm
}
else if (map == 5)
{
mciSendString(_T("open music\\map5.mp3 alias map5bgm"), NULL, 0, NULL);//打开地图五bgm
mciSendString(_T("play map5bgm repeat"), NULL, 0, NULL); //播放地图五bgm
}
}
//存储图片
void loadpic()
{
loadimage(&bac[1], _T("pic\\map1.png"), graphlength, graphwidth);
loadimage(&bac[2], _T("pic\\map2.jpeg"), graphlength, graphwidth);
loadimage(&bac[3], _T("pic\\map3.jpg"), graphlength, graphwidth);
loadimage(&bac[4], _T("pic\\map4.jpg"), graphlength, graphwidth);
loadimage(&bac[5], _T("pic\\map5.jpg"), graphlength, graphwidth);
loadimage(&bac[6], _T("pic\\chosedifficult.png"), graphlength, graphwidth);
loadimage(&bac[7], _T("pic\\welcome.png"), graphlength, graphwidth);
loadimage(&bac[8], _T("pic\\instruction.png"), graphlength, graphwidth);
loadimage(&bac[9], _T("pic\\end.png"), graphlength, graphwidth);
loadimage(&bac[10], _T("pic\\chosemap.png"), graphlength, graphwidth);
loadimage(&bodysrc[0], _T("pic\\0pic.png"), picsize, picsize);
loadimage(&bodymask[0], _T("pic\\0pic_1.png"), picsize, picsize);
loadimage(&bodysrc[1], _T("pic\\1pic.png"), picsize, picsize);
loadimage(&bodymask[1], _T("pic\\1pic_1.png"), picsize, picsize);
loadimage(&bodysrc[2], _T("pic\\2pic.png"), picsize, picsize);
loadimage(&bodymask[2], _T("pic\\2pic_1.png"), picsize, picsize);
loadimage(&bodysrc[3], _T("pic\\3pic.png"), picsize, picsize);
loadimage(&bodymask[3], _T("pic\\3pic_1.png"), picsize, picsize);
loadimage(&bodysrc[4], _T("pic\\4pic.png"), picsize, picsize);
loadimage(&bodymask[4], _T("pic\\4pic_1.png"), picsize, picsize);
loadimage(&bodysrc[5], _T("pic\\5pic.png"), picsize, picsize);
loadimage(&bodymask[5], _T("pic\\5pic_1.png"), picsize, picsize);
loadimage(&bodysrc[6], _T("pic\\6pic.png"), picsize, picsize);
loadimage(&bodymask[6], _T("pic\\6pic_1.png"), picsize, picsize);
loadimage(&bodysrc[7], _T("pic\\7pic.png"), picsize, picsize);
loadimage(&bodymask[7], _T("pic\\7pic_1.png"), picsize, picsize);
loadimage(&bodysrc[8], _T("pic\\8pic.png"), picsize, picsize);
loadimage(&bodymask[8], _T("pic\\8pic_1.png"), picsize, picsize);
loadimage(&bodysrc[9], _T("pic\\9pic.png"), picsize, picsize);
loadimage(&bodymask[9], _T("pic\\9pic_1.png"), picsize, picsize);
loadimage(&foodsrc, _T("pic\\jidan.png"), picsize, picsize);
loadimage(&foodmask, _T("pic\\jidan_1.png"), picsize, picsize);
loadimage(&pointsrc, _T("pic\\hanbao.png"), picsize, picsize);
loadimage(&pointmask, _T("pic\\hanbao_1.png"), picsize, picsize);
loadimage(&fastsrc, _T("pic\\fast.png"), picsize, picsize);
loadimage(&fastmask, _T("pic\\fast_1.png"), picsize, picsize);
loadimage(&lowsrc, _T("pic\\pow.png"), picsize, picsize);
loadimage(&lowmask, _T("pic\\pow_1.png"), picsize, picsize);
}
//选择地图
void chosemap()
{
cleardevice();
putimage(0, 0, &bac[10]);
mciSendString(_T("open music\\chosemap.mp3 alias chosemapbgm"), NULL, 0, NULL);//打开地图选择音乐
mciSendString(_T("play chosemapbgm repeat"), NULL, 0, NULL); //播放地图选择音乐
outtextxy(graphlength / 2, 30, _T("选择地图"));
outtextxy(graphlength / 2, 70, _T("1.地图1"));
outtextxy(graphlength / 2, 110, _T("2.地图2"));
outtextxy(graphlength / 2, 150, _T("3.地图3"));
outtextxy(graphlength / 2, 190, _T("4.地图4"));
outtextxy(graphlength / 2, 240, _T("5.地图5"));
scanf("%d", &n);
switch (n)
{
case 1:
map = 1;
break;
case 2:
map = 2;
break;
case 3:
map = 3;
break;
case 4:
map = 4;
break;
case 5:
map = 5;
break;
default:
cleardevice();
while (getchar() != '\n');
outtextxy(graphlength / 2, 100, _T("请输入有效的数字"));
system("cls");
chosemap();
break;
}
mciSendString(_T("close chosemapbgm"), NULL, 0, NULL);//关闭地图选择界面bgm
}
//地图框架创建
void creatframe()
{
setlinecolor(LIGHTBLUE);
setfillcolor(LIGHTCYAN);
fillrectangle(0, 0, horizonx, width);
fillrectangle(0, verticaly, horizonx, graphwidth);
fillrectangle(0, width, width, verticaly);
fillrectangle(horizonx - width, width, horizonx, verticaly);
}
3.cpp:
#undef UNICODE
#undef _UNICODE
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include"1.h"
#include"2.h"
#include"3.h"
#include"ceshi.h"
//从键盘接收按键
int keyboard()
{
while (1)
{
if (endgame())//若游戏结束则返回0
{
return 0;
}
move_snake();
eatfood();
if (_kbhit())//_kbhit判断是否按下按键,若按下则读取按下的字符
{
key = _getch();
}
if ((key == 'w' && key1 == 's') || (key == 'a' && key1 == 'd') || (key == 's' && key1 == 'w') || (key == 'd' && key1 == 'a'))//避免连续两次按相反按键时咬到自己
{
key = key1;
}
if (key != 's' && key != 'd' && key != 'w' && key != 'a')//防止按其他按键时暂停
{
if (key == 'q')
{
system("pause");
exit(0);
}
key = key1;
}
else if ((key == 'w' && key1 != 's') || (key == 'a' && key1 != 'd') || (key == 's' && key1 != 'w') || (key == 'd' && key1 != 'a'))
{
key1 = key;
}
}
return 1;
}
//蛇的移动
void move_snake()
{
snake* p;
p = head;
int a = head->x, b = head->y;//a,b代替头部坐标
switch (key)//通过接受按键改变蛇的方向
{
case up:
head->y -= 20;
snakebody(a, b);
break;
case left:
head->x -= 20;
snakebody(a, b);
break;
case down:
head->y += 20;
snakebody(a, b);
break;
case right:
head->x += 20;
snakebody(a, b);
break;
case quit:
system("pause");
exit(0);
}
stamp();
Sleep(speed);//Sleep函数设置蛇的移动速度
}
//若蛇改变则移动方向的坐标改变
void snakebody(int a, int b)
{
snake* p = head->next;
int s1_x, s1_y;
int s2_x, s2_y;
s1_x = p->x;
s1_y = p->y;
while (1)//将蛇的前一段身体坐标给后一段
{
if (p->next->next == NULL)
{
break;
}
s2_x = p->next->x;
s2_y = p->next->y;
p->next->x = s1_x;
p->next->y = s1_y;
s1_x = s2_x;
s1_y = s2_y;
p = p->next;
}
p = head->next;
p->x = a;
p->y = b;
}
//游戏结束的条件,返回1表示游戏结束
int endgame()
{
if (head->x < width || head->y < width || head->x>(horizonx - width - picsize) || head->y>(graphwidth - width - picsize))
{
End();
return 1;
}
snake* p = head->next;
while (1)//判断是否咬到自己
{
if (p->next == NULL)
{
break;
}
if (head->x == p->x && head->y == p->y)
{
End();
return 1;
}
p = p->next;
}
return 0;
}
//游戏结束界面
void End()
{
clearcliprgn();
if (map == 1)
{
mciSendString(_T("close map1bgm"), NULL, 0, NULL);//关闭地图一bgm
}
else if (map == 2)
{
mciSendString(_T("close map2bgm"), NULL, 0, NULL);//关闭地图二bgm
}
else if (map == 3)
{
mciSendString(_T("close map3bgm"), NULL, 0, NULL);//关闭地图三bgm
}
else if (map == 4)
{
mciSendString(_T("close map4bgm"), NULL, 0, NULL);//关闭地图四bgm
}
else if (map == 5)
{
mciSendString(_T("close map5bgm"), NULL, 0, NULL);//关闭地图五bgm
}
putimage(0, 0, &bac[9]);
archive();
outtextxy(320, 30, _T("游戏结束"));
char score1[100] = { 0 };
sprintf(score1, "%d", score);
outtextxy(320, 70, _T("你的分数是:"));
outtextxy(320, 110, score1);
system("pause");
Free();
}
//蛇身创建
void creatsnake()
{
head = (snake*)malloc(sizeof(snake));//初始蛇的坐标,蛇的长度为3
if (head == NULL)
{
outtextxy(550, 30, _T("内存分配不成功"));
exit(0);
}
head->x = 20;
head->y = 20;
tail = (snake*)malloc(sizeof(snake));
if (tail == NULL)
{
outtextxy(550, 30, _T("内存分配不成功"));
exit(0);
}
snake_1 = (snake*)malloc(sizeof(snake));
snake_2 = (snake*)malloc(sizeof(snake));
if (snake_1 == NULL || snake_2 == NULL)
{
outtextxy(550, 30, _T("内存分配不成功"));
exit(0);
}
snake_1->x = 20;
snake_1->y = 40;
snake_2->x = 20;
snake_2->y = 60;
head->next = snake_1;
snake_1->next = snake_2;
snake_2->next = tail;
tail->next = NULL;
}