采用c++ stack和easyx 栈快速实现贪吃蛇游戏开发

偶感手痒,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;
}

猜你喜欢

转载自blog.csdn.net/liaojiede/article/details/81460957