偶感手痒,C++来实现一个贪吃蛇的游戏,用的是EASY-X图形显示库,简单地使用stack实现蛇的身体,用len记录蛇的长度,试了下,很流畅啊
代码都在这里了:
//#include "stdafx.h"
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <graphics.h> // 引用图形库头文件
#include <conio.h>
#include<windows.h>
#include<stack>
#include<ctime>
#include<conio.h>
#include<iostream>
using namespace std;
class snacxandy
{
public:
int snac_x;
int snac_y;
};
class snake
{
public:
int snac_x;
int snac_y;
int snac_len;
stack<snacxandy>snacXYb;//每次加入的蛇身位置存放地
stack<snacxandy>snacXY;
int snacfill()//填充,按照len来填充,每次刷新屏幕后, 注意:应该把蛇身存起来再刷新
{
int flag_die_eat=0;
flag_die_eat=0;
snacXY=snacXYb;
snacxandy newsnac;
newsnac=snacXY.top();//判断蛇头是不是绿豆
if(GREEN==getpixel(newsnac.snac_x, newsnac.snac_y))
{
flag_die_eat=2;
// snac_len+=1;
}//eat
for(i=0;i<snac_len;i++)
{
setfillcolor(BLUE);
newsnac=snacXY.top();
if( snacdie(newsnac.snac_x,newsnac.snac_y))
{ flag_die_eat=1; } //die
solidcircle(newsnac.snac_x,newsnac.snac_y,6);//蛇身填充
snacXY.pop();
}
return flag_die_eat;
}
bool snacdie(int snac_x,int snac_y)//是否靠边,是否碰到自己
{
//for(i=0;
if(BLUE==getpixel(snac_x, snac_y))
return 1;
else if(snac_x<0||snac_x>800||snac_y<0||snac_y>600)
return 1;
else
return 0;
}
int snaceat(int snacx,int snacy)//响应方向键等扩长蛇身stack,,,,, ,步长10,主:每一秒一个步长
{
snacxandy newsnaca;
newsnaca.snac_x=snacx;
newsnaca.snac_y=snacy;
snacXYb.push(newsnaca);
}
int snacposadd(int pos)//按照给定方向增加一个步长的stack
{
snacxandy snactemp;
//snac_len+=1;
switch(pos){
case 1:
//上
snactemp=snacXYb.top();
snactemp.snac_y-=10;
snacXYb.push(snactemp);
break;
case 2:
//下
//
snactemp=snacXYb.top();
snactemp.snac_y+=10;
snacXYb.push(snactemp);
break;
case 3:
//左
//pos_key=3;
snactemp=snacXYb.top();
snactemp.snac_x-=10;
snacXYb.push(snactemp);
break;
case 4:
//右
//pos_key=4;
snactemp=snacXYb.top();
snactemp.snac_x+=10;
snacXYb.push(snactemp);
break;
}
return 1;
}
snake()//构造函数
{
snacxandy init;
init.snac_x=400;
init.snac_y=300;
snacXYb.push(init);
snac_len=1;
snacfill();
}
private:
int i;
};
class bean
{
public:
const static int bean_len=100;
int beanxy[2][bean_len];
//
int beanfill()//显示豆子,
{
setfillcolor(GREEN);
for (i=0;i<bean_len;i++)
solidcircle(beanxy[0][i],beanxy[1][i],10);
return 1;
}
//随机产生豆子
//。。后版本增加豆子可能重叠的排除。
bean()//构造函数
{
beanbuild();
beanfill();
}
int beanbuild()
{
//int j=0;
srand((unsigned)time(NULL));
for(i=0;i<bean_len;i++)
{
beanxy[0][i]=(rand()%700)/10*10;
beanxy[1][i]=(rand()%500)/10*10;
}
return 1;
}
//响应删除豆子,马上生成新豆子
int beandele(int beanx,int beany)
{
for(i=0;i<bean_len;i++)
{
if((beanxy[0][i]-beanx<=3)&&(beanxy[1][i]-beany<=3))
{
beanxy[0][i]=rand()%700;
beanxy[1][i]=rand()%500;
}
}
return 1;
}
private:
int bean_x;
int bean_y;
int i;
};
int _tmain(int argc, _TCHAR* argv[])
{ //int snak_x=400;
//int snak_y=300;
int bean_x=350;
int bean_y=250;
int pos_key=1;
int test=1;
TCHAR snaclenth[50];
TCHAR tip[]=_T("得分:");
initgraph(802, 602); // 创建绘图窗口,大小为 像素
// circle(200, 200, 100); // 画圆,圆心(200, 200),半径 100
POINT pts[] = { {2,2}, {800, 2}, {800, 600}, {2, 600}};
polygon(pts, 4);//画边框
snake newsnackem;
bean new_beans;
snacxandy snactemp;
clock_t time;
/*
fillpolygon(pts, 4);//测试用
if(GREEN==getpixel(80, 90))
test=100;
*/
//响应键盘,设置步长,自动向前,方向,调用吃豆,调用蛇增长并判断返回是否蛇die,走一步前存储蛇身长度,走一步刷新屏幕,再显示
while(1)
{
//pos_key=getch();
//if(pos_key==
time = clock();
while(clock()-time<300)
if(kbhit())
switch(_getch())
{
case 224: //方向键区的ASCII码
switch(_getch())
{
case 72:
//上
pos_key=1;
break;
case 80:
//下
pos_key=2;
break;
case 75:
//左
pos_key=3;
break;
case 77:
//右
pos_key=4;
break;
}
}
//_sleep(300);
newsnackem.snacposadd(pos_key);
cleardevice();//用这个刷新屏幕
polygon(pts, 4);//画边框
new_beans.beanfill();
switch (newsnackem.snacfill())
{
case 2:
//new_beans.beandele(newsnackem.snacXYb.top())
snactemp=newsnackem.snacXYb.top();
new_beans.beandele(snactemp.snac_x,snactemp.snac_y);
newsnackem.snac_len+=1;
break;
case 1:
MessageBox( NULL , TEXT("再给一次机会") , NULL , MB_ICONINFORMATION|MB_YESNO);
break;
}
_stprintf(snaclenth, _T("%d"), newsnackem.snac_len); // 高版本 VC 推荐使用 _stprintf_s 函数
outtextxy(10, 10,tip);
outtextxy(10, 20,snaclenth);
}
setfillcolor(BLUE);
solidcircle(100,20,10);//蛇
setfillcolor(GREEN);
solidcircle(bean_x,bean_y,10);
_getch();
cleardevice();//用这个刷新屏幕
_getch(); // 按任意键继续
closegraph(); // 关闭绘图窗口
return 0;
}