谁能讲讲贪吃蛇游戏如果蛇头碰到食物增加长度和蛇碰到自己身体时如果用代码体现出来啊?谁能讲讲思路?这段代码有一块我没看懂,就是撞到食物是如何增加长度的底下代码红色区域的有些地方没看懂的地方谁能给我讲解下 谢谢了
class MyPaint extends JPanel implements Runnable, KeyListener, FocusListener {
She s;
Font f = new Font("宋体", Font.PLAIN, 12);
int x = 150;//蛇开始坐标X
int y = 0;//蛇开始坐标Y
Random r = new Random();
int sjx = r.nextInt(300)/10*10;//食物随机X坐标
int sjy = r.nextInt(300)/10*10;//食物随机Y坐标
int fx = 2;//方向键1上2下3左4右
int sw = 0;//食物数量
int sd = 300;//停滞时间
int cs = 0;//转向次数         //为什么用转向次数????
int d = 150;//最快多少;
String[] zx = new String[1000];//每次转向的坐标
boolean zanting = false;//暂停/开始
boolean zanting1 = false;//焦点暂停/开始
boolean siwang = false;//撞到身体或墙了
boolean shenti = false;//撞到身体
public MyPaint() {
Thread t = new Thread(this);//创建线程类对象
t.start();//启动线程
this.addKeyListener(this);//添加键盘监听
this.setFocusable(true);//获得焦点
this.addFocusListener(this);//添加焦点监听
}
public void setShe(She ss) {
s = ss;
}
//暂停/开始
public void setZanTing() {
if (zanting) {
zanting = false;
}
else {
zanting = true;
}
}
public void setKaiShi() {
JLabel ks = new JLabel("是否重新开始?");
ks.setFont(f);
int a = JOptionPane.showConfirmDialog(s, ks);
if (a == 0) {
x = 150;//蛇开始坐标X
y = 0;//蛇开始坐标Y
sjx = r.nextInt(300)/10*10;//食物随机X坐标
sjy = r.nextInt(300)/10*10;//食物随机Y坐标
fx = 2;//方向键1上2下3左4右
sw = 0;//食物数量
sd = 300;//停滞时间
cs = 0;//转向次数
zanting = false;//暂停/开始
siwang = false;//撞到身体或墙了
shenti = false;//撞到身体
s.setChu();
s.setDS(sw, 305 - sd);
}
}
public void setTuiChu() {
JLabel tc = new JLabel("确定退出吗?");
tc.setFont(f);
int a = JOptionPane.showConfirmDialog(s, tc);
if (a == 0) {
s.dispose();
System.exit(0);
}
}
public void setSD(int a, int b) {
sd = a;
d = b;
}
public void paint(Graphics g) {
//记录每次转向的坐标
zx[cs] = x + "/" + y;
super.paint(g);
g.setColor(Color.BLACK);
g.drawRect(0, 0, 300, 300);
//画食物
g.setColor(Color.BLACK);
g.fillRect(sjx, sjy, 10, 10);
//画蛇头
g.setColor(Color.BLUE);
g.fillRect(x, y, 10, 10);
//画蛇身体
g.setColor(Color.RED);
/**********下面这块红色代码区域是如何吃食物增长长度和碰撞身体的啊??*************/
for (int i = 1; i <= sw; i++) {            [color=#FF0000] //这个循环是做什么的?        
int j = cs - i;
if (j < 0) {
j = cs-i+999+1;
}
String[] s = zx[j].split("/");   //这块是什么意思?
if (x == Integer.parseInt(s[0]) && y == Integer.parseInt(s[1])) {//蛇撞到自己身上了
siwang = true;
shenti = true;
}
if (sjx == Integer.parseInt(s[0]) && sjy == Integer.parseInt(s[1])) {//食物在蛇身体上
g.setColor(Color.BLACK);
g.fillRect(sjx, sjy, 10, 10);
g.setColor(Color.RED);
continue;
}
g.fillRect(Integer.parseInt(s[0]), Integer.parseInt(s[1]), 10, 10);
}
}
public void run() {
while (true) {
cs++;//移动一次加一次
//如果数组下标等于1000,就从头再来
if (cs == 1000) {
cs = 0;
}
switch (fx) {
case 1:
y-=10;//上
break;
case 2:
y+=10;//下
break;
case 3:
x-=10;//左
break;
case 4:
x+=10;//右
break;
}
this.repaint();
//蛇头碰到食物,再随机出个食物
if (x == sjx && y == sjy) {
sjx = r.nextInt(300)/10*10;//食物随机X坐标
sjy = r.nextInt(300)/10*10;//食物随机Y坐标
sw++;//食物数量加1
if (sw == 1) {
s.setNanDu();
}
//速度设置
if (sd <= d) {
sd = d;
}
else {
sd-=5;
}
s.setDS(sw, 305 - sd);
}[/color]
//撞到墙了 或 撞到身体了
if (x < 0 || x > 290 || y < 0 || y > 290 || shenti) {
JOptionPane.showMessageDialog(s, "游戏结束!");
siwang = true;
shenti = false;
}
//暂停
while (zanting || zanting1) {
try {
Thread.sleep(100);//时间停滞(毫秒)
}
catch (Exception e) {
}
}
while (siwang) {
try {
Thread.sleep(100);
}
catch (Exception e) {

}
}
try {
Thread.sleep(sd);//时间停滞(毫秒)
}
catch (Exception e) {
}
}
}
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case 38:
fx = 1;//上
break;
case 40:
fx = 2;//下
break;
case 37:
fx = 3;//左
break;
case 39:
fx = 4;//右
break;
case KeyEvent.VK_F3:
this.setZanTing();
break;
case KeyEvent.VK_F2:
this.setKaiShi();
break;
case KeyEvent.VK_F4:
this.setTuiChu();
break;
}
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
} public void focusGained(FocusEvent e) {
zanting1 = false;
}
public void focusLost(FocusEvent e) {
zanting1 = true;
}
}