Java开发小游戏纸
导入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
}
}
/*蛇代码*/