字符游戏-智能蛇
来源:互联网 发布:屏幕闪光灯软件 编辑:程序博客网 时间:2024/05/21 13:57
一 我的Linux环境:Ubuntu
二 sin-demo.c
三 实现 kbhit()
我们先跑一遍输入函数
在Windows下实现基本功能:
代码:
#include<stdio.h>#include<stdlib.h>#include<time.h>#include<conio.h>#include<windows.h>//linux使用unistd.h#define SNAKE_MAX_LENGTH 20#define SNAKE_HEAD 'H'#define SNAKE_BODY 'X'#define BLANK_CELL ' '#define SNAKE_FOOD '$'#define WALL_CELL '*'//void snakeMove(int,int);//void put_money(void);int snakeX[SNAKE_MAX_LENGTH]={5,4,3,2,1};//蛇头是第一个,方便加身体长度int snakeY[SNAKE_MAX_LENGTH]={1,1,1,1,1};int snakeLength=5;char map[12][13]=//卧槽,字符结尾还有\0{ "************", "*XXXXH $ *", "* *", "* *", "* *", "* *", "* $ *", "* *", "* *", "* *", "* *", "************"};void output(){ int i; for(i=0;i<12;i++) { printf("%s\n",map[i]); }}void gameover(){ printf("Game Over!!!");}char movable[4]={'W','A','S','D'};//可以走的方向int distance[4]={0,0,0,0};//可走方向距离食物的距离char whereGoNext(){ int i,j; int Hx,Hy; for(i=1;i<11;i++) { for(j=1;j<11;j++) { if(map[i][j]=='H') { Hx=i; Hy=j; break; } } } //判断A方向有没有食物,食物的距离 int judge=0; for(j=Hx-1;j>0;j--) { if(map[j][Hy]=='$') judge++; } if(map[Hx-1][Hy]=='X') judge=0;//判断是否是身体 if(judge>0) { for(j=Hx-1;map[j][Hy]!='$';j--) { if(map[j][Hy]==' ') distance[0]++; } }else{distance[0]=9999;} //判断W方向有没有食物,食物的距离 judge=0; for(j=Hy-1;j>0;j--) { if(map[Hx][j]=='$') judge++; } if(map[Hx][Hy-1]=='X') judge=0;//判断是否是身体 if(judge>0) { for(j=Hy-1;map[Hx][j]!='$';j--) { if(map[Hx][j]==' ') distance[1]++; } }else{distance[1]=9999;} //判断D方向有没有食物,食物的距离 judge=0; for(j=Hx+1;j<11;j++) { if(map[j][Hy]=='$') judge++; } if(map[Hx+1][Hy]=='X') judge=0;//判断是否是身体 if(judge>0) { for(j=Hx+1;map[j][Hy]!='$';j++) { if(map[j][Hy]==' ') distance[2]++; } }else{distance[2]=9999;} //判断S方向有没有食物,食物的距离 judge=0; for(j=Hy+1;j<11;j++) { if(map[Hx][j]=='$') judge++; } if(map[Hx][Hy+1]=='X') judge=0;//判断是否是身体 if(judge>0) { for(j=Hy+1;map[Hx][j]!='$';j++) { if(map[Hx][j]==' ') distance[3]++; } }else{distance[3]=9999;} //判断方向和输出 int min=9999; for(i=0;i<4;i++) { min=(min<distance[i])?min:distance[i]; } if(min==9999) return 'Q'; for(i=0;i<4;i++) { if(min==distance[i]) break; } return movable[i];}int main(){ int i; output(); while(1) { Sleep(1000);//linux下sleep() char ch; ch=whereGoNext(); //我们的游戏条件:必须是大写的asdw控制方向,否则退出! if(ch!='A'&&ch!='S'&&ch!='W'&&ch!='D') break; map[snakeY[snakeLength-1]][snakeX[snakeLength-1]]=' '; switch(ch) { case 'A': for(i=snakeLength-1;i>0;i--) { snakeX[i]=snakeX[i-1]; snakeY[i]=snakeY[i-1]; } snakeX[0]--; break; case 'D': for(i=snakeLength-1;i>0;i--) { snakeX[i]=snakeX[i-1]; snakeY[i]=snakeY[i-1]; } snakeX[0]++; break; case 'W': for(i=snakeLength-1;i>0;i--) { snakeX[i]=snakeX[i-1]; snakeY[i]=snakeY[i-1]; } snakeY[0]--; break; case 'S': for(i=snakeLength-1;i>0;i--) { snakeX[i]=snakeX[i-1]; snakeY[i]=snakeY[i-1]; } snakeY[0]++; break; } //判断有没有撞到障碍 if(snakeX[0]<1||snakeX[0]>10||snakeY[0]<1||snakeY[0]>10) break; //吃食物长一节 if(map[snakeY[0]][snakeX[0]]=='$') { snakeLength++; if(snakeX[snakeLength-2]==snakeX[snakeLength-3]) { snakeX[snakeLength-1]=snakeX[snakeLength-2]; snakeY[snakeLength-1]=2*snakeY[snakeLength-2]-snakeY[snakeLength-3]; }else { snakeY[snakeLength-1]=snakeY[snakeLength-2]; snakeX[snakeLength-1]=2*snakeX[snakeLength-2]-snakeX[snakeLength-3]; } } for(i=1;i<snakeLength;i++) { map[snakeY[i]][snakeX[i]]='X';//先行后列 } //判断有没有撞到身体 if(map[snakeY[0]][snakeX[0]]=='X') break; //判断食物,如果遇到食物就长一节身体 map[snakeY[0]][snakeX[0]]='H'; output(); } gameover(); return 0;}
额,上面是一个智障蛇,我会错题意了
改进:如果食物为0,退出
按照顺序寻找第一个食物,寻找最优路线
#include<stdio.h>#include<stdlib.h>#include<time.h>#include<conio.h>#include<math.h>#include<windows.h>//linux使用unistd.h#define SNAKE_MAX_LENGTH 20#define SNAKE_HEAD 'H'#define SNAKE_BODY 'X'#define BLANK_CELL ' '#define SNAKE_FOOD '$'#define WALL_CELL '*'//void snakeMove(int,int);//void put_money(void);int snakeX[SNAKE_MAX_LENGTH]={5,4,3,2,1};//蛇头是第一个,方便加身体长度int snakeY[SNAKE_MAX_LENGTH]={1,1,1,1,1};int snakeLength=5;char map[12][13]=//卧槽,字符结尾还有\0{ "************", "*XXXXH $ *", "* *", "* $ *", "* *", "* *", "* $ *", "* *", "* *", "* $ *", "* *", "************"};void output(){ int i; for(i=0;i<12;i++) { printf("%s\n",map[i]); }}void gameover(){ printf("Game Over!!!");}char movable[4]={'W','A','S','D'};//可以走的方向int distance[4]={0,0,0,0};//可走方向距离食物的距离char whereGoNext(int Hx,int Hy,int Fx,int Fy){ //判断A方向距离 if(map[Hx-1][Hy]=='X') distance[0]=9999;//判断是否是身体 else { distance[0]=abs(Fx-Hx+1)+abs(Fy-Hy); } //判断W方向有没有食物,食物的距离 if(map[Hx][Hy-1]=='X') { distance[1]=9999; }else { distance[1]=abs(Fx-Hx)+abs(Fy-Hy+1); } //判断D方向有没有食物,食物的距离 if(map[Hx+1][Hy]=='X') { distance[2]=9999; }else { distance[2]=abs(Fx-Hx-1)+abs(Fy-Hy); } //判断S方向有没有食物,食物的距离 if(map[Hx][Hy+1]=='X') { distance[3]=9999; }else { distance[3]=abs(Fx-Hx)+abs(Fy-Hy-1); } //判断方向和输出 int min=9999; int i; for(i=0;i<4;i++) { min=(min<distance[i])?min:distance[i]; } if(min==9999) return 'Q'; for(i=0;i<4;i++) { if(min==distance[i]) break; } return movable[i];}int main(){ output(); while(1) { int i,j; int Hx,Hy,Fx,Fy; for(i=1;i<11;i++) { for(j=1;j<11;j++) { if(map[i][j]=='H') { Hx=i; Hy=j; break; } } } //顺序查找,找到第一个食物 int flag=0; for(i=1;i<11;i++) { if(flag==1) break; for(j=1;j<11;j++) { if(flag==1) break; if(map[i][j]=='$') { Fx=i; Fy=j; flag=1; } } } Sleep(1000);//linux下sleep() char ch; ch=whereGoNext(Hx,Hy,Fx,Fy); //我们的游戏条件:必须是大写的asdw控制方向,否则退出! //如果没有食物就退出,否则陷入死循环 int flag1=0; for(i=1;i<11;i++) { for(j=1;j<11;j++) { if(map[i][j]=='$') { flag1++; } } } if(flag1==0) {ch='Q';} if(ch!='A'&&ch!='S'&&ch!='W'&&ch!='D') break; map[snakeY[snakeLength-1]][snakeX[snakeLength-1]]=' '; switch(ch) { case 'A': for(i=snakeLength-1;i>0;i--) { snakeX[i]=snakeX[i-1]; snakeY[i]=snakeY[i-1]; } snakeX[0]--; break; case 'D': for(i=snakeLength-1;i>0;i--) { snakeX[i]=snakeX[i-1]; snakeY[i]=snakeY[i-1]; } snakeX[0]++; break; case 'W': for(i=snakeLength-1;i>0;i--) { snakeX[i]=snakeX[i-1]; snakeY[i]=snakeY[i-1]; } snakeY[0]--; break; case 'S': for(i=snakeLength-1;i>0;i--) { snakeX[i]=snakeX[i-1]; snakeY[i]=snakeY[i-1]; } snakeY[0]++; break; } //判断有没有撞到障碍 if(snakeX[0]<1||snakeX[0]>10||snakeY[0]<1||snakeY[0]>10) break; //吃食物长一节 if(map[snakeY[0]][snakeX[0]]=='$') { snakeLength++; if(snakeX[snakeLength-2]==snakeX[snakeLength-3]) { snakeX[snakeLength-1]=snakeX[snakeLength-2]; snakeY[snakeLength-1]=2*snakeY[snakeLength-2]-snakeY[snakeLength-3]; }else { snakeY[snakeLength-1]=snakeY[snakeLength-2]; snakeX[snakeLength-1]=2*snakeX[snakeLength-2]-snakeX[snakeLength-3]; } } for(i=1;i<snakeLength;i++) { map[snakeY[i]][snakeX[i]]='X';//先行后列 } //判断有没有撞到身体 if(map[snakeY[0]][snakeX[0]]=='X') break; //判断食物,如果遇到食物就长一节身体 map[snakeY[0]][snakeX[0]]='H'; output(); } gameover(); return 0;}
效果图:
阅读全文
0 0
- 字符游戏-智能蛇
- 字符游戏-智能蛇
- 字符游戏-智能蛇
- 字符游戏-智能蛇
- 字符游戏-智能蛇(上)
- 字符游戏-智能蛇(下)
- 字符游戏——智能蛇
- 字符游戏-智能蛇(学习体会)
- 字符游戏-智能蛇(代码版)
- 字符游戏——智能蛇
- 字符游戏--贪吃蛇!
- 字符游戏贪吃蛇
- 智能蛇游戏的学习体验
- 字符版本贪吃蛇游戏
- 字符游戏—贪吃蛇
- 游戏领域智能推荐
- 字符游戏——贪吃蛇
- 字符版本贪吃蛇游戏设计
- 空间配置器
- Android Studio 下载与安装教程(最简单版)
- go语言的命令行库
- [Unity]用shader实现画面呈圆形缩放的效果。
- go异常处理
- 字符游戏-智能蛇
- 判断点与多边形的关系(3):角度和法
- 在eclipse上安装python插件,PyDev的过程-python简易教程(二)
- redis 3.2.6 on ubuntu 14.04
- 工作第一周。多条件以及时间语句的查询
- JDK、JRE、JVM三者间的关系
- Jenkins 安装 结合 Tomcat
- docker
- 如何给数字文件盖上时间戳——How to Time-Stamp a Digital Document