技术讨论群:1005611884 可获取各种资料/代码,群内有Java/Python/C++/C#方向大佬,妹子多

/*** 技术 Swing* 实现思路:* 1. 绘制窗口* 2. 初始化游戏界面*    创建所有卡片*    随机创建一个卡片 和 显示的数字 2或者4* 3.根据键盘的方向,处理数字的移动和相同数字的合并* 4.游戏结束的判断*/
public class Game2048{public static  JFrame gameFrame;public static void main(String[] args) {gameFrame = new JFrame();gameFrame.setSize(370,400);gameFrame.setTitle("2048游戏");gameFrame.setLocationRelativeTo(null);gameFrame.add(new GamePanel());gameFrame.setVisible(true);}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Random;//画布
class GamePanel extends JPanel {public GamePanel(){//1. 初始化所有卡片initCard();//2.随机创建一个卡片createRandcard();//3. 创建键盘监听createKeyListener();}///键盘监听private void createKeyListener() {Game2048.gameFrame.addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {//清理卡片的合并标记for (int i = 0; i <4; i++) {for (int j = 0; j < 4; j++) {Card card =allCards[i][j];card.hebing = false;}}//获取按键的codeint key = e.getKeyCode();switch (key){case KeyEvent.VK_UP: //向上moveCardTop(true);break;case KeyEvent.VK_DOWN: //向下moveCardDown(true);break;case KeyEvent.VK_LEFT: //向左moveCardLeft(true);break;case KeyEvent.VK_RIGHT: //向右moveCardRight(true);break;}createRandcard();repaint();//重绘isgameOver();}});}//判断游戏是否结束private void isgameOver() {for (int i = 0; i < 4; i++) {for (int j = 0; j < 4 ; j++) {if(allCards[i][j].num == 2048){//其中有个数字是2048JOptionPane.showMessageDialog(null,"赢了!","恭喜",JOptionPane.WARNING_MESSAGE);return;}else if(isFull()){//位置满了//还得判断 上下左右四个方向是不是都不饿能移动了if(moveCardDown(false) || moveCardLeft(false) || moveCardRight(false) || moveCardTop(false)){//至少有一个地方能移动return;//结束方法}else{//都不能JOptionPane.showMessageDialog(null,"游戏结束!","很遗憾",JOptionPane.WARNING_MESSAGE);return;}}}}}//向上private boolean moveCardTop(boolean flag) {boolean canMove = false;//1.从第2行开始移动,因为第1行不需要移动//2.只要卡片的数字不是0,就表示要移动//3.根据i-1 可以获取上一个卡片,如果上一个卡片是0,则把当前卡片交换上去,并且递归。因为可能要继续往上移动。//4.如果当前卡片与上一个卡片是相同数字,则要合并Card card;for (int i = 1; i <4 ; i++) {for (int j = 0; j < 4; j++) {card = allCards[i][j];if(card.num != 0){//只要卡片不是空白就需要移动//方法递归if(card.moveTop(allCards,flag)){canMove = true;}}}}return canMove;}//向下private boolean moveCardDown(boolean flag) {boolean canMove = false;Card card;for (int i = 2; i >= 0; i--) {for (int j = 0; j < 4; j++) {card = allCards[i][j];if (card.num != 0) {//只要卡片不是空白就需要移动//方法递归if(card.moveDown(allCards,flag)){canMove = true;}}}}return canMove;}//向左private boolean moveCardLeft(boolean flag) {boolean canMove = false;Card card;for (int i = 0; i < 4 ; i++) {for (int j = 1; j< 4; j++) {card = allCards[i][j];if(card.num != 0){//只要卡片不是空白就需要移动//方法递归if(card.moveLeft(allCards,flag)){canMove = true;}}}}return canMove;}//向右private boolean moveCardRight(boolean flag) {boolean canMove = false;Card card;for (int i = 0; i <4 ; i++) {for (int j = 2; j>=0; j--) {card = allCards[i][j];if(card.num != 0){//只要卡片不是空白就需要移动//方法递归if(card.moveRight(allCards,flag)){canMove = true;}}}}return canMove;}Random rand = new Random();//随机创建一个卡片public void createRandcard(){//1. 数字2和4出现的比例是1:4。所以采用随机出0-4的数字。//2. 随机获取i,j就可以得到卡片的位置。获取card的一个实例对象。如果卡片上数字为0,就可以表示。若不是就递归继续取。int num = 0; //卡片上的数字int index = rand.nextInt(5);if(index == 0||index == 1||index == 2){num = 4;}else{num = 2;}//如果格子满了,则不需要再创建了if (isFull()) {return;}//卡片的位置Card card = getRandomCard();if(card != null) {card.num = num;//设置卡片上的数字}}//判断所有的格子是不是都满了private boolean isFull() {for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {if(allCards[i][j].num == 0){return false;}}}return true;}//卡片的位置  返回卡片对象// 随机获取i,j就可以得到卡片的位置。获取card的一个实例对象。如果卡片上数字为0,就可以表示。若不是就递归继续取。private Card getRandomCard() {int i = rand.nextInt(4);int j = rand.nextInt(4);Card card = allCards[i][j];if(card.num != 0){return getRandomCard();}else{return card;}}@Overridepublic void paint(Graphics g) {super.paint(g);//画卡片drawCard(g);}//绘制卡片private void drawCard(Graphics g) {for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {Card card = allCards[i][j];//矩形Color color = getColor(card.num);Color oldColor = g.getColor();g.setColor(color);//设置新颜色g.fillRect(card.x,card.y,80,80); //画笔默认是黑的//绘制数字if(card.num != 0){g.setColor(new Color(125,78,51));g.setFont(new Font("宋体",Font.BOLD,35));String text = card.num+"";int tx = card.x;if(text.length()==1){tx = tx + 32;}else if(text.length()==2){tx = tx + 20;}else if(text.length()==3){tx = tx + 8;}else{tx = tx - 2;}int ty = card.y+50;g.drawString(text,tx,ty);}g.setColor(oldColor);//还原颜色}}}//获取颜色private Color getColor(int num){Color color = null;switch (num){case 2:color = new Color(242,230,56);break;case 4:color = new Color(55,236,200);break;case 8:color = new Color(174,213,130);break;case 16:color = new Color(142,201,75);break;case 32:color = new Color(111,148,48);break;case 64:color = new Color(76,174,124);break;case 128:color = new Color(60,180,144);break;case 256:color = new Color(45,130,120);break;case 512:color = new Color(9,97,26);break;case 1024:color = new Color(242,177,121);break;case 2048:color = new Color(223,185,0);break;default:color = new Color(92,151,117);break;}return color;}//创建卡片Card[][] allCards = new Card[4][4];public void initCard(){//4*4表格for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {allCards[i][j] = new Card(i,j);}}}}
//卡片类
class Card{int x=0,y=0;//坐标int i =0;//下标iint j =0;//下标jint num = 0;//数字boolean hebing = false;//是否合并过了,如果已经合并过来就不能合并public Card(int i,int j){this.i = i;this.j = j;this.x = 5+j*80+(j+1)*5;this.y = 5+i*80+(i+1)*5;}public boolean moveTop(Card[][] allCards,boolean flag) {if(this.i==0){return false;}//上一个的卡片Card prevCard = allCards[i-1][j];if(prevCard.num == 0){//把数字移动上去if(flag) {prevCard.num = this.num;this.num = 0;prevCard.moveTop(allCards,flag);}return true;}else if(prevCard.num==this.num && !prevCard.hebing){//合并数字if(flag) {prevCard.hebing = true;prevCard.num *= 2;this.num = 0;}return true;}else{return false;}}public boolean moveRight(Card[][] allCards,boolean flag) {if(this.j==3){return false;}//右边的卡片Card rightCard = allCards[i][j+1];if(rightCard.num == 0){//把数字移动上去if(flag) {rightCard.num = this.num;this.num = 0;rightCard.moveRight(allCards,flag);}return true;}else if(rightCard.num==this.num && !rightCard.hebing){//合并数字if(flag) {rightCard.hebing = true;rightCard.num *= 2;this.num = 0;}return true;}else{return false;}}//向下public boolean moveDown(Card[][] allCards,boolean flag) {if(this.i==3){return false;}//下边的卡片Card downCard = allCards[i+1][j];if(downCard.num == 0){//把数字移动上去if(flag) {downCard.num = this.num;this.num = 0;downCard.moveDown(allCards, flag);}return true;}else if(downCard.num==this.num && !downCard.hebing){//合并数字if(flag) {downCard.hebing = true;downCard.num *= 2;this.num = 0;}return true;}else{return false;}}//向左public boolean moveLeft(Card[][] allCards,boolean flag) {if(this.j==0){return false;}//左边的卡片Card leftCard = allCards[i][j-1];if(leftCard.num == 0){//把数字移动上去if(flag) {leftCard.num = this.num;this.num = 0;leftCard.moveLeft(allCards, flag);}return true;}else if(leftCard.num==this.num && !leftCard.hebing){//合并数字if(flag) {leftCard.hebing = true;leftCard.num *= 2;this.num = 0;}return true;}else{return false;}}
}

Java Swing制作2048小游戏【完整版】相关推荐

  1. java2048小游戏源码及解析_200行java代码实现2048小游戏

    本文实例为大家分享了java实现2048小游戏的具体代码,供大家参考,具体内容如下 效果图: 游戏介绍: 1.2048是一款益智类小游戏,刚开始随机出现两个数字,可以上下左右控制数字的移动. 2.当选 ...

  2. 用App Designer 制作2048小游戏

    用App Designer 制作2048小游戏 用App Designer制作的2048,MATLAB版本是2020b.记录下创作思路,以免日后忘记. APP界面设计 APP界面如下,为了好玩,还加入 ...

  3. 基于Java+Swing实现雷电小游戏

    基于Java+Swing实现雷电小游戏 一.系统介绍 二.功能展示 三.其他系统 四.获取源码 一.系统介绍 基于java的雷电游戏基本功能包括:敌方飞机随机飞行.我方飞机手动控制飞行,射击比拼,游戏 ...

  4. java 2048游戏_JAVA2048游戏 本课程设计是基于java语言的2048小游戏设计 联合开发网 - pudn.com...

    JAVA2048游戏 所属分类:游戏 开发工具:Java 文件大小:789KB 下载次数:4 上传日期:2020-11-23 10:57:11 上 传 者:滴滴滴大萌 说明:  本课程设计是基于jav ...

  5. Java课设 2048小游戏

    题目:2048小游戏 目录 1. 引言 2. 主要模块设计 1)游戏面板 2)移动 3)失败 4)新游戏 5)退出 3. 系统实现 1)游戏面板 2)移动 3)失败 4)新游戏 5)退出 4. 结论 ...

  6. 使用Pygame制作2048小游戏

    好久没有写文章了,暑假一直没有怎么学习计算机方面的相关知识,不过倒是坚持背了一个多月的单词红宝书,看了汤神的基础课.真的没想到自己居然也能有毅力背了150多页的单词,还写完了一本正反面的字帖这些事以前 ...

  7. Python小游戏——Pygame制作2048小游戏

    pygame之2048小游戏 初学python,发现看网上的python理论太过枯燥. 哎嘿~~干脆直接弄个小游戏叭,一边学习,一边写代码. 备注: 1.很多地方我尽量注解,方便大家观看. 2.完整代 ...

  8. java.swing 飞机大战小游戏

    上午没事刷到网上最近炒热了一些简单的小游戏和爱心代码,单身8个月了,对爱心代码不是很感冒,所以想蹭个热度,写一个飞机大站来玩玩. 首先,分析小游戏需要那些技术与怎么设计: 窗体,因为是java小游戏, ...

  9. Java Swing 贪吃蛇小游戏

    静态资源参考: 注:实际上没有用到header.png. 工程目录: 源码: package snake;import javax.swing.*; import java.net.URL;/*** ...

最新文章

  1. JDK, JRE和JVM的区别与联系
  2. 未来十年是AI的黄金发展期
  3. php代码审计工具_【学习笔记】PHP代码审计入门:代码审计实例2
  4. [转]如何统计一个浏览者在某页面的停留时间
  5. 第十届蓝桥杯java B组—试题D 数的分解
  6. Java设计模式——装饰者模式
  7. php mongodb
  8. youcans 的 OpenCV 学习课—8.频率域图像滤波(上)
  9. Git笔记(8) 远程仓库的使用
  10. python怎么后撤步_你的后撤步用对了吗? | 后撤步的目的
  11. python图像几何变换_python-opencv 图像几何变换--缩放、平移、旋转
  12. windows ping 端口
  13. 金士顿U盘格式化后不能识别,0字节存储空间
  14. MFC控件内字体大小随控件改变
  15. 【视频目标检测数据集收集】B站、YouTube等各大网站视频下载工具:Annie(现更名为lux)的下载与安装教程
  16. 团队项目--“我爱淘”校园二手书店 NABC分析
  17. 搭建moon服务器,实现zerotier飞速穿透
  18. M70003中型Android平板电脑亦称IPED 13价格ipad的
  19. Commitizen安装注意事项 git cz git: ‘cz‘ is not a git command
  20. matlab如何新建mat文件_matlab中mat文件的生成和读取

热门文章

  1. [Professor麦]并发编程就该这么学(长文预警)
  2. 网课搜答案公众号接口系统
  3. C#语言实例源码系列-鼠标设置
  4. c语言 txt文件数据,怎样用C语言从txt文件中读入数据?
  5. 【管理系统中计算机应用】决策支持系统
  6. unity3d 理解刚体(Rigidbody)和碰撞体(Collider)以及触发器(Is Trigger),边学边更新
  7. flashbuilder4.7 打断点调试flash
  8. 【工具】fis3 - 语法教程(1)之资源嵌入
  9. 2012 windows 端口聚合_掌握 Windows Server 2012 网卡聚合(NIC Teaming)
  10. Vue+Cesium创建项目并加载地图全过程