今天写了一个贪吃蛇的小游戏用来练手,在流程控制方面也没有封装方法进行简化,不过作为锻炼流程控制是很好的。
下面附上自己的源码
-
package com.oracle;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;public class Game_贪吃蛇2 {
int tx = 10;
int ty = 10;
int tf = 0;// 蛇头方向
int sts = 0;// 蛇身体数量
int qx = (((int) (Math.random() * 19)) * 30) + 10;
int qy = (((int) (Math.random() * 19)) * 30) + 10;
List<Integer> lx = new ArrayList<>();
List<Integer> ly = new ArrayList<>();
boolean death = false;
窗口 ck = null;
定时器 ds1 = null;Game_贪吃蛇2() {
ck = new 窗口();
ck.setSize(5 * 2 + 830, 645 + 2 * 5 + 25);
ck.setVisible(true);
ds1 = new 定时器(200);
}class 窗口 extends JFrame {
菜单 cd = null;
面板 mb = null;
键盘监听器 jp = null;窗口() {
jp = new 键盘监听器();
this.addKeyListener(jp);
cd = new 菜单();
this.setJMenuBar(cd);
mb = new 面板();
this.add(mb);
this.repaint();
}class 菜单 extends JMenuBar {
JMenu dan; // 菜单
JMenuItem xiang1; // 菜单项菜单() {
dan = new JMenu("游戏"); // 菜单
xiang1 = new JMenuItem("开局"); // 菜单项
this.add(dan);
dan.add(xiang1);
}
}class 键盘监听器 implements KeyListener {
// TODO:键盘处理,可加入KeyEvent.VK_XXX
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT:// 左
if (tf != 0)
tf = 2;
break;
case KeyEvent.VK_RIGHT:// 右
if (tf != 2)
tf = 0;
break;
case KeyEvent.VK_UP:// 上
if (tf != 3)
tf = 1;
break;
case KeyEvent.VK_DOWN:// 下
if (tf != 1)
tf = 3;
break;
}
repaint();
}public void keyReleased(KeyEvent e) {
}public void keyTyped(KeyEvent e) {
}
}class 面板 extends JPanel {
面板() {
}public void paint(Graphics g) {
Image tu = (new ImageIcon("贪吃蛇/背景.PNG")).getImage();
g.drawImage(tu, 0, 0, null);
Image q1 = (new ImageIcon("贪吃蛇/豆.png")).getImage();
g.drawImage(q1, qx, qy, null);
Image ss = (new ImageIcon("贪吃蛇/身.png")).getImage();
for (int i = 0; i < lx.size(); i++) {
g.drawImage(ss, (lx.get(i)).intValue(), (ly.get(i)).intValue(), null);
}
Image st = (new ImageIcon("贪吃蛇/头" + tf + ".png")).getImage();
g.drawImage(st, tx, ty, null);
Image gameover = (new ImageIcon("贪吃蛇/gameover.png")).getImage();
if (death == true) {
g.drawImage(gameover, 150, 200, null);
}
}
}
}class 定时器 implements Runnable// 实现Runnable接口
{
Thread xc = null;
long jianGe;定时器(long jianGe) {
this.jianGe = jianGe;
xc = new Thread(this);
xc.start();
}public void run() {
while (true) {
try {
xc.sleep(jianGe);
if (this == ds1) {
if (death == false) {
if (tf == 0) {
tx += 30;
if (tx == qx && ty == qy) {
sts++;
lx.add(0, tx - 30);
ly.add(0, ty);
l:while(true){
boolean flag=false;
qx = (((int) (Math.random() * 19)) * 30) + 10;
qy = (((int) (Math.random() * 19)) * 30) + 10;
for(int k=0;k<lx.size();k++){
if(lx.get(k)==qx&&ly.get(k)==qy){
flag=true;
}
}
if(tx==qx&&ty==qy){
flag=true;
}
if(flag==false){
break l;
}
}
} else if (lx.size() > 0) {
for (int i = lx.size() - 1; i > 0; i--) {
lx.set(i, lx.get(i - 1));
}
lx.set(0, tx - 30);
for (int i = ly.size() - 1; i > 0; i--) {
ly.set(i, ly.get(i - 1));
}
ly.set(0, ty);
}
if (tx > 580) {
death = true;
}
for (int i = 0; i < lx.size(); i++) {
if (tx == lx.get(i) && ty == ly.get(i)) {
death = true;
break;
}
}
} else if (tf == 2) {
tx -= 30;
if (tx == qx && ty == qy) {
sts++;
lx.add(0, tx + 30);
ly.add(0, ty);
l:while(true){
boolean flag=false;
qx = (((int) (Math.random() * 19)) * 30) + 10;
qy = (((int) (Math.random() * 19)) * 30) + 10;
for(int k=0;k<lx.size();k++){
if(lx.get(k)==qx&&ly.get(k)==qy){
flag=true;
}
}
if(tx==qx&&ty==qy){
flag=true;
}
if(flag==false){
break l;
}
}
} else if (lx.size() > 0) {
for (int i = lx.size() - 1; i > 0; i--) {
lx.set(i, lx.get(i - 1));
}
lx.set(0, tx + 30);
for (int i = ly.size() - 1; i > 0; i--) {
ly.set(i, ly.get(i - 1));
}
ly.set(0, ty);
}
if (tx < 10) {
death = true;
}
for (int i = 0; i < lx.size(); i++) {
if (tx == lx.get(i) && ty == ly.get(i)) {
death = true;
break;
}
}
} else if (tf == 1) {
ty -= 30;
if (tx == qx && ty == qy) {
sts++;
lx.add(0, tx);
ly.add(0, ty + 30);
l:while(true){
boolean flag=false;
qx = (((int) (Math.random() * 19)) * 30) + 10;
qy = (((int) (Math.random() * 19)) * 30) + 10;
for(int k=0;k<lx.size();k++){
if(lx.get(k)==qx&&ly.get(k)==qy){
flag=true;
}
}
if(tx==qx&&ty==qy){
flag=true;
}
if(flag==false){
break l;
}
}
} else if (lx.size() > 0) {
for (int i = lx.size() - 1; i > 0; i--) {
lx.set(i, lx.get(i - 1));
}
lx.set(0, tx);
for (int i = ly.size() - 1; i > 0; i--) {
ly.set(i, ly.get(i - 1));
}
ly.set(0, ty + 30);
}
if (ty < 10) {
death = true;
}
for (int i = 0; i < lx.size(); i++) {
if (tx == lx.get(i) && ty == ly.get(i)) {
death = true;
break;
}
}
} else if (tf == 3) {
ty += 30;
if (tx == qx && ty == qy) {
sts++;
lx.add(0, tx);
ly.add(0, ty - 30);
l:while(true){
boolean flag=false;
qx = (((int) (Math.random() * 19)) * 30) + 10;
qy = (((int) (Math.random() * 19)) * 30) + 10;
for(int k=0;k<lx.size();k++){
if(lx.get(k)==qx&&ly.get(k)==qy){
flag=true;
}
}
if(tx==qx&&ty==qy){
flag=true;
}
if(flag==false){
break l;
}
}
} else if (lx.size() > 0) {
for (int i = lx.size() - 1; i > 0; i--) {
lx.set(i, lx.get(i - 1));
}
lx.set(0, tx);
for (int i = ly.size() - 1; i > 0; i--) {
ly.set(i, ly.get(i - 1));
}
ly.set(0, ty - 30);
}
if (ty > 580) {
death = true;
}
for (int i = 0; i < lx.size(); i++) {
if (tx == lx.get(i) && ty == ly.get(i)) {
death = true;
break;
}
}
}
}
ck.repaint();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}public static void main(String[] args) {
new Game_贪吃蛇2();
}
}