javaswing 贪吃蛇双人小游戏
游戏截图
代码 Java14写的哦低版本会报错
文件列表
package Sys;import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.LinkedList;
import java.util.Timer;
import java.util.TimerTask;public class MainFame extends JFrame implements Runnable {private Snake snake;//蛇private Snake snake1;//蛇private JPanel jpanel;//游戏棋盘private Node[] food;//食物private int signSnake = 1;//标记蛇final Object cluck = 2;private boolean moveBoolean = true;
// private boolean firstTime = true;public MainFame() {// 初始化框体initFrame();
// 初始化网格initGamePanel();
// 初始化蛇initSnake();
// 初始化食物initFood();setVisible(true);try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}
// 初始化定时器
// initTimer();
// 键盘监听setKyeListener();
// 启动多线程
// Runnable R = this;-----
// new Thread(R).start();
// new Thread(R).start();}private void initFood() {food = new Node[3];for (int i = 0; i < food.length; i++) {food[i] = new Node();food[i].random();}}//键盘监听private void setKyeListener() {addKeyListener(new KeyAdapter() {// 按下键盘@Overridepublic void keyPressed(KeyEvent e) {if(moveBoolean){switch (e.getKeyCode()) {case KeyEvent.VK_UP -> snake.setDirection(Direction.UP);case KeyEvent.VK_DOWN -> snake.setDirection(Direction.DOWN);case KeyEvent.VK_LEFT -> snake.setDirection(Direction.LEFT);case KeyEvent.VK_RIGHT -> snake.setDirection(Direction.RIGHT);case KeyEvent.VK_W -> snake1.setDirection(Direction.UP);case KeyEvent.VK_S -> snake1.setDirection(Direction.DOWN);case KeyEvent.VK_A -> snake1.setDirection(Direction.LEFT);case KeyEvent.VK_D -> snake1.setDirection(Direction.RIGHT);}}moveBoolean = true;}});}// 多线程船舰蛇@Overridepublic void run() {if (signSnake == 1) {signSnake++;Thread.currentThread().setName("->红色方<-");initTimer(snake, snake1, Thread.currentThread().getName());} else if (signSnake == 2) {Thread.currentThread().setName("->绿色方<-");initTimer(snake1, snake, Thread.currentThread().getName());}}// 初始化定时器private void initTimer(Snake snake, Snake snake1, String name) {// 创建定时器对象//定时器Timer timer = new Timer();// 初始化定时任务TimerTask timerTask = new TimerTask() {@Overridepublic void run() {if (snake.getIslive()) {synchronized (cluck) {snake.move(snake1);//1,moveBoolean = true;}
// 吃食物,临界区处理Node head = snake.getBody().getFirst();for (Node node : food) {if (head.getX() == node.getX() && head.getY() == node.getY()) {snake.eat();node.random();}}// 更新棋盘jpanel.repaint();} else {timer.cancel();System.out.println("蛇线程" + name + "结束!!!");System.out.println("蛇线程" + name + "得分:" + snake.scor);}}};
// 每100毫秒执行一次定时任务timer.scheduleAtFixedRate(timerTask, 0, 100);}private void initSnake() {this.snake = new Snake(18);this.snake1 = new Snake(22);}// 初始化网格private void initGamePanel() {jpanel = new JPanel() {@Overridepublic void paint(Graphics g) {super.paint(g);
// 清空棋盘g.clearRect(0, 0, 600, 600);
// 画线for (int i = 0; i < 40; i++) {g.drawLine(0, 15 * i, 600, 15 * i);g.drawLine(15 * i, 0, 15 * i, 600);}
// 绘制蛇g.setColor(Color.blue);LinkedList<Node> body = snake.getBody();for (int i = 1; i <= body.size(); i++) {if(i == body.size()){g.setColor(Color.RED);}g.fillRect(body.get(body.size() - i).getX() * 15, body.get(body.size() - i).getY() * 15, 15, 15);}
// for (Node node : body) {// if(p == 1){// g.setColor(Color.MAGENTA);
// p++;
// }else{// g.setColor(Color.RED);
// }
// g.fillRect(node.getX() * 15, node.getY() * 15, 15, 15);
// }g.setColor(Color.PINK);LinkedList<Node> body1 = snake1.getBody();for (int i = 1; i <= body1.size(); i++) {if(i == body1.size()){g.setColor(Color.GREEN);}g.fillRect(body1.get(body1.size() - i).getX() * 15, body1.get(body1.size() - i).getY() * 15, 15, 15);}
// for (Node node : body1) {// if(p == 1){// g.setColor(Color.PINK);
// p++;
// }else{// g.setColor(Color.GREEN);
// }
// g.fillRect(node.getX() * 15, node.getY() * 15, 15, 15);
// }
// 绘制食物g.setColor(Color.BLACK);for (Node node : food) {g.fillRect(node.getX() * 15, node.getY() * 15, 15, 15);}}};
// 添加网格到框体中add(jpanel);}// 初始化框体public void initFrame() {// 标题setTitle("胡柯洋的贪吃蛇");
// 大小setSize(616, 639);
// 不可调节大小setResizable(false);
// 设置位置setLocation(0, 200);
// 点x关闭setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public static void start(){JFrame jFrame = new JFrame();JButton jButton = new JButton("点击开始单人游戏");JButton jButton1 = new JButton("点击开始双人游戏");jButton.addActionListener(e -> {Runnable R = new MainFame();new Thread(R).start();});jButton1.addActionListener(e -> {Runnable R = new MainFame();new Thread(R).start();new Thread(R).start();});jFrame.setLayout(new FlowLayout(FlowLayout.CENTER, 20, 20));jFrame.add(jButton1);jFrame.add(jButton);jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jFrame.pack();jFrame.setVisible(true);jFrame.setLocation(900, 200);}public static void main(String[] args) {start();System.out.println("主线程结束!!!");}
}
package Sys;import java.util.LinkedList;public class Snake {//方向private Direction direction = Direction.LEFT;//蛇身体private LinkedList<Node> body;//蛇生命private boolean islive = true;//分数int scor = 0;
// int sign;
// Snake snake1;public Snake(int y) {initSnake(y);}// 有移动蛇public void move(Snake snake1) {//int sign,if (islive) {//&& sign == 1// 获取蛇头Node head = body.getFirst();Node newHead;body.removeLast();//去掉蛇尾switch (direction) {case UP -> {newHead = new Node(head.getX() % 40, (head.getY() - 1 + 40) % 40);body.addFirst(newHead);}case LEFT -> {newHead = new Node((head.getX() - 1 + 40) % 40, head.getY() % 40);body.addFirst(newHead);}case DOWN -> {newHead = new Node(head.getX() % 40, (head.getY() + 1) % 40);body.addFirst(newHead);}case RIGHT -> {newHead = new Node((head.getX() + 1) % 40, head.getY() % 40);body.addFirst(newHead);}}head = body.getFirst();if (head.getX() < 0 || head.getY() < 0 || head.getX() >= 40 || head.getY() >= 40) {this.islive = false;}
// for (int i = 1; i < body.size(); i++) {// Node node = body.get(i);
// if (node.getX() == head.getX() && node.getY() == head.getY()) {// this.islive = false;
// }
// }int t = snake1.getBody().size();for (int i = 0; i < t; i++) {Node node = snake1.getBody().get(i);//errorif (node.getX() == head.getX() && node.getY() == head.getY()) {this.islive = false;break;}}}}// 初始化蛇private void initSnake(int y) {// 初始化蛇的实例body = new LinkedList<>();
// 添加节点body.add(new Node(16, y));body.add(new Node(17, y));body.add(new Node(18, y));
// body.add(new Node(19, 20));
// body.add(new Node(20, 20));
// body.add(new Node(21, 20));
// body.add(new Node(22, 20));}public LinkedList<Node> getBody() {return body;}public void setDirection(Direction direction) {this.direction = direction;}public Direction getDirection() {return direction;}// 吃食物public void eat() {scor ++;// 获取蛇头Node head = body.getFirst();Node newHead;switch (direction) {case UP -> {newHead = new Node(head.getX(), head.getY() - 1);body.addFirst(newHead);}case LEFT -> {newHead = new Node(head.getX() - 1, head.getY());body.addFirst(newHead);}case DOWN -> {newHead = new Node(head.getX(), head.getY() + 1);body.addFirst(newHead);}case RIGHT -> {newHead = new Node(head.getX() + 1, head.getY());body.addFirst(newHead);}}}public boolean getIslive() {return islive;}
}
package Sys;import java.util.Random;public class Node {private int x;private int y;
// public boolean isEat = false;public Node() {}public Node(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;}public void random() {Random r = new Random();this.x = r.nextInt(34) + 3;this.y = r.nextInt(34) + 3;}
}
package Sys;public enum Direction{UP, DOWN, LEFT, RIGHT;
}
javaswing 贪吃蛇双人小游戏相关推荐
- 用前端技术实现贪吃蛇的小游戏
用前端技术实现贪吃蛇的小游戏 前言 游戏功能 游戏设计 游戏主页代码 游戏中的js代码(snake.js) 游戏运行界面 前言 周末大热天窝在家里无聊,想温习一下前端开发,所以用javascript ...
- 贪食蛇php,贪吃蛇网页小游戏的代码
贪吃蛇网页小游戏的代码 ::selection { color:#FFFFFF; background:transparent; } ::-moz-selection { color:#FFFFFF; ...
- 隐藏窗口 java swing_Java简单实现贪吃蛇经典小游戏(附源代码)
在我们学习java的时候,为了提高我们的兴趣,我们经常会使用所学到的知识去做一些小游戏,这篇blog就介绍了一个经典而且好理解的小游戏-贪吃蛇. 一.使用知识 Jframe GUI 双向链表 线程 二 ...
- 贪吃蛇html网页小游戏,网页贪吃蛇HTML5小游戏制作
贪吃蛇是以前我们经常在手机里玩的一个小游戏,现在要是把它搬到网页上也会让人更回味.这是一款非常有趣的HTML5响应式网页贪吃蛇小游戏.在游戏中你可以使用键盘的上下左右来控制蛇的运动方向.现在要列出的是 ...
- 在家用c++实现贪吃蛇——c++小游戏
伪代码: 地图为二位数组 int main(){ 死循环 刷新地图 生成水果 获取键盘 移动头部 判定死亡.吃到水果 if(没有吃到水果) {移动尾部 } 等待指定秒数 清屏 } 首先,我们因该可以把 ...
- 最终幻想游戏java_Java简单实现贪吃蛇经典小游戏(附源代码)
在我们学习java的时候,为了提高我们的兴趣,我们经常会使用所学到的知识去做一些小游戏,这篇blog就介绍了一个经典而且好理解的小游戏-贪吃蛇. 一.使用知识Jframe GUI 双向链表 线程 二. ...
- 100行实现《贪吃蛇》小游戏详解(Qt)
目录 游戏说明 游戏效果展示 游戏代码详解 关键数据结构 初始化游戏界面 游戏部分 提示部分 蛇逻辑 小蛇的初始化 边界判断 蛇吃食物判断 随机生成食物 是否撞到自己 小蛇的移动 游戏主体逻辑 定时 ...
- 用javascript+jquery编写的小游戏-贪吃蛇(双人对战版)
前言 这是我在多年前初学jquery, 并结合javascript, 编写的一个小游戏.那洋洋洒洒几千行的js代码时刻提醒着我"不忘初心!". 效果演示 代码 引入文件 由于用到了 ...
- c语言联机游戏,C/C++ 游戏 贪吃蛇双人对战版
贪吃蛇双人对战版--C语言 最近写的,用于交最后一次结构化程序设计课的作业,闲暇之余传到网上,仅供参考,新手上路,请多指教. 话不多说,先附上下载链接.http://download.csdn.net ...
最新文章
- 软工Chapter Seven
- 小波变换工程实现原理总结
- python中case的用法_用 Python 实现简单的 switch/case 语句
- Mongodb存储特性与内部原理
- ERP商品管理业务逻辑封装(三十四)
- 《正则表达式经典实例(第2版)》——2.18 向正则表达式中添加注释
- Head First Design Patterns(深入浅出设计模式)-设计模式介绍
- UVa 12261 High Score (贪心“向左走,向右走”)
- bh1750采集流程图_多路BH1750光强检测系统的设计
- 2022-2028全球与中国语音疏散系统市场现状及未来发展趋势
- GoogleChromePortable 谷歌chrome浏览器便携版官网下载方式
- PDF编辑器首选工具Acrobat Pro DC
- Express(一) ——简单入门
- 背包三讲(感谢崔添翼 (Tianyi Cui)大佬的无私奉献)
- PTA判断题总结(1)
- Java Java!
- 洛谷 1546 最短网络
- 如何写出无法维护的代码
- RN终止所有节点进程并启动npm服务器命令
- 如何支持github账号登录
热门文章
- 由控制器和运算器组成微型计算机系统中的,微型计算机的主机由控制器运算器和什么构成...
- 九方智投李红红:新型储能方案推动锂电池迎来新商机
- 【bzoj2434】阿狸的打字机 AC自动机+树状数组
- Python入门之字典
- python贴吧签到神器永久雷霆之怒_雷霆之怒神器脚本辅助 雷霆之怒幻神搭配攻略分享...
- 工作邦智慧水务云平台支持的20+硬件
- Oracle远程创建表空间报错ORA-01119 ORA-27040 OSD-O4OO2
- NTLDR is missing
- 超详细的计算机网络基础知识总结 第一章:概述
- 江苏省计算机中级职称题库,计算机中级职称考试复习题「附答案」