貪喫蛇小遊戲~

先來看一下效果~這個是能穿牆的,界面神馬的就不美化惹~



直接上代碼:

package com.snake;

import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.util.Date;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class SnakeWindow extends JFrame {
	//獲取屏幕分辨率
	int width = Toolkit.getDefaultToolkit().getScreenSize().width;
	int height = Toolkit.getDefaultToolkit().getScreenSize().height;
	//數組,用來保存蛇,其中1表示此處有蛇身,0表示沒有
	static int[][] snake = new int[31][31];
	//是否開始
	boolean isStarted = false;
	//標記蛇此時移動的方向  (1:左 2:右 3:上 4:下)
	int direction = 1;
	//標記蛇頭位置
	int headX, headY;
	//標記蛇尾位置
	int tailX, tailY;
	//臨時位置
	int[] tempX = new int[200];
	int[] tempY = new int[200];
	int size = 0;
	//食物位置
	static int foodX = 0;
	static int foodY = 0;
	//食物是否被喫
	boolean isEated = true;
	//分數
	String score = "0";
	//等級
	String level = "1";
	//蛇的移動速度
	int speed = 100;
	
	JButton start = new JButton("開始遊戲");
	JButton end = new JButton("結束遊戲");
	JButton about = new JButton("關於");

	public SnakeWindow() {
		
		this.setTitle("貪喫蛇");
		this.setSize(450, 400);
		this.setLocation((width - 450)/2, (height - 400)/2);
		this.setResizable(false);
		this.setVisible(true);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setLayout(null);
		Container c = this.getContentPane();
		MyPanel jp = new MyPanel();
		jp.setLayout(null);
		jp.setSize(450, 400);
		//JLabel sore = new JLabel();
		
		start.setFont(new Font("宋體", 15, 15));
		start.setMargin(new Insets(0, 0, 0, 0));
		start.setBounds(345, 30, 80, 30);
		end.setFont(new Font("宋體", 15, 15));
		end.setMargin(new Insets(0, 0, 0, 0));
		end.setBounds(345, 300, 80, 30);
		about.setFont(new Font("宋體", 15, 15));
		about.setMargin(new Insets(0, 0, 0, 0));
		about.setBounds(345, 250, 80, 30);
		jp.add(start);
		jp.add(end);
		jp.add(about);
		c.add(jp);
		new Thread(new ThreadUpadte()).start();  
//		SnakeWindow.run();
//		this.repaint();
//		start.requestFocus();
//		end.requestFocus();
//		this.requestFocus();
		start.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				SnakeWindow.this.requestFocus();
				InitSnake();
				isStarted = true;
				start.setEnabled(false);
				repaint();
			}
		});
		
		about.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				if(isStarted != false) {
					isStarted = false;
					repaint();
					JOptionPane.showMessageDialog(null, "本遊戲由耗子哥哥製作,歡迎來耗子哥哥寢室交流與學習。");
					SnakeWindow.this.requestFocus();
					isStarted = true;
				}
				else {
					JOptionPane.showMessageDialog(null, "本遊戲由耗子哥哥製作,歡迎來耗子哥哥寢室交流與學習。");
				}
				
			}
		});
		
		end.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				System.exit(EXIT_ON_CLOSE);
			}
		});
		
		this.addKeyListener(new KeyListener(){

			public void keyPressed(KeyEvent e) {
				// TODO Auto-generated method stub
				int key = e.getKeyCode();
				if(key == e.VK_UP ){
					if(direction != 4 && direction != 3) {
						try {
							direction = 3;
							Thread.sleep(speed);
						} catch (InterruptedException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
					}
						
					
				}
				else if(key == e.VK_DOWN ){
					if(direction != 3 && direction != 4) {
						try {
							direction = 4;
							Thread.sleep(speed);
						} catch (InterruptedException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
					}
						
					
				}
				else if(key == e.VK_LEFT ) {
					if(direction != 2 && direction != 1) {
						try {
							direction = 1;
							Thread.sleep(speed);
						} catch (InterruptedException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
					}
				}
				else if(key == e.VK_RIGHT ) {
					if(direction != 1 && direction != 2) {
						try {
							direction = 2;
							Thread.sleep(speed);
						} catch (InterruptedException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
					}
						
					
				}
			}
			public void keyTyped(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}

			public void keyReleased(KeyEvent e) {
				// TODO Auto-generated method stub
				
			}
		});
	}
	public class MyPanel extends JPanel {
		
		public void paintComponent(Graphics scr) {
			
			BufferedImage bi = new BufferedImage(450, 400, BufferedImage.TYPE_INT_ARGB);
			Graphics g = bi.createGraphics();
			
			g.setColor(Color.black);
			g.drawLine(30, 30, 330, 30);
			g.drawLine(30, 330, 330, 330);
			g.drawLine(30, 30, 30, 330);
			g.drawLine(330, 30, 330, 330);
			
			//時間
			Date now = new Date(System.currentTimeMillis());
			DateFormat d = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM); //顯示日期,時間(精確到分)
		    String str = d.format(now);
			g.drawString(str, 330, 360);
			
			g.setFont(new Font("黑體", 20, 20));
			g.drawString("當前得分:", 345, 100);
			g.setFont(new Font("黑體", 40, 40));
			g.drawString(score, 355, 140);
			
			g.setFont(new Font("黑體", 20, 20));
			g.drawString("當前等級:", 345, 170);
			g.setFont(new Font("黑體", 40, 40));
			g.drawString("LV:"+level, 355, 210);
			
			
			
			
			if(true) {
				for(int i = 0; i < 30; i++) {
					for(int j = 0; j < 30; j++) {
						if(snake[i][j] == 1 || snake[i][j] == 2) {
							int x = i * 10 + 30;
							int y = j * 10 + 30;
							//System.out.println(x +"---" + y);
							g.setColor(Color.WHITE);
							g.fillRect(x, y, 10, 10);
							g.setColor(Color.BLACK);
							g.drawRect(x, y, 10, 10);
							
						}
					}
				}
			}
			
			
			scr.drawImage(bi, 0, 0, this);
		}
	}
	public void InitSnake() {
		for(int i = 0; i < 30; i++) {
			for(int j = 0; j < 30; j++) {
				if((i == 14 || i == 15 || i == 16 ||i == 17)&& j == 14) {
					snake[i][j] = 1;
				}
				else {
					snake[i][j] = 0;
				}
			}
		}
		direction = 1;
		headX = 14;
		headY = 14;
		tailX = 17;
		tailY = 14;
		tempX[0] = 15;
		tempY[0] = 14;
		tempX[1] = 16;
		tempY[1] = 14;
		tempX[2] = 17;
		tempY[2] = 14;
		size = 2;
		score = "0";
		level = "1";
		speed = 100;
		isEated = true;
	}
	
	class ThreadUpadte implements Runnable {

		public void run() {
			// TODO Auto-generated method stub
			while(true) {
//				System.out.println("");
//				boolean bl = isStarted;
				
				try {
					if(isStarted == true){
						Thread.sleep(speed);
						//System.out.println("111");
						if(direction == 1) {
							int t = headX - 1;
							if(t < 0)
								t = 29;
							if(snake[t][headY] == 2) {
								size++;
								EatAndUp();
								
								tempX[size] = tailX;
								tempY[size] = tailY;
								headX--;
								if(headX < 0)
									headX = 29;
								isEated = true;
								snake[headX][headY] = 1;
								direction = 1; 
								score = add(score, "5");
								up();
								repaint();
							}
							else if(snake[t][headY] == 1 ) {
	//							System.out.println("t --- " + t);
	//							System.out.println("headY --- " + headY);
	//							System.out.println("tempX[0] --- " + tempX[0]);
								JOptionPane.showMessageDialog(null,  "蛇咬到了自己,掛了~遊戲結束!!!");
								int i = JOptionPane.showConfirmDialog(null, "是否重新開始遊戲?");
								if(i == 0) {
									direction = 1;
									InitSnake();
									isEated = true;
								}
								else {
									//System.exit(EXIT_ON_CLOSE);
									isStarted = false;
									Init();
									start.setEnabled(true);
									start.requestFocus();
								}
							}
							else {
								snake[tailX][tailY] = 0;
								EatAndUp();
								headX--;
								if(headX < 0)
									headX = 29;
								snake[headX][headY] = 1;
								direction = 1; 
								repaint();
							}
						}
						if(direction == 2) {
							//System.out.println("右");
							int t = headX + 1;
							if(t > 29)
								t = 0;
							if(snake[t][headY] == 2) {
								size++;
								EatAndUp();
								
								tempX[size] = tailX;
								tempY[size] = tailY;
								headX++;
								if(headX > 29)
									headX = 0;
								isEated = true;
								direction = 2; 
								snake[headX][headY] = 1;
								score = add(score, "5");
								up();
								repaint();
							}
							else if(snake[t][headY] == 1 ) {
	//							System.out.println("t --- " + t);
	//							System.out.println("headY --- " + headY);
	//							System.out.println("tempX[0] --- " + tempX[0]);
								JOptionPane.showMessageDialog(null,  "蛇咬到了自己,掛了~遊戲結束!!!");
								int i = JOptionPane.showConfirmDialog(null, "是否重新開始遊戲?");
								if(i == 0) {
									direction = 1;
									InitSnake();
									isEated = true;
								}
								else {
									//System.exit(EXIT_ON_CLOSE);
									isStarted = false;
									Init();
									start.setEnabled(true);
									start.requestFocus();
								}
								
							}
							else {
								snake[tailX][tailY] = 0;
								EatAndUp();
								headX++;
								if(headX >29)
									headX = 0;
								direction = 2; 
								snake[headX][headY] = 1;
								repaint();
							}
						}
						if(direction == 3) {
							int t = headY - 1;
							if(t < 0)
								t = 29;
							if(snake[headX][t] == 2) {
								size++;
								EatAndUp();
								
								tempX[size] = tailX;
								tempY[size] = tailY;
								headY--;
								if(headY < 0)
									headY = 29;
								isEated = true;
								snake[headX][headY] = 1;
								score = add(score, "5");
								up();
								repaint();
							}
							else if(snake[headX][t] == 1 ) {
	//							System.out.println("t --- " + t);
	//							System.out.println("headX --- " + headX);
	//							System.out.println("tempY[0] --- " + tempY[0]);
								JOptionPane.showMessageDialog(null,  "蛇咬到了自己,掛了~遊戲結束!!!");
								int i = JOptionPane.showConfirmDialog(null, "是否重新開始遊戲?");
								if(i == 0) {
									direction = 1;
									InitSnake();
									isEated = true;
								}
								else {
									//System.exit(EXIT_ON_CLOSE);
									isStarted = false;
									Init();
									start.setEnabled(true);
									start.requestFocus();
								}
							}
							else {
								snake[tailX][tailY] = 0;
								EatAndUp();
								headY--;
								if(headY < 0)
									headY = 29;
								snake[headX][headY] = 1;
								direction = 3; 
								repaint();
							}
						}
						if(direction == 4) {
							//System.out.println("下");
							int t = headY + 1;
							if(t > 29)
								t = 0;
							if(snake[headX][t] == 2) {
								size++;
								EatAndUp();
								
								tempX[size] = tailX;
								tempY[size] = tailY;
								headY++;
								if(headY > 29)
									headY = 0;
								isEated = true;
								snake[headX][headY] = 1;
								direction = 4; 
								score = add(score, "5");
								up();
								repaint();
							}
							else if(snake[headX][t] == 1 ) {
	//							System.out.println("t --- " + t);
	//							System.out.println("headX --- " + headX);
	//							System.out.println("tempY[0] --- " + tempY[0]);
								JOptionPane.showMessageDialog(null,  "蛇咬到了自己,掛了~遊戲結束!!!");
								int i = JOptionPane.showConfirmDialog(null, "是否重新開始遊戲?");
								if(i == 0) {
									direction = 1;
									InitSnake();
									isEated = true;
								}
								else {
									//System.exit(EXIT_ON_CLOSE);
									isStarted = false;
									Init();
									start.setEnabled(true);
									start.requestFocus();
								}
							}
							else {
								snake[tailX][tailY] = 0;
								EatAndUp();
								headY++;
								if(headY > 29)
									headY = 0;
								snake[headX][headY] = 1;
								direction = 4; 
								repaint();
							}
						}
						
						if(isEated && isStarted) {
	//						new GetFood();
							Random random = new Random();
							do {
								foodX = random.nextInt(29);
								foodY = random.nextInt(29);
	//							System.out.println(foodX + "  " + foodY);
							}while(snake[foodX][foodY] == 1);
							
							snake[foodX][foodY] = 2;
							isEated = false;
						}
					}
					repaint();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}  
		
	}  
	public void EatAndUp(){
		
		
		
		for(int i = size; i >= 1; i--) {
			tempX[i] = tempX[i-1];
			tempY[i] = tempY[i-1];
		}
		
		tempX[0] = headX;
		tempY[0] = headY;
		
		tailX = tempX[size];
		tailY = tempY[size];
	}
	public void Init() {
		for(int i = 0; i < 30; i++) {
			for(int j = 0; j < 30; j++) {
				snake[i][j] = 0;
			}
		}
		score = "0";
		level = "1";
		speed = 100;
		isEated = true;
	}
	public static String add(String s1, String s2) {
		BigDecimal b1 = new BigDecimal(s1);
		BigDecimal b2 = new BigDecimal(s2);
		return b1.add(b2).toString();
		
	}
	public void up() {
		if(score.compareTo("20") == 0) {
			level = "2";
			speed -= 10;
		}
		if(score.compareTo("30") == 0) {
			level = "3";
			speed -= 10;
		}
		if(score.compareTo("40") == 0) {
			level = "4";
			speed -= 10;
		}
		if(score.compareTo("50") == 0) {
			level = "5";
			speed -= 10;
		}
		if(score.compareTo("60") == 0) {
			level = "6";
			speed -= 10;
		}
		if(score.compareTo("70") == 0) {
			level = "7";
			speed -= 10;
		}
		if(score.compareTo("80") == 0) {
			level = "8";
			speed -= 10;
		}
		if(score.compareTo("90") == 0) {
			level = "9";
			speed -= 5;
		}
		if(score.compareTo("200") == 0) {
			repaint();
			JOptionPane.showMessageDialog(null,  "恭喜你,通關了~");
			int i = JOptionPane.showConfirmDialog(null, "是否重新開始遊戲?");
			if(i == 0) {
				direction = 1;
				InitSnake();
				isEated = true;
			}
			else {
				//System.exit(EXIT_ON_CLOSE);
				isStarted = false;
				Init();
				start.setEnabled(true);
				start.requestFocus();
			}
			repaint();
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new SnakeWindow();
		
	}
}


初學者,可能代碼冗餘比較多~多見諒~還有一些什麼邏輯問題的,感覺好多好多,就那樣了。。。。我主要是通過一個二位數組來模擬的。。。嗯~以前模擬做多了,呃呵~ 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章