C++数据结构思想实现贪吃蛇,,大神帮忙啊

qq_34346817 2016-12-27 02:31:04
实现基本的贪吃蛇的功能就好
...全文
246 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
AAAbloom 2016-12-27
  • 打赏
  • 举报
回复
这用的是c++源代码写的,没有用数据结构思想,最具本的实现。 #include <iostream> #include <ctime> #include <conio.h> #include <stdlib.h> #include <windows.h> using namespace std; #define N 100 enum dir{up,down,left,right}; //枚举类型enum dir; class Snake { public: void move(char direction);//移动 bool isdirection(char a);//改变方向 void showsnake(); bool TouchSelf(); //是否咬到自己的身体 void showout();//显示 bool ishitground(); //是否碰到墙壁 bool iseatfood();//吃到食物否 private: int x[N]; int y[N]; int length;//蛇长 }; class Ground { public : void show();//显示墙壁 void setdrawme();//设置墙壁的长宽 public : char game [20][30]; //设置墙壁的长宽 }ground; class Food { public: void getfood();//获得随机食物 int x; int y;//食物的坐标 }food; void Snake::move(char direction) { int i; int xx, yy; //cout<<"Snake move"<<endl; xx = x[length-1]; yy = y[length-1]; /*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/ for (i = length - 1; i > 0; i--) { x[i]=x[i-1]; y[i]=y[i-1]; } /*w,a,s,d表示上,下,左,右四个方向,通过这个判断来移动蛇头*/ switch(direction) { case 'w': x[0]--; break; case 's': x[0]++; break; case 'a': y[0]--; break; case 'd': y[0]++; break; } if (iseatfood() == 1) { // 吃到食物变长 x[length] = xx; y[length] = yy; length++; } else { // 前移之后,尾部清空 ground.game[xx][yy]=' '; } } bool Snake::isdirection(char a) { switch(a) { case 'w': case 's': case 'a': case 'd': return true; default: return false; } } //显示蛇 void Snake::showsnake() { int i; for (i=0;i<length;i++) ground.game[x[i]][y[i]]='@'; } bool Snake::TouchSelf() { int i; cout<<"Snake TouchSelf"<<endl; for(i=3;i<length;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/ { if(x[i]==x[0]&&y[i]==y[0]) { cout<<"Game over"<<endl;/*显示失败*/ return 0; } } return 1; } void Snake::showout() { //dcout<<"Snake drawme"<<endl; x[0]=10;y[0]=10;/*蛇头*/ x[1]=11;y[1]=10; length=2;/*节数*/ ground.game[x[0]][y[0]]='@'; ground.game[x[1]][y[1]]='@'; } //是否碰到墙壁 bool Snake::ishitground() { cout<<"is Snake hitground ?"<<endl; if(x[0]<=0||x[0]>=19||y[0]<=0||y[0]>=29)/*蛇是否撞到墙壁*/ { cout<<"Game over"<<endl;/*本次游戏结束*/ return 0; } else return 1; } //是否吃到食物 bool Snake::iseatfood() { if (x[0]==food.x&&y[0]==food.y) return 1; else return 0; } //设置墙壁的长和宽 void Ground::setdrawme() { int i,j; for( i=0; i<20; i++) for( j=0; j<30; j++) { if(i==0||i==19||j==0||j==29) game[i][j]= '*'; else game[i][j]= ' '; } } //显示出墙壁 void Ground::show() { int i,j; for( i=0; i<20; i++) { for(j=0; j<30; j++) cout<<game[i][j]<<" "; cout<<endl; } } void Food::getfood () { //cout<<"Snake getfood "<<endl; srand((unsigned int) time(NULL)); //做种子(程序运行时间); x= rand()%18+1; y= rand()%28+1; ground.game[x][y]='*'; } int main () { Snake snake; ground.setdrawme(); snake.showout(); food.getfood(); ground.show(); while (true ) { char a=getch();//getch()返回键盘上读取的字符;包含头文件<conio.h> bool bl = snake.isdirection(a); if (bl)//判断有没有按键落下; { system("cls");//清屏函数; snake.move(a); snake.showsnake(); if( snake.iseatfood()==1) food.getfood(); ground.show(); if( snake.TouchSelf()==0) exit (0); else if (snake.ishitground()==0) exit (0); Sleep(100); } } // ground.drawme(); return 0; }
ooolinux 2016-12-27
  • 打赏
  • 举报
回复
C++类方式的没写过,C方式加上STL的写过一个。
zy380526481 2016-12-27
  • 打赏
  • 举报
回复
碰巧我前段时间做过一个简单的贪吃蛇游戏,使用STL可以使问题变得很简单。 大体思路如下: 使用一个deque<>(双端队列)容器来储存蛇身体每个点的坐标,蛇每前进一次时,根据前进方向产生一个新的点,用push_front函数插入到队列的前面,用pop_back函数删除队列末端的点。 使用随机数在界面中生成一个食物,如果食物在蛇的身上就再生成一个,直到食物的位置合法。 蛇在每前进一次删除尾部的点前先把它保存起来。如果蛇头和食物位置重合,则判断蛇吃到了食物,此时把保存的蛇尾部的点插回到队列的末尾,以实现蛇身体增长。 可以通过获取当前系统时间来控制蛇每隔一定的时间前进一次。
yanxie7680 2016-12-27
  • 打赏
  • 举报
回复
C++没写过但是C写过几个。 1.随便写一个菜单栏。 2.判断函数,判断蛇位置和其他东西是否重复。 3.进入游戏后,用随机数生成XY ,调用判断函数是否与蛇重复。 4.运动函数,随机或者定死初始方向。记录下来。然后sleep一下在输出。每一次sleep调用判断函数来实现得分或者死亡。 5,打印可以用清屏但是有点闪或者用光标移动还实现。
qq_34346817 2016-12-27
  • 打赏
  • 举报
回复
用codeblocks编写

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧