- 贪吃蛇的原理就是在一个方格列阵中创建一个坐标系,然后利用坐标定位控制小蛇。所以,我们需要利用的方法有导入图片的,创建一个窗口,将蛇的元素加入窗口里,利用键盘监听来控制小蛇移动,小蛇吃到食物伸长一节身子,分数的计算,死亡的判定。
- 贪吃蛇所需要的图片导入文件,然后创建一个类专门用来获取图片
a.利用URL来定位资源,获取所需图片的位置,然后将路径封装为一个对象,例如:
public static URL bodyURl = Images.class.getResource("/images/body.png");
b.利用ImageIcon来封装图片为一个对象
public static ImageIcon bodyImg = new ImageIcon(bodyURl);
3.创建窗口
a.创建窗口(默认是隐藏的)
JFrame jf = new JFrame();
b.窗口显形(通常 情况下放在最后)
jf.setVisible(true);
c.设置标题
jf.setTitle(" 标题 ");
d.设置窗口大小
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
jf.setBounds((width-800)/2,(height-800)/2,800,800);
e.为了代码更简单,不进行窗口放大这项功能,所以咱们需要把窗口改成大小不可调节的状态,示例如下:
jf.setResizable(false);
f.关闭窗口程序自动停止
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
g.创建一个面板,用于小蛇的绘画
GamePanel gp = new GamePanel();
h.将面板放入窗体
jf.add(gp);
4.在面板上实现小蛇的创建,也可以在这里创建食物的坐标
a.利用数组进行小蛇的创建
//定义两个数组
//蛇的长度
int length;
//一个数组专门存储蛇的x轴坐标
int[] snakeX = new int[200];
//一个数组专门存储蛇的y轴坐标
int[] snakeY = new int[200];
//定义食物的xy轴坐标
int foodX;
int foodY;
//加入一个变量判断小蛇的死亡状态
boolean isDie = false;//默认小蛇活着
b.定义一个方法方便调用
public void init(){
//初始化蛇的长度
length = 3;
//初始化蛇头坐标
snakeX[0] = 175;
snakeY[0] = 275;
//初始化第一节身子坐标
snakeX[1] = 150;
snakeY[1] = 275;
//初始化第二节身子坐标
snakeX[2] = 125;
snakeY[2] = 275;
//初始化蛇头的方向
direction = "R";//U D L R
//初始化食物的位置
foodX = 300;
foodY = 200;
}
5.小蛇的移动需要进行键盘监听
public GamePanel(){
init();
//将焦点定位在当前操作面板上
this.setFocusable(true);
//加入监听
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {//监听键盘按键的按下操作
super.keyPressed(e);
int keyCode = e.getKeyCode();
System.out.println(keyCode);
if(keyCode == KeyEvent.VK_SPACE){
if (isDie){
//全部恢复初始化状态
init();
score=0;
isDie=false;
}else{
isStart =!isStart;
repaint();
}
}
//监听向上箭头
if(keyCode == KeyEvent.VK_UP){
direction = "U";
}
//监听向下箭头
if(keyCode == KeyEvent.VK_DOWN){
direction = "D";
}
//监听向左箭头
if(keyCode == KeyEvent.VK_LEFT){
direction = "L";
}
//监听向右箭头
if(keyCode == KeyEvent.VK_RIGHT){
direction = "R";
}
}
});
//定时器必须要启动
timer.start();
}
6.小蛇的移动可以选择利用定时器,每次移动都是身子走头走过的路。
a.初始化定时器,相当于循环,所以说大括号里面写想要循环的
timer = new Timer(100, new ActionListener() {}
b.(以下内容都可以写进大括号)包括小蛇的移动,转向,积分,死亡
public void actionPerformed(ActionEvent e) {
if(isStart&&isDie!=true){
//游戏开始的时候,蛇才动后一节身子走到身子的位置
for (int i = length-1; i >0; i--) {
snakeX[i] = snakeX[i-1];
snakeY[i] = snakeY[i-1];
}
//动头
if ("R".equals(direction)){
snakeX[0] += 25;
}
if ("L".equals(direction)){
snakeX[0] -= 25;
}
if ("U".equals(direction)){
snakeY[0] -= 25;
}
if ("D".equals(direction)){
snakeY[0] += 25;
}
//防止蛇超出边界
if(snakeX[0]>750){
snakeX[0] = 25;
}
if(snakeX[0]<25){
snakeX[0] = 750;
}
if(snakeY[0]<100){
snakeY[0] = 725;
}
if(snakeY[0]>725){
snakeY[0] = 100;
}
//检测碰撞的动作
if(snakeX[0] == foodX&& snakeY[0] == foodY){
//蛇的长度加一
length++;
//食物坐标改变
foodX =((int) (Math.random()*30)+1)*25;//[25,750]变成【1,30】*25
foodY =(new Random().nextInt(26)+4)*25;//[100,725]变成【0,25】+4
//吃上一个食物之后 积分加10分
score +=10;
}
//死亡判定
for (int i = 1; i <length ; i++) {
if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){
//将死亡状体改为true
isDie = true;
}
}
repaint();//重绘
}
}
7.利用paintcomponent方法进行背景颜色的填充和各种图像的显现
//paintcomponent这个方法比较特殊,这个方法就属于图形版的main方法
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
//填充背景颜色
this.setBackground(new Color(240, 209, 138, 255));
//画头部照片
/*pointIcon 四个参数:this 指的是当前面板 g:指的是画笔 x,y对应的坐标
* */
Images.zhutiImg.paintIcon(this,g,10,10);
//调节画笔颜色
g.setColor(new Color(219, 244, 190));
//画一个矩形
g.fillRect(10,70,770,660);
//画小蛇
if("R".equals(direction)){
Images.rightImg.paintIcon(this,g,snakeX[0],snakeY[0]);
}
if("L".equals(direction)){
Images.leftImg.paintIcon(this,g,snakeX[0],snakeY[0]);
}
if("U".equals(direction)){
Images.upImg.paintIcon(this,g,snakeX[0],snakeY[0]);
}
if("D".equals(direction)){
Images.downImg.paintIcon(this,g,snakeX[0],snakeY[0]);
}
/*Images.bodyImg.paintIcon(this,g,snakeX[1],snakeY[1]);
Images.bodyImg.paintIcon(this,g,snakeX[2],snakeY[2]);*/
//循环画蛇的身子
for (int i = 1; i <length; i++) {
Images.bodyImg.paintIcon(this,g,snakeX[i],snakeY[i]);
}
//如果游戏是暂停的,界面中间就应该有一句提示语
if(isStart==false){
//画一个文字
g.setColor(new Color(11, 238, 7));
//字体 加粗 字号
g.setFont(new Font("微软雅黑",Font.BOLD,40));
//画文字
g.drawString("点击空格开始游戏",250,330);
}
//画食物
Images.foodImg.paintIcon(this,g,foodX,foodY);
//画积分
g.setColor(new Color(238, 19, 19));
g.setFont(new Font("微软雅黑",Font.BOLD,20));
g.drawString("积分:"+score,620,30);
//划入死亡状态
if(isDie==true) {
g.setColor(new Color(33, 179, 123));
g.setFont(new Font("微软雅黑", Font.BOLD, 20));
g.drawString("小蛇死亡,游戏停止,按下空格重新开始游戏", 200, 330);
}
}
}
8.总而言之,贪吃蛇游戏对于新手学习Java最难的部分就是如何创建窗口将图像显现出来和如何进行键盘监听来控制小蛇的移动。只要这些方法搞懂就能自己写一个完美的贪吃蛇小游戏了。