如何添加游戏级别的蛇代码java
主要使用javax.swing.Timer类:
进口?Java . awt . *;
进口?javax . swing . *;
@SuppressWarnings("serial ")
公共?班级?主类?延伸?JFrame?{
ControlSnake?控制;
工具包?套件;
维度?迪门;
公共?静电?作废?main(String[]?args)?{
新的?MainClass("我的?蛇”);
}
公共?MainClass(字符串?s)?{
超级用户;
控制?=?新的?control snake();
control . setfocusable(true);
基特。=?toolkit . getdefaulttoolkit();
迪门?=?kit . getscreensize();
添加(控制);
setLayout(新?BorderLayout());
setLocation(dimen.width?/?3,?迪门。身高?/?3);//?dimen.width/3,dimen.height/3
setSize(FWIDTH,FH height);
setDefaultCloseOperation(JFrame。EXIT _ ON _ CLOSE);
setResizable(false);
set visible(true);
}
公共?静电?决赛?int?FWIDTH?=?315;
公共?静电?决赛?int?FHEIGHT?=?380;
}
进口?Java . util . *;
进口?Java . awt . *;
进口?Java . awt . event . *;
进口?javax . swing . *;
进口?javax . swing . timer;
进口?Java . util . random;
@SuppressWarnings("serial ")
公共?班级?ControlSnake?延伸?JPanel?器物?ActionListener?{
随机?兰德;
ArrayList & lt点& gt?列表,?listBody
字符串?str,?str 1;
静电?布尔?关键;
int?x,?y,?dx,?dy?fx,?fy,?旗帜;
int?蛇身;
int?速度;
公共?ControlSnake()?{
蛇身?=?1;
str?=?“下一个控制键?p键暂停……”;
str1?=?目前长度为:?+?蛇身;
钥匙?=?真实;
旗帜?=?1;
速度?=?700;
兰德?=?新的?random();
列表?=?新的?ArrayList & lt点& gt();
listBody?=?新的?ArrayList & lt点& gt();
x?=?5;
y?=?5;
list.add(新?点(x,?y));
list body . add(list . get(0));
dx?=?10;
dy?=?0;
fx?=?rand.nextInt(30)?*?10?+?5;//?2
fy?=?rand.nextInt(30)?*?10?+?5;//?2
setBackground(颜色。白色);
setSize(新?维度(318,?380));
决赛?定时器?时间?=?新的?定时器(速度,?这个);
time . start();
addKeyListener(新?KeyAdapter()?{
公共?作废?按键(按键事件?e)?{
如果?(e.getKeyCode()?==?37)?{
dx?=?-10;
dy?=?0;
}?不然呢?如果?(e.getKeyCode()?==?38)?{
dx?=?0;
dy?=?-10;
}?不然呢?如果?(e.getKeyCode()?==?39)?{
dx?=?10;
dy?=?0;
}?不然呢?如果?(e.getKeyCode()?==?40)?{
dx?=?0;
dy?=?10;
}?不然呢?如果?(e.getKeyCode()?==?80)?{
如果?(旗帜?%?2?==?1)?{
time . stop();
}
如果?(旗帜?%?2?==?0)?{
time . start();
}
flag++;
}
}
});
}
公共?作废?油漆(图形?g)?{
g.setColor(颜色。白色);
g.fillRect(0,?0,?400,?400);
g.setColor(颜色。深灰);
g.drawLine(3,3,?305,?3);
g.drawLine(3,3,?3,?305);
g.drawLine(305,3,?305,?305);
g.drawLine(3,305,?305,?305);
g.setColor(颜色。粉色);
为了什么?(int?我?=?0;?我?& lt?list body . size();?i++)?{
g.fillRect(listBody.get(i))。x,?listBody.get(i)。y,?9,?9);
}
g.fillRect(x,y,?9,?9);
g.setColor(颜色。橙色);
g.fillRect(fx,?fy,?9,?9);
g.setColor(颜色。深灰);
str1?=?目前长度为:?+?蛇身;
g .拉绳(str,10,?320);
g .拉带(str1,?10,?335);
}
公共?作废?actionPerformed(ActionEvent?e)?{
x?+=?dx;
y?+=?dy;
如果?(makeOut()?==?假)?{
joptionpane . showmessagedialog(null,“重新开始……”);
速度?=?700;
蛇身?=?1;
x?=?5;
y?=?5;
list . clear();
list.add(新?点(x,?y));
list body . clear();
list body . add(list . get(0));
dx?=?10;
dy?=?0;
}
addPoint(x,y);
如果?(x?==?fx?& amp& amp?y?==?fy)?{
速度?=?(int)?(速度?*?0.8);//速度增加参数
如果?(速度?& lt?200)?{
速度?=?100;
}
fx?=?rand.nextInt(30)?*?10?+?5;//?2
fy?=?rand.nextInt(30)?*?10?+?5;//?2
snake body++;//?2
}?//?2
repaint();
}
公共?作废?addPoint(int?xx,?int?yy)?{
//?动态记录最近50步内移动的坐标。
//?画出最新的蛇身
如果?(list.size()?& lt?100)?{//蛇身最长100。
list.add(新?点(xx,?YY));
}?不然呢?{
list . remove(0);
list.add(新?点(xx,?YY));
}
如果?(蛇身?==?1)?{
list body . remove(0);
listBody.add(0,list.get(list.size()?-?1));
}?不然呢?{
list body . clear();
如果?(list.size()?& lt?蛇身)?{
为了什么?(int?我?=?list.size()?-?1;?我?& gt?0;?我-)?{
list body . add(list . get(I));
}
}?不然呢?{
为了什么?(int?我?=?list.size()?-?1;?listBody.size()?& lt?蛇身;?我-)?{
list body . add(list . get(I));
}
}
}
}
公共?布尔?makeOut()?{
如果?((x?& lt?3?||?y?& lt?3)?||?(x?& gt?305?||?y?& gt?305))?{
回归?假的;
}
为了什么?(int?我?=?0;?我?& lt?listBody.size()?-?1;?i++)?{
为了什么?(int?j?=?我?+?1;?j?& lt?list body . size();?j++)?{
如果?(listBody.get(i)。equals(listBody.get(j)))?{
回归?假的;
}
}
}
回归?真实;
}
}