24小时热门版块排行榜    

CyRhmU.jpeg
查看: 1498  |  回复: 7

viking1992

新虫 (初入文坛)

[求助] 大二编程废求助高手解答一下这个贪吃蛇的C++程序

看到一个贪吃蛇的C++程序  中间有几个地方不懂 求指教!

#include
#include
#include
#include
#include   //使用当前时间做种子;
enum dir{up,down,left,right};  //枚举类型enum dir;
//围墙;
class Fence{
public:
        void InitFence();
        void OutputF();
public:
        char game[20][20];
}f; //定义对象;
//画框框;
void Fence::InitFence(){
        for(int i=0; i<20; i++)
                for(int j=0; j<20; j++){
                        if(i==0||i==19||j==0||j==19)
                                game[j]= '*';
                        else game[j]= ' ';
        }
}
//显示框框;
void Fence::OutputF(){
        for(int i=0; i<20; i++){
                for(int j=0; j<20; j++)
                        cout<[j]<<' ';
                        cout<                 }
}

//蛇结点;
class SnakeNode{
private:
        int x,y;
        SnakeNode *prior,*next;
public:
        void add_head(int x,int y);
        int get_x();
        int get_y();
        void delete_tail();
}*head=NULL, *tail =NULL;
//插入头结点;
void SnakeNode::add_head(int x,int y){
        SnakeNode *q=new SnakeNode;
        q->x =x; q->y =y;
        q->next =head;         
        q->prior =NULL;
        if(head) head->prior =q;
        head =q;
        if(!tail) tail =head;
        f.game[x][y]= '*';  //f对象可以在定义Fence类时定义; 且Fence类在SnakeNode类前定义;
}
int SnakeNode::get_x(){
        return x;
}
int SnakeNode::get_y(){
        return y;
}
//删除尾结点;
void SnakeNode::delete_tail(){
        SnakeNode *p =tail;
        f.game[tail->get_x()][tail->get_y()]= ' ';//把尾结点的坐标表示的'*'置为空格;
        if(tail==head)
                tail= head= NULL;
        else{
                tail= tail->prior;
                tail->next= NULL;
        }
        delete p;
}

//move移动;
class move{
public:
        dir point;    //枚举变量point: 控制方向;
        int food_x;
        int food_y;
public:
        void moving();
        void change_point(char);  //改变方向;
        void get_food();
};

void move::moving(){
        int a,b;
        a= head->get_x();  //取得头结点横坐标
        b= head->get_y();  //头结点纵坐标
        switch(point){
        case up: --a; break;
        case down: ++a; break;
        case left: --b; break;
        case right: ++b; break;
        }
        if(a==19||b==19||a==0||b==0){                                //判断是否撞墙;                                               
                cout<<"game over!!!"<                 exit(0);
        }
        if(a==food_x && b==food_y){                                        //吃food;
                head->add_head(a,b);
                get_food();
        }
        else{
                head->add_head(a,b); //插入头结点;
                head->delete_tail(); //删除尾结点;
        }
}

void move::change_point(char keydown){
        switch(keydown){
        case 'w': point= up; break;
        case 's': point= down; break;
        case 'a': point= left; break;
        case 'd': point= right; break;
        }
}
void move::get_food(){
        srand((unsigned int) time(NULL)); //做种子(程序运行时间);
        food_x= rand()%18+1;
        food_y= rand()%18+1;
        f.game[food_x][food_y]= '*';
}

//main();
int main(){
        cout<<"Using 'w,s,a,d'to control direction!!!\n\n\n";
        //画框框和小蛇;
        move m;
        f.InitFence();
        head->add_head(4,3);
        head->add_head(4,4);
        head->add_head(4,5);
        m.get_food();
        f.OutputF();
        while (true){
                char keydown= getch(); //getch()返回键盘上读取的字符;包含头文件
                m.change_point(keydown);
                while(!kbhit()){ //判断有没有按键落下;
                         system("cls" );  //清屏函数               
                                 m.moving();
                        f.OutputF();
                        Sleep(200);
                }
        }
        return 0;
}
问一下红字部分程序的设置目的 以及怎么运行和实现的……(简要的说 就是什么意思= =)
特别是结点那一块……动态数组和各种指针什么的 看着就头大………………
多谢了

[ Last edited by 微尘、梦想 on 2011-8-27 at 20:06 ]
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

幽人竹桑園 歸臥寂無喧 物情今已見 ?拇擞麩o言
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

viking1992

新虫 (初入文坛)

话说……那个诡异的出现在程序中间的表情真的不关我的事……
幽人竹桑園 歸臥寂無喧 物情今已見 ?拇擞麩o言
2楼2011-08-27 18:57:38
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

imyourkobe

铁杆木虫 (著名写手)

【答案】应助回帖

★ ★
viking1992(金币+5): 虽然依旧不是很懂……不过谢谢了~都木有人理我TUT 2011-08-28 15:00:05
余泽成(金币+2): 谢谢参与应助! 2011-09-01 15:38:46
数据结构中的。
1)双向链表插入操作:插入到表头的处理
q->next =head; //把q对应结点插入到 head位置,即head为q后继。      
q->prior =NULL;//q对应结点是表头了,对应的prior 应该为空。
if(head)
head->prior =q;//如果已经存在头结点,要处理原头结点,把其前驱设置为q结点
head =q;        //q作为新头结点
2)删除操作类似的。
3楼2011-08-28 12:15:06
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

imyourkobe

铁杆木虫 (著名写手)


dubo(金币+1): 欢迎讨论 2011-09-01 19:47:31
好好看看数据结构的链表操作:插入和删除内容啊!
4楼2011-08-28 15:59:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

viking1992

新虫 (初入文坛)


dubo(金币+1): 欢迎讨论 2011-09-01 19:47:40
引用回帖:
4楼: Originally posted by imyourkobe at 2011-08-28 15:59:56:
好好看看数据结构的链表操作:插入和删除内容啊!

我……還木有學數據結構…………下學期的課程
幽人竹桑園 歸臥寂無喧 物情今已見 ?拇擞麩o言
5楼2011-09-01 10:09:07
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

imyourkobe

铁杆木虫 (著名写手)

引用回帖:
5楼: Originally posted by viking1992 at 2011-09-01 10:09:07:
我……還木有學數據結構…………下學期的課程

那看不懂不怪你啊。慢慢学习吧。
6楼2011-09-01 13:42:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

文俊点点

木虫 (著名写手)


dubo(金币+1): 欢迎讨论 2011-09-01 19:47:49
数据结构不用学的  看看就可以了   那个逻辑是固定的········
这是你所拥有的时间·····这是你所能改变的生活·········
7楼2011-09-01 18:21:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

viking1992

新虫 (初入文坛)

引用回帖:
7楼: Originally posted by 文俊点点 at 2011-09-01 18:21:02:
数据结构不用学的  看看就可以了   那个逻辑是固定的········

反正是必修課=_,=
幽人竹桑園 歸臥寂無喧 物情今已見 ?拇擞麩o言
8楼2011-09-04 08:48:46
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 viking1992 的主题更新
信息提示
请填处理意见