package com.wxh.snake;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Snake {
public static void main(String[] args) {
JFrame jf=new JFrame();
jf.setBounds(400, 200, 432, 454);
jf.setLayout(null);
jf.setTitle("贪吃蛇");
jf.setDefaultCloseOperation(3);
SnakePanel sp=new SnakePanel();
jf.add(sp);
jf.setVisible(true);
sp.requestFocus(true);
sp.headGo();
}
}
class SnakePanel extends JPanel implements KeyListener{
private int speed=400;//蛇移动的速度
private int fangxiang=4;//运动方向
private JPanel[] jps=new JPanel[400];
//定义一个蛇头
private Rect headRect;
//定义整个身体
private ArrayList<Rect> list;
//定义食物小方块
private Rect foodRect;
public SnakePanel(){
//初始化舌头的坐标
headRect=new Rect(0,0);
list=new ArrayList<Rect>();
//把舌头添加进去
list.add(headRect);
//产生一个食物
foodRect=randomFood();
this.setSize(419,419);
this.setBackground(Color.black);
this.setLayout(new GridLayout(20, 20, 1, 1));
for(int i=0;i<jps.length;i++){
jps[i]=new JPanel();
jps[i].setBackground(Color.green);
this.add(jps[i]);
}
this.addKeyListener(this);
}
//随机食物的方法
public Rect randomFood(){
return new Rect((int)(Math.random()*20)*21,(int)(Math.random()*20)*21);
}
//判断食物是否被吃到
public boolean eat(){
boolean flag=false;
if(headRect.getX()==foodRect.getX() && headRect.getY()==foodRect.getY()){
flag=true;
if(speed>=200){
speed-=50;
}else if(speed>=100){
speed-=20;
}else if(speed>=40){
speed-=4;
}else if(speed == 10){
}
}
return flag;
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.red);
//g.fillRect(headRect.getX(), headRect.getY(), 20, 20); //画舌头
//画整个蛇
for(int i=0;i<list.size();i++){
g.fillRect(list.get(i).getX(), list.get(i).getY(), 20, 20);
}
g.fillRect(foodRect.getX(), foodRect.getY(), 20, 20);//画食物
}
//身体移动
public void bodyGo(){
for(int i=list.size()-1;i>0;i--){
list.get(i).setX(list.get(i-1).getX());
list.get(i).setY(list.get(i-1).getY());
}
}
//判断游戏结束
//蛇头运动
public void headGo(){
while(true){
bodyGo();
if(fangxiang==1){
headRect.setY(headRect.getY()-21);
}else if(fangxiang==2){
headRect.setY(headRect.getY()+21);
}else if(fangxiang==3){
headRect.setX(headRect.getX()-21);
}else if(fangxiang==4){
headRect.setX(headRect.getX()+21);
}
repaint();
if(eat()){
list.add(foodRect);
foodRect=randomFood();//如果食物被吃到,则将食物的坐标改动
}
try {
Thread.sleep(speed);//睡眠控制速度
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void keyPressed(KeyEvent e) {
int i=e.getKeyCode();
if(i==KeyEvent.VK_UP){
fangxiang=1;
}else if(i==KeyEvent.VK_DOWN){
fangxiang=2;
}else if(i==KeyEvent.VK_LEFT){
fangxiang=3;
}else if(i==KeyEvent.VK_RIGHT){
fangxiang=4;
}
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}
class Rect{
private int x;
private int y;
public Rect() {
}
public Rect(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
![](https://ucenter.51cto.com/images/noavatar_middle.gif)
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
HTML+CSS+JS纯手写贪吃蛇
纯手写的简单贪吃蛇小游戏
贪吃蛇 html贪吃蛇 js贪吃蛇 纯手写贪吃蛇 简单贪吃蛇 -
贪吃蛇(图形版)
分析里面的有几个事物:1. 地图2. 蛇3. 食物了解游戏规则: 1.蛇初始化的时候是三个
贪吃蛇 游戏 图形版 java 3d -
贪吃蛇(字符版)
贪吃蛇游戏: 一个游戏最核心的部分是游戏的业务逻辑代码。分析里面的有几个事物:1. 地图2. 蛇3. 食物了解游戏规则: 1.蛇初始化的
游戏 贪吃蛇 字符版 java 初始化