C++簡單貪吃蛇實現

fbwd 9年前發布 | 2K 次閱讀 C/C++

#include <iostream>

include <stdlib.h>

include <stdio.h>

include <unistd.h>

include <deque>

include <list>

define SIZE 30

define SET cout<<"\033[?25l\033[0m"

static int flags = 0;

typedef int Array[SIZE][SIZE]; using namespace std;

struct Pos { int x; int y; Pos(int X,int Y):x(X),y(Y){} };

class Grial { public: Grial(Array a) { for(int i=0;i<SIZE;i++) { for(int j=0;j<SIZE;j++) { ar[i][j] = a[i][j]; } } } void Init(Pos start) { int i = 0; int j = 0; char ch; deque<Pos> Q; list<Pos> Mlist; ar[start.x][start.y] = 1; Q.push_front(start); while(1) { system("stty raw -echo");//改變終端控制, //輸入一個字符就立刻相應,將原來的\n作為結束的標志, //改為輸入一個字符就立即返回。 ch = getchar(); system("stty -raw echo"); //讓終端變回正常。 switch(ch) { case 'w': stateUp(Q);
system("clear"); Printf(); break; case 'a': stateLeft(Q); system("clear"); Printf(); break; case 'd': stateRight(Q); system("clear"); Printf(); break;
case 's': stateDown(Q); system("clear"); Printf(); break; default: if(ch=='0') exit(1); } GrialM(Mlist); if(flags==0) { Pos pos = AdancePoint(Mlist); ar[pos.x][pos.y] = 1;//隨機點。 flags=1; } sleep(0.675); } }

bool IsIn(Pos pos,deque<Pos> &Q) { deque<Pos> :: iterator it=Q.begin(); while(it!=Q.end()) { if(pos.x==it->x && pos.y==it->y) return true; it++; } return false; }

void GrialM(list<Pos> &Mlist)//構造隨機鏈表. { for(int i=0;i<SIZE;i++) { for(int j=0;j<SIZE;j++) { if(ar[i][j]==0) Mlist.push_back(Pos(i,j)); } } }

Pos AdancePoint(list<Pos> &Mlist) { int n = Mlist.size(); list<Pos> :: iterator it = Mlist.begin(); advance(it,rand()%n); return Pos(it->x,it->y); }

void stateUp(deque<Pos> &Q) { Pos pos = Q.front(); int x ; if(pos.x==0) { x = SIZE-1;} else {x = pos.x-1;} int y = pos.y; Pos result(x,y); if(IsIn(result,Q)) { exit(-1); } if(ar[x][y]==1) { Q.push_front(result);
flags=0; return ; } ar[x][y] = 1; Q.push_front(result);

Pos ret = Q.back();
    ar[ret.x][ret.y] = 0;
    Q.pop_back();
}
void stateLeft(deque<Pos> &Q)
{
    Pos pos = Q.front();
    int x = pos.x;
    int y;
    if(pos.y==0)
    {   
        y = _SIZE_-1;
    }
    else{y = pos.y-1;}
    Pos result(x,y);
    if(IsIn(result,Q))
    {
        exit(-1);
    }
    if(ar[x][y]==1)
    {
        Q.push_front(result);
        flags=0;
        return ;
    }
    ar[x][y] = 1;
    Q.push_front(result);
    Pos ret = Q.back();
    ar[ret.x][ret.y] = 0;
    Q.pop_back();
}
void stateRight(deque<Pos> &Q)
{
    Pos pos = Q.front();
    int x = pos.x;
    int y ;
    if(pos.y==_SIZE_-1)
    {
        y=0;
    }   
    else {y=pos.y+1;}
    Pos result(x,y);
    if(IsIn(result,Q))
    {
        exit(-1);
    }
    if(ar[x][y]==1)
    {
        Q.push_front(result);
        flags=0;
        return ;
    }
    ar[x][y] = 1;
    Q.push_front(result);
    Pos ret = Q.back();
    ar[ret.x][ret.y] = 0;
    Q.pop_back();
}
void stateDown(deque<Pos> &Q)
{
    Pos pos = Q.front();
    int x ;
    if(pos.x==_SIZE_-1)
        {x=0;}
    else {x = pos.x+1;}
    int y = pos.y;
    Pos result(x,y);
    if(IsIn(result,Q))
    {
        exit(-1);
    }
    if(ar[x][y]==1)
    {   
        Q.push_front(result);
        flags=0;
        return ;
    }
    ar[x][y] = 1;
    Q.push_front(result);
    Pos ret = Q.back();
    ar[ret.x][ret.y] = 0;
    Q.pop_back();
}
public:
void Printf()
{
    _SET_;
    for(int i=0;i<_SIZE_;i++)
    {
        for(int j=0;j<_SIZE_;j++)
        {
            if(ar[i][j]==1)
                {
                cout<<"\033[34m1\033[0m ";
                }
            else
                cout<<ar[i][j]<<" ";
        }
        cout<<endl;
    }
}
private:
Array ar;

}; int main() { Array arr={0}; Grial gl(arr); int x = rand()%10; int y = rand()%10; Pos start(x,y); gl.Init(start); }</pre>

 本文由用戶 fbwd 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!