第二次做动画显示效果的小程序,心血来潮想做下儿时的经典游戏----贪吃蛇。由于时间有限,只是简单地做了基本功能,有时间后再完善更多功能。
由于个人水平有限,可能代码有些地方可以改进。不足之处敬请指出。
注:要运行该代码需要正确配置,连接好ege图形库的头文件,做好准备工作。具体教程请看http://jingyan.baidu.com/article/4b07be3c40d35f48b380f3c7.html
编程环境:codeblocks windows10 corei5 cpu
源代码:
#include < stdio.h >
#include < graphics.h >
#include < windows.h >
#include < stdlib.h >
#define Random(x)(rand() % x)
struct position {
int x;
int y;
position * next;
};
class snake {
private: int direction;
public: position * tail;
position * head;
position * gettail() {
return tail;
}
void settail(position * p) {
tail = p;
}
position * gethead() {
return head;
}
void sethead(position * p) {
head = p;
}
snake() {
tail = new position;
head = new position;
head - >x = 75;
head - >y = 15;
tail - >x = 15;
tail - >y = 15;
tail - >next = new position;
tail - >next - >x = 45;
tail - >next - >y = 15;
tail - >next - >next = head;
direction = 4;
}
void setdirection(int a) {
direction = a;
}
int getdirection() {
return direction;
}
void move(int x0, int y0, bool & newfood) {
switch (direction) {
position * p;
int xt;
int yt;
case 1:
{
head - >next = new position;
xt = head - >x;
yt = head - >y;
head = head - >next;
head - >x = xt;
head - >y = yt - 30;
p = tail - >next;
delete tail;
tail = p;
break;
}
case 2:
{
head - >next = new position;
xt = head - >x;
yt = head - >y;
head = head - >next;
head - >x = xt;
head - >y = yt + 30;
p = tail - >next;
delete tail;
tail = p;
break;
}
case 3:
{
head - >next = new position;
xt = head - >x;
yt = head - >y;
head = head - >next;
head - >x = xt - 30;
head - >y = yt;
p = tail - >next;
delete tail;
tail = p;
break;
}
case 4:
{
head - >next = new position;
xt = head - >x;
yt = head - >y;
head = head - >next;
head - >x = xt + 30;
head - >y = yt;
p = tail - >next;
delete tail;
tail = p;
break;
}
}
if (head - >x == x0 && head - >y == y0) {
newfood = 1;
switch (direction) {
int xt;
int yt;
case 1:
{
head - >next = new position;
xt = head - >x;
yt = head - >y;
head = head - >next;
head - >x = xt;
head - >y = yt - 30;
break;
}
case 2:
{
head - >next = new position;
xt = head - >x;
yt = head - >y;
head = head - >next;
head - >x = xt;
head - >y = yt + 30;
break;
}
case 3:
{
head - >next = new position;
xt = head - >x;
yt = head - >y;
head = head - >next;
head - >x = xt - 30;
head - >y = yt;
break;
}
case 4:
{
head - >next = new position;
xt = head - >x;
yt = head - >y;
head = head - >next;
head - >x = xt + 30;
head - >y = yt;
break;
}
}
}
}
void show() {
position * p = gettail();
int sum = 0;
while (p != gethead() - >next) {
sum++;
if (head - >x > 0 && head - >x < 900 && head - >y > 0 && head - >y < 900) {
setfillcolor(EGERGB(255, 0, 0));
bar(p - >x - 15, p - >y - 15, p - >x + 15, p - >y + 15);
setfillcolor(EGERGB(0, 0, 255));
bar(p - >x - 13, p - >y - 13, p - >x + 13, p - >y + 13);
p = p - >next;
} else {
setcolor(EGERGB(255, 0, 0));
setfontbkcolor(EGERGB(0x80, 0x00, 0x80));
setfont(100, 0, "宋体");
outtextxy(250, 360, "GAMEOVER");
if (sum < 20) outtextxy(250, 460, "菜鸟水平");
if (sum >= 20 && sum < 40) outtextxy(250, 460, "高手水平");
setfont(70, 0, "宋体");
if (sum >= 40 && sum < 60) outtextxy(100, 460, "你骨骼精奇,是个奇才");
if (sum >= 60) outtextxy(200, 360, "你已经成仙了");
Sleep(1000);
getch();
}
int hx,
hy;
hx = head - >x;
hy = head - >y;
position * p2 = gettail();
while (p2 != gethead()) {
if (hx == p2 - >x && hy == p2 - >y) {
setcolor(EGERGB(255, 0, 0));
setfontbkcolor(EGERGB(0x80, 0x00, 0x80));
setfont(100, 0, "宋体");
outtextxy(250, 360, "GAMEOVER");
if (sum < 20) outtextxy(250, 460, "菜鸟水平");
if (sum >= 20 && sum < 40) outtextxy(250, 460, "高手水平");
setfont(70, 0, "宋体");
if (sum >= 40 && sum < 60) outtextxy(100, 460, "你骨骼精奇,是个奇才");
if (sum >= 60) outtextxy(200, 360, "你已经成仙了");
Sleep(1000);
getch();
}
p2 = p2 - >next;
}
}
}
};
int main() {
INITGRAPH(900, 900);
setfillcolor(EGERGB(255, 0, 0));
snake s1;
char k;
bool newfood = 1;
for (;;) {
delay_fps(8);
int fx;
int fy;
if (newfood) {
//下面的代码是食物的显示
L: fx = Random(30) + 1;
fy = Random(30) + 1; //贪吃蛇的食物产生位置是随机的
fx = fx * 30 - 15;
fy = fy * 30 - 15;
bool bo = 1;
position * p = s1.gettail();
while (p != s1.gethead() - >next) {
if (p - >x == fx && p - >y == fy) {
bo = 0; //食物不能产生在蛇身体的位置;
break;
}
p = p - >next;
}
if (!bo) goto L;
newfood = 0;
}
//手动模式:
if (kbhit()) {
k = getch();
switch (k) {
case 38:
if (s1.getdirection() != 2) s1.setdirection(1);
break; //根据键值修改对应的方向
case 40:
if (s1.getdirection() != 1) s1.setdirection(2);
break;
case 37:
if (s1.getdirection() != 4) s1.setdirection(3);
break;
case 39:
if (s1.getdirection() != 3) s1.setdirection(4);
break;
}
}
s1.move(fx, fy, newfood);
cleardevice();
s1.show();
setfillcolor(EGERGB(0, 0, 255));
bar(fx - 15, fy - 15, fx + 15, fy + 15);
setfillcolor(EGERGB(0, 255, 0));
bar(fx - 15, fy - 15, fx + 15, fy + 15);
//Sleep(80);
}
}
运行效果截图: