Java程序设计-AI贪吃蛇
设计原因
上学期学了Java后,懵懵懂懂,这次设计主要是为了巩固Java知识,并进⼀步加深到Java的认识,本来⼀开始想写个五⼦棋,但贪吃蛇相对于五⼦棋来说,更容易实现⼀些,因此先完成贪吃蛇,再完成五⼦棋的设计.
设计功能
1.有好看的UI设计(墙,⽹格线,蛇,⾷物).
2.能播放⾳乐切歌功能.
3.增加玩家模式,AI模式选项功能.
4.能调游戏难度,或者随时间增加难度逐渐增⼤.
5.界⾯有长度,时间,歌曲,刷新频率,游戏说明显⽰
设计思路
⾸先从基础⼊⼿,先做⼀个界⾯出来,JFrame,JPanel,JLabel简单嵌套,使⽤简单⽆布局模式,⽤setBounds()确定标签位置即可,然后是整体坐标的确定,这⾥我设置的是7<=x<=491,12<=y<=474,由于画图每⼀点占⽤20px,空隙2px,因此点与点之间间隔22px,⽤类SnakeNode表⽰蛇节点,⾷物位置⽤随机数刷新,只要不与蛇⾝重叠就⾏,⽤线程Thread间隔300ms执⾏蛇⾝运动和组件的repaint,⽤线程Time间隔1000ms来计算游戏时间,⽤线程来播放⾳乐。蛇运动与撞墙判定条件简单,重点是如何设计⼀个AI版的贪吃蛇,因此我参考了⽹上的⼀些⽅法.
if(能吃到⾷物)
派虚拟蛇去吃,
if(吃完能跟着蛇尾⾛) 真蛇去吃
if(吃完不能跟着蛇尾) 真蛇跟着蛇尾⾛
else
真蛇跟着蛇尾
if(不能吃⾷物也不能跟着蛇尾)随便逛逛,
设计说明
⼀些具体的参数未列出来,但⼤体差不多.部分采⽤伪代码形式
/* 变量说明*/
int SnakeLength;//蛇长.
int Hour,Minute,Second;//当前游戏时间.
final int MaxSnakeLength =100;//蛇最⼤长度
String []SongName;//歌曲名字
JLabel []label;//UI显⽰组件
Thread run ;//游戏运⾏线程类.
SnakeNode head;//蛇头
SnakeNode []body;//蛇⾝
/
*SnakeNode类说明*/
public class SnakeNode {
public int x,y;//蛇节点坐标.
public SnakeNode(int x1,int y1){
this.x = x1;
this.y = y1;
}
public SnakeNode(){
x =0;
y =0;
}
}
//initialData()函数名
/* 函数功能,初始化各参数*/
SnakeLength =3;//蛇长初始化.
Current_direction ="R";//蛇⾏⾛⽅向.
Hour =0, Minute =0, Second =0;//游戏时间初始化. pause =false;//游戏默认不暂停.
head =new SnakeNode(227,100);//蛇头初始化.
body[]=new SnakeNode(0,0);//各蛇⾝节点初始化.
/* 函数功能,产⽣⾷物随机坐标*/
随机⽣成⾷物坐标X,Y
while(1){
if(⾷物坐标与蛇⾝坐标或蛇头坐标冲突){
重新随机⽣成⾷物坐标X,Y
}else{
退出循环
}
}
/* 函数功能,吃⾷物*/
if(蛇头坐标与⾷物坐标重合){
能吃,返回true;
}else{
不能吃,返回false;
}
/* 函数功能,撞墙*/
if(蛇头坐标符合撞墙条件){
if(⽤户选择重新开始){
贪吃蛇的编程代码调⽤初始化initialData();函数
重新开始
}else{
结束游戏
}
}else{
什么事也不做
}
/* 函数功能,撞⾃⼰*/
if(蛇头坐标与⾝体坐标重合){
//游戏结束,死亡
if(⽤户选择重新开始){
调⽤初始化initialData();函数
重新开始
}else{
结束游戏
}
}else{
什么事也不做
}
/*函数功能,⽤户按键*/
if(⽤户按下UP键){
if(当前⽅向不是向下){
当前⽅向向上
}
}
if(⽤户按下DOWN键){
if(当前⽅向不是向上){
当前⽅向向下
}
}
if(⽤户按下LEFT键){
if(当前⽅向不是向右){
当前⽅向向左
}
}
if(⽤户按下RIGHT键){
if(当前⽅向不是向右){
当前⽅向向右
}
}
if(⽤户按下ENTER键){
切换当前歌曲
}
if(⽤户按下ESC键){
游戏重新开始.
}
/* 蛇⾝移动*/
⽤户按下⽅向键后,蛇头向前移动,紧跟蛇头的下⼀节点的坐标就是蛇头坐标,以此类推,能实现
蛇⾝移动.
if(蛇能吃到⾷物){
蛇变长,原来⾷物位置变为蛇头位置,然后按蛇⾝移动处理,只是需要把之前蛇尾坐标加上,因为长度加⼀}
/* 画图函数,swing组件⽅法*/
Graphics g1;
Graphics2D g =(Graphics2D)g1;
g.setColor();//设置颜⾊
g.fillRoundReat();//设置圆⾓矩形
g.setPaint(new GradientPaint());//设置渐变颜⾊
g.fillOval();//设置填充矩形.
g.setStroke();//定义画笔属性,粗细等.
g.setBackground();//设置背景颜⾊
g.drawRect();//画矩形
g.drawLine();//画⼀条直线.
⼀些线程类由于太过基础,这⾥未列出来.
运⾏截图.
后期改进
1.能增加选项功能,主要⽤来切换背景.
2.增加障碍墙功能
3.增加游戏通关(下⼀关)模式
4.增加虚拟路径指导功能(动态规划路线)
5.增加更多的AI模式(⽆脑,普通AI,⾼级AI功能)
6.修改游戏难度
7.能引⼊对抗模式
实验总结
在完成了该贪吃蛇项⽬后,进⼀步加深对java的理解,虽然我对⾯向对象不是太过于熟练,下次争取改进,然后学会了基础的Thread,swing,⾳乐播放等等功能,虽然功能有些⽋缺,但下⼀次争取做得更好.下⼀次博客更新是完成⼀个AI版的井字棋,然后进⼀步是AI版的五⼦棋,下下次是oj的搭建,暂时
先这样吧。
由于我的⽔平有限,也只是在各位⼤佬的基础上完成的.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论