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);
}
时间: 2024-10-29 19:11:17

C++简单贪吃蛇实现的相关文章

JavaScript实现简单贪吃蛇小游戏

之前上Web课,学到JavaScript的时候,老师要求写几个静态页面,要用到JavaScript.想了想就写个贪吃蛇吧.其实之前用pygame写过一次GUI的贪吃蛇,素材都是自己拿画图画的,其丑无比.所以这次还是老老实实用字符吧. 首先,是一些全局变量的定义: 1 <script> 2 var state = 0;//0 wait 1 run 2 over 3 var width = 40; 4 var height = 25; 5 var update = false; 6 var dir

java 简单贪吃蛇

说了是简单版贪吃蛇... 就3个类+方向枚举变量(本来想写贪吃蛇斜着走的..想象我的蛇是矩形 斜着难看就没写) 上下左右键控制移动 空格暂停 SnackClient类 package com.xynu.snaker; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListene

简单贪吃蛇

在游戏开始时,分数为0,游戏结束时会弹出分数. 代码: <!DOCTYPE html><html><head><meta charset="UTF-8"><title>贪吃蛇</title><style>*{padding: 0;margin: 0;}#layer{border-collapse:collapse; border-spacing:0;}#layer td{width: 40px;heig

简单贪吃蛇游戏js

新手,仿照别人的写的.只能实现简单的功能,代码如下: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8" /> 5 <title></title> 6 <style> 7 *{ 8 margin: 0; 9 padding: 0; 10 } 11 #box{ 12 position: absolute; 13 left: 0; 14 t

小游戏●贪吃蛇1(利用二维数组制作)

利用二维数组编写简单贪吃蛇小游戏,由于是初学C#,用的是单线程,所以蛇不会自动前进 代码及简要分析如下: 1 //定义地图,0为空,1为墙,2为蛇,3为食物 2 int[,] map = new int[15, 15]{ 3 {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, 4 {1,2,0,0,0,0,0,0,0,0,0,0,0,0,1}, 5 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, 6 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

在ARM版上开发的贪吃蛇

本文主要为贪吃蛇部分代码的实现,开发板的按键以及触屏中断等,本文不做重点讲解 前一阵子学习了mini2440板的开发,并开发了一个简单贪吃蛇的游戏 游戏功能清单:1.游戏开始 2.游戏难度设置(简单,普通,困难) 3.游戏结束 4.蛇的正常运行路线(触碰障碍物或者蛇本身随即游戏结束,不能反方向行动) 5.通过内设时钟,产生随机种子,从而产生随机分布的"食物" 以下为代码解析部分: #include "snake_game.h" #include "adct

javascript之【贪吃蛇系列】第一弹:简单的贪吃蛇实现

参考博客:http://blog.csdn.net/sunxing007/article/details/4187038 以上博客是参考,毕竟第一次做,真让自己盲人摸象做不出来. 不过我在其上做了一些改进,界面等效果看起来更好一些. 下图是在Chrome上运行的效果,但是火狐和IE会不兼容,onkeydown事件不能正确调用 这里用了一张图把贪吃蛇制作过程的思想画了出来,画的有点简陋: 下面就是把代码发上来,上边有详细的解释: <html> <head> <title>

一个简单的“贪吃蛇”小游戏

一个简单的“贪吃蛇”小游戏 页面结构 简单的21x21的方块,页面结构 id为container的div包含所21个class名为row的div,每个row代表贪吃蛇的一整行,每个row中又包含21个div,代表这一行的每一个div方格,如果这个方格是空的话,div的类名为blank,如果这一个方格表示“贪吃蛇”的“食物”,div的类名为food,如果这一个方格表示“蛇”,div的类名为snake. CSS JS 然后我们思考下一个贪吃蛇游戏需要那些参数, 首先,界面中可见的元素无非就是空方格,

简单的贪吃蛇

最近都在忙着复习考试,忙里偷闲,抽出时间写了个贪吃蛇,没时间写详细的思路了,代码里有比较详细的注释,有兴趣的同学可以自己看看.(感觉写的相对来说还是比较简短的,如果有什么写的不好或是不对的地方,欢迎各位指出).在写这个贪吃蛇时,我省去了很多不必要的功能,只实现了最基本的功能,界面也比较粗糙,游戏功能也不见得很完善,只是为了用尽量少的代码来实现主体功能,大家可以在这个基础上进行修改和完善. /*----------------------------------------------------