欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java贪吃蛇游戏编写代码

程序员文章站 2023-12-18 11:45:34
本文实例为大家分享了java贪吃蛇游戏展示的具体代码,供大家参考,具体内容如下 1、采用mvc(model、view、control)框架模式  2、...

本文实例为大家分享了java贪吃蛇游戏展示的具体代码,供大家参考,具体内容如下

1、采用mvc(model、view、control)框架模式 

java贪吃蛇游戏编写代码

java贪吃蛇游戏编写代码

2、包和类的关系树形图为: 

java贪吃蛇游戏编写代码

3、源码:

package com.huai;
import java.awt.color;
import java.awt.graphics;
import java.awt.point;
import java.util.hashset;
import java.util.linkedlist;
import java.util.set;
import com.huai.listener.snakelistener;
import com.huai.util.constant;
public class snake {
 //和蛇的监听器有关
 set<snakelistener> snakelistener = new hashset<snakelistener>();
 
 //用链表保存蛇的身体节点
 linkedlist<point> body = new linkedlist<point>();
 
 private boolean life = true;
 
 //默认速度为400ms
 private int speed = 400;
 private point lasttail = null;
 private boolean pause = false;
 
 //定义各个方向
 public static final int up = 1;
 public static final int down = -1;
 public static final int left = 2;
 public static final int right = -2;
 int newdirection = right;
 int olddirection = newdirection;
 
 public snake(){
 initial();
 }
 
 public void initial(){
 //先清空所有的节点
 body.removeall(body);
 
 int x = constant.width/2;
 int y = constant.height/2;
 
 //蛇的默认长度为7
 for(int i = 0; i < 7; i++){
 body.add(new point(x--, y));
 }
 }
 
 public void setspeed(int speed){
 this.speed = speed;
 }
 public void setlife(boolean life){
 this.life = life;
 }
 public boolean getlife(){
 return this.life;
 }
 public boolean getpause(){
 return this.pause;
 }
 public void setpause(boolean pause){
 this.pause = pause;
 }
 
 public void move(){
 //蛇移动的实现所采用的数据结构为:蛇尾删除一个节点,蛇头增加一个节点。
 
 system.out.println("snake move");
 
 if(!(olddirection + newdirection == 0)){
 olddirection = newdirection;
 }
 lasttail = body.removelast();
 
 int x = body.getfirst().x;
 int y = body.getfirst().y;
 
 switch(olddirection){
 case up:
 y--;
 break;
 case down:
 y++;
 break;
 case left:
 x--;
 break;
 case right:
 x++;
 break;
 }
 point point = new point(x, y);
 body.addfirst(point);
 }
 
 //当吃到一个食物的时候,把删掉的蛇尾节点增加回来
 public void eatfood(){
 system.out.println("snake eat food");
 
 body.addlast(lasttail);
 }
 
 public boolean iseatitself(){
 for(int i = 2; i < body.size(); i++){
 if(body.getfirst().equals(body.get(i))){
 return true;
 }
 }
 return false;
 }
 
 public void drawme(graphics g){
 system.out.println("draw snake");
 
 //循环打印蛇的各个身体节点
 for(point p:body){
 if(p.equals(body.getfirst())){
 //当是蛇头的时候,就设置颜色为橘色
 g.setcolor(color.orange);
 }else{
 g.setcolor(color.pink);
 }
 g.fill3drect(p.x * constant.cell_size, p.y * constant.cell_size, 
 constant.cell_size, constant.cell_size, true);
 }
 }
 
 public void changedirection(int direction){
 system.out.println("snake changedirection");
 this.newdirection = direction;
 }
 
 //内部类,新增一个游戏线程
 public class drivesnake implements runnable{ @override
 public void run() {
 while(life){
 if(!pause){
 //只要让蛇不动就可以暂停游戏
 move();
 }
 //监听蛇每次移动的情况
 for(snakelistener listener : snakelistener){
 listener.snakemove(snake.this);
 }
 try {
 thread.sleep(speed);
 } catch (interruptedexception e) {
 e.printstacktrace();
 }
 }
 }
 }
 
 public void startmove(){
 new thread(new drivesnake()).start();
 }
 
 //增加监听器的方法
 public void addsnakelistener(snakelistener listener){
 if(listener != null){
 snakelistener.add(listener);
 }
 }
 
 //返回蛇的第一个身体节点
 public point gethead(){
 return body.getfirst();
 }
 
 //返回蛇的所有身体节点
 public linkedlist<point> getsnakebody(){
 return this.body;
 }
 
 public boolean died(){
 this.life = false;
 return true;
 }
}
package com.huai;
import java.awt.color;
import java.awt.graphics;
import java.awt.point;
import com.huai.util.constant;
public class food {
 private int x = 0;
 private int y = 0;
 //设置食物的默认颜色为红色
 private color color = color.red;
 
 public void newfood(point point){
 x = point.x;
 y = point.y;
 }
 
 //判断是否被吃到
 public boolean isate(snake snake){
 
 if(snake.gethead().equals(new point(x, y))){
 system.out.println("food isate");
 return true;
 }
 return false;
 }
 
 public void setfoodcolor(color color){
 this.color = color;
 }
 public color getfoodcolor(){
 return this.color;
 }
 
 public void drawme(graphics g){
 system.out.println("draw food");
 g.setcolor(this.getfoodcolor());
 g.fill3drect(x * constant.cell_size, y * constant.cell_size,
 constant.cell_size, constant.cell_size, true);
 }
}
package com.huai;
import java.awt.color;
import java.awt.graphics;
import java.awt.point;
import java.util.linkedlist;
import java.util.random;
import com.huai.util.constant;
public class ground {
 //在二维数组中,当为1,表示是砖块
 private int[][] rock = new int[constant.width][constant.height];
 
 private boolean drawline = true;
 
 
 
 public boolean isdrawline() {
 return drawline;
 }
 public void setdrawline(boolean drawline) {
 this.drawline = drawline;
 } public ground(){
 for(int x = 0; x < constant.width; x++){
 for(int y = 0; y < constant.height; y++){
 rock[0][y] = 1;
 rock[x][0] = 1;
 rock[constant.width-1][y] = 1;
 rock[y][constant.height-1] = 1;
 }
 }
 }
 
 //打印游戏的网格
 public void drawgrid(graphics g){
 for(int x = 2; x < constant.width; x++){
 g.drawline(x * constant.cell_size, 0, x*constant.cell_size,
 constant.cell_size * constant.height);
 }
 for(int y = 2; y < constant.height; y++){
 g.drawline(0, y * constant.cell_size, 
 constant.width*constant.cell_size, y*constant.cell_size);
 }
 }
 public void drawme(graphics g){
 system.out.println("draw ground");
 
 //打印围墙
 g.setcolor(color.pink);
 for(int x = 0; x < constant.width; x++){
 for(int y = 0; y < constant.height; y++){
 if(rock[x][y] == 1){
 g.fill3drect(x * constant.width, y * constant.height,
 constant.cell_size, constant.cell_size, true);
 }
 }
 }
 if(isdrawline()){
 g.setcolor(color.yellow);
 this.drawgrid(g);
 }
 }
 
 //得到一个随机点
 public point getrandompoint(snake snake, thorn thorn){
 random random = new random();
 boolean isundersnakebody = false;
 boolean isunderthorn = false;
 int x,y = 0;
 linkedlist<point> snakebody = snake.getsnakebody();
 linkedlist<point> thorns = thorn.getthorns();
 do{
 x = random.nextint(constant.width);
 y = random.nextint(constant.height);
 for(point p:snakebody){
 if(x == p.x && y == p.y){
 isundersnakebody = true;
 }
 }
 for(point point : thorns){
 if(x == point.x && y == point.y){
 isunderthorn = true;
 }
 }
 }while(rock[x][y] == 1 && !isundersnakebody && !isunderthorn);
 
 
 
 return new point(x, y);
 }
 
 public boolean issnakehitrock(snake snake){
 system.out.println("snack hit rock");
 
 for(int i = 0; i < constant.width; i++){
 for(int j = 0; j < constant.height; j++){
 if(snake.gethead().x == i && 
 snake.gethead().y == j && rock[i][j] == 1){
 return true;
 }
 }
 }
 return false;
 }
 
 
}
package com.huai
import java.awt.color;
import java.awt.graphics;
import java.awt.point;
import java.util.linkedlist;
import com.huai.util.constant;
public class thorn { int x, y;
 private linkedlist<point> thorns = new linkedlist<point>();
 
 
 //返回所有荆棘的链表
 public linkedlist<point> getthorns(){
 return this.thorns;
 }
 
 public void newthorn(point point){
 x = point.x;
 y = point.y;
 
 thorns.add(new point(x, y));
 }
 
 public void drawme(graphics g){
 system.out.println("draw thorns");
 
 
 for(point p: thorns){
 int[] xb = {p.x*constant.cell_size, 
 (p.x*constant.cell_size +constant.cell_size/2),
 (p.x*constant.cell_size+constant.cell_size),
 (p.x*constant.cell_size+constant.cell_size/4*3), 
 (p.x*constant.cell_size+constant.cell_size),
 (p.x*constant.cell_size+constant.cell_size/2), 
 p.x*constant.cell_size,
 (p.x*constant.cell_size+constant.cell_size/4), 
 p.x*constant.cell_size};
 int [] yb = {p.y*constant.cell_size, 
 (p.y*constant.cell_size+constant.cell_size/4),
 p.y*constant.cell_size,
 (p.y*constant.cell_size+constant.cell_size/2),
 (p.y*constant.cell_size+constant.cell_size),
 (int)(p.y*constant.cell_size+constant.cell_size*0.75),
 (p.y*constant.cell_size+constant.cell_size),
 (p.y*constant.cell_size+constant.cell_size/2),
 p.y*constant.cell_size};
 
 g.setcolor(color.darkgray);
 g.fillpolygon(xb, yb, 8);
 }
 
 }
 
 
 public boolean issnakehitthorn(snake snake){
 
 for(point points : thorns){
 if(snake.gethead().equals(points)){
 system.out.println("hit thorn");
 return true;
 }
 }
 return false;
 }
 
 
 }
package com.huai.listener;
import com.huai.snake;
public interface snakelistener {
 public void snakemove(snake snake);
}
 package com.huai.util;public class constant {
 public static int cell_size = 20;
 public static int width = 20;
 public static int height = 20;
}
package com.huai.view;
import java.awt.color;
import java.awt.graphics;import javax.swing.jpanel;import com.huai.food;
import com.huai.ground;
import com.huai.snake;
import com.huai.thorn;
import com.huai.util.constant;public class gamepanel extends jpanel{
 /**
 * 
 */
 private static final long serialversionuid = 1l;
 
 snake snake;
 food food;
 ground ground;
 thorn thorn;
 
 public void display(snake snake, food food, ground ground, thorn thorn){
 this.snake = snake;
 this.food = food;
 this.ground = ground;
 this.thorn = thorn;
 
 system.out.println("display gamepanel");
 this.repaint();
 }
 
 @override
 protected void paintcomponent(graphics g) {
 if(snake != null && food != null && ground != null){
 g.setcolor(color.lightgray);
 g.fillrect(0, 0, constant.width*constant.cell_size, 
 constant.height*constant.cell_size);
 snake.drawme(g);
 food.drawme(g);
 ground.drawme(g);
 thorn.drawme(g);
 }else{
 system.out.println("snake = null || food = null || ground = null");
 }
 }
}

package com.huai.controller;

import java.awt.event.keyadapter;
import java.awt.event.keyevent;import com.huai.food;
import com.huai.ground;
import com.huai.snake;
import com.huai.thorn;
import com.huai.listener.snakelistener;
import com.huai.view.gamepanel;public class controller extends keyadapter implements snakelistener{
/**
 * 整个游戏的控制类,属于mvc设计框架中的controller
 * 其中包括控制游戏的监听事件和游戏逻辑
 */
 snake snake;
 food food;
 ground ground;
 gamepanel gamepanel;
 thorn thorn;
 
 public controller(){}
 
 //利用构造方法初始化对象
 public controller(snake snake, food food, ground ground, gamepanel gamepanel, thorn thorn) {
 super();
 this.snake = snake;
 this.food = food;
 this.ground = ground;
 this.gamepanel = gamepanel;
 this.thorn = thorn;
 }
 @override
 public void keypressed(keyevent e) {
 
 switch(e.getkeycode()){
 case keyevent.vk_up:
 snake.changedirection(snake.up);
 snake.setspeed(150);
 break;
 case keyevent.vk_down:
 snake.changedirection(snake.down);
 snake.setspeed(150);
 break;
 case keyevent.vk_left:
 snake.changedirection(snake.left);
 snake.setspeed(150);
 break;
 case keyevent.vk_right:
 snake.changedirection(snake.right);
 snake.setspeed(150);
 break;
 case keyevent.vk_enter:
 if(!snake.getpause() && snake.getlife()){
 //暂停游戏
 snake.setpause(true);;
 }else if(!snake.getlife()){
 //重新开始游戏
 snake.setlife(true);
 snake.initial();
 snake.changedirection(snake.up);
 thorn.getthorns().removeall(thorn.getthorns());
 this.startgame();
 }else{
 snake.setpause(false);
 }
 break;
 case keyevent.vk_l:
 //当按下l按钮时,是否显示游戏网格
 if(ground.isdrawline()){
 ground.setdrawline(false);
 }else{
 ground.setdrawline(true);
 }
 break;
 }
 }
 
 
 @override
 public void keyreleased(keyevent e) {
 switch(e.getkeycode()){
 case keyevent.vk_up:
 snake.setspeed(400);
 break;
 case keyevent.vk_down:
 snake.setspeed(400);
 break;
 case keyevent.vk_left:
 snake.setspeed(400);
 break;
 case keyevent.vk_right:
 snake.setspeed(400);
 break;
 }
 }
 
 //这是实现snakelistener监听器所override的方法
 
 @override
 public void snakemove(snake snake) {
 //显示snake ,food,ground,和thorn
 gamepanel.display(snake, food, ground, thorn);
 if(ground.issnakehitrock(snake)){
 snake.died();
 }
 if(snake.iseatitself()){
 snake.died();
 }
 if(food.isate(snake)){
 snake.eatfood();
 food.newfood(ground.getrandompoint(snake, thorn));
 thorn.newthorn(ground.getrandompoint(snake, thorn));
 }
 if(thorn.issnakehitthorn(snake)){
 snake.died();
 }
 }
 
 public void startgame(){
 snake.startmove();//这个将会启动一个新的线程
 food.newfood(ground.getrandompoint(snake, thorn));
 thorn.newthorn(ground.getrandompoint(snake, thorn));
 }
 
}

package com.huai.game;

import java.awt.borderlayout;
import java.awt.color;import javax.swing.jframe;
import javax.swing.jlabel;import com.huai.food;
import com.huai.ground;
import com.huai.snake;
import com.huai.thorn;
import com.huai.controller.controller;
import com.huai.util.constant;
import com.huai.view.gamepanel;public class game {
 public static void main(string args[]){
 
 snake snake = new snake();
 food food = new food();
 gamepanel gamepanel = new gamepanel();
 ground ground = new ground();
 thorn thorn = new thorn();
 controller controller = new controller(snake, food, ground, gamepanel, thorn);
 
 jframe frame = new jframe("怀哥的小小蛇儿游戏");
 frame.add(gamepanel);
 frame.setbackground(color.magenta);
 frame.setsize(constant.width*constant.cell_size+6, 
 constant.height*constant.cell_size+40);
 gamepanel.setsize(constant.width*constant.cell_size, 
 constant.height*constant.cell_size);
 frame.add(gamepanel);
 frame.setresizable(false);//不可改变窗口大小
 frame.setdefaultcloseoperation(jframe.exit_on_close);
 frame.setvisible(true);
 
 gamepanel.addkeylistener(controller);
 snake.addsnakelistener(controller);
 frame.addkeylistener(controller);
 
 jlabel label1 = new jlabel();
 label1.setbounds(0, 400, 400, 100);
 label1.settext("   enter=>>pause or again;  "
 + " l=>drawgrid");
 label1.setforeground(color.black);
 frame.add(label1, borderlayout.south);
 
 controller.startgame();
 }
}

更多精彩游戏,请参考专题《java经典小游戏》

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇:

下一篇: