導入Java . awt . dimension;
導入Java . awt . toolkit;
導入javax . swing . jframe;
@SuppressWarnings("serial ")
公共類MainClass擴展JFrame {
ControlSnake控件;
工具包;
維度dimen
公共靜態void main(String[] args) {
新主類(“我的蛇”);
}
公共主類(字符串){
超級用戶;
control = new control snake();
control . setfocusable(true);
kit = toolkit . getdefaulttoolkit();
dimen = kit . getscreensize();
添加(控制);
set layout(new BorderLayout());
setLocation(dimen.width / 3,dimen . height/3);//dimen.width/3,dimen.height/3
setSize(FWIDTH,FH height);
setDefaultCloseOperation(JFrame。EXIT _ ON _ CLOSE);
setResizable(false);
set visible(true);
}
public static final int FWIDTH = 315;
公共靜態最終int FHEIGHT = 380
}
導入Java . awt . color;
導入Java . awt . dimension;
導入Java . awt . graphics;
導入Java . awt . point;
導入Java . awt . event . action event;
導入Java . awt . event . action listener;
導入Java . awt . event . key adapter;
導入Java . awt . event . key event;
導入Java . util . ArrayList;
導入Java . util . random;
導入javax . swing . joptionpane;
導入javax . swing . jpanel;
導入javax . swing . timer;
@SuppressWarnings("serial ")
公共類控件Snake擴展JPanel實現ActionListener {
隨機rand
ArrayList & lt點& gtlist,listBody
字符串str,str 1;
靜態布爾鍵;
int x,y,dx,dy,fx,fy,flag
內部蛇身;
int速度;
公共控件Snake() {
蛇身= 1;
Str = "上下左右方向鍵控制P鍵暫停...";
Str1 = "當前長度為:"+snake body;
key = true
flag = 1;
速度= 700;
rand = new Random();
list = new ArrayList & lt點& gt();
listBody = new 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();
addkey listener(new key adapter(){
公共void按鍵(按鍵事件e) {
if (e.getKeyCode() == 37) {
dx =-10;
dy = 0;
} else if (e.getKeyCode() == 38) {
dx = 0;
dy =-10;
} else if (e.getKeyCode() == 39) {
dx = 10;
dy = 0;
} else if (e.getKeyCode() == 40) {
dx = 0;
dy = 10;
} else if (e.getKeyCode() == 80) {
if (flag % 2 == 1) {
time . stop();
}
if(標誌% 2 == 0) {
time . start();
}
flag++;
}
}
});
}
公共空白油漆(圖形g) {
g.setColor(顏色。白色);
g.fillRect(0,0,400,400);
g.setColor(顏色。深灰);
g .畫線(3,3,305,3);
g .拉線(3,3,3,305);
g .拉線(305,3,305,305);
g .拉線(3,305,305,305);
g.setColor(顏色。粉色);
for(int I = 0;我& ltlist 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 = "當前長度為:"+snake body;
g .抽繩(str,10,320);
g .拉帶(str1,10,335);
}
public void action performed(action event e){
x+= dx;
y+= dy;
if (makeOut() == false) {
Joptionpane。顯示消息對話框(空,“重新開始...”);
速度= 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);
if(x = = FX & amp;& ampy == fy) {
速度= (int)(速度* 0.8);//速度增加參數
如果(速度& lt200) {
速度= 100;
}
FX = rand . nextint(30)* 10+5;// 2
fy = rand . nextint(30)* 10+5;// 2
snake body++;// 2
} // 2
repaint();
}
公共void添加點(int xx,int yy) {
//動態記錄最近50步內移動的坐標。
//並畫出最新的蛇身。
if(list . size()& lt;100) {//蛇身最長長度為100。
list.add(新點(xx,YY));
}否則{
list . remove(0);
list.add(新點(xx,YY));
}
if (snakeBody == 1) {
list body . remove(0);
listBody.add(0,list . get(list . size()-1));
}否則{
list body . clear();
if(list . size()& lt;蛇身){
for(int I = list . size()-1;我& gt0;我- ) {
list body . add(list . get(I));
}
}否則{
for(int I = list . size()-1;list body . size()& lt;蛇身;我- ) {
list body . add(list . get(I));
}
}
}
}
公共布爾makeOut() {
如果((x & lt3 | | y & lt3)| |(x & gt;305 | | y & gt305)) {
返回false
}
for(int I = 0;我& ltlist body . size()-1;i++) {
for(int j = I+1;j & ltlist body . size();j++) {
if (listBody.get(i)。equals(listBody.get(j))) {
返回false
}
}
}
返回true
}
}
/*蛇代碼*/