无聊写了个2048

import java.awt.Color;
import java.awt.Font;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;

/**
 * 修复了一些bug 加入了判断输赢的功能
 * 
 * @author Administrator
 * 
 */
public class Game1_2 {

	private JFrame jf = null;
	private JPanel contentPane = null;
	private int[][] num = new int[4][4];
	private JLabel[][] labels = new JLabel[4][4];
	private Random r = new Random();

	boolean flag = false;
	boolean isWin = false;

	public static void main(String[] args) {
		new Game1_2().go();
	}

	public void go() {
		jf = new JFrame("2048小游戏");
		jf.setResizable(false);
		init();
		initNum();
		jf.setVisible(true);
		jf.addKeyListener(new MyKeyListener());
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		/**
		 * 开启一个线程用来判断用户的输赢的
		 */
		new Thread(new Runnable() {

			@Override
			public void run() {
				while (true) {
					int length = num.length;
					while (!isWin) {
						int count = 0;
						for (int i = 0; i < length; i++) {
							for (int j = 0; j < length - 1; j++) {
								if (num[i][j] != num[i][j + 1]
										&& num[i][j] != 0 && num[i][j + 1] != 0) {
									count++;
								}
							}
						}
						for (int i = 0; i < length; i++) {
							for (int j = 0; j < length - 1; j++) {
								if (num[j][i] != num[j + 1][i]
										&& num[j][i] != 0 && num[j + 1][i] != 0) {
									count++;
								}
							}
						}
						for (int i = 0; i < length; i++) {
							for (int j = 0; j < length - 1; j++) {
								if (num[j][i] == 2048) {
									JOptionPane.showMessageDialog(jf, "你是王者!");
									isWin = true;
								}
							}
						}
						if (count == 24) {
							JOptionPane.showMessageDialog(jf, "没关系,再来一次");
							isWin = true;
						}
					}
				}
			}
		}).start();
	}

	/**
	 * 初始化JLabel
	 */
	public void initNum() {
		for (int i = 0; i < labels.length; i++) {
			for (int j = 0; j < labels[i].length; j++) {
				if (num[i][j] != 0) {
					labels[i][j].setText(num[i][j] + "");
					if (num[i][j] == 2) {
						labels[i][j].setBackground(new Color(255, 255, 0));
					} else if (num[i][j] == 4) {
						labels[i][j].setBackground(new Color(223, 159, 0));
					} else if (num[i][j] == 8) {
						labels[i][j].setBackground(new Color(231, 69, 8));
					} else if (num[i][j] == 16) {
						labels[i][j].setBackground(new Color(102, 118, 151));
					} else if (num[i][j] == 32) {
						labels[i][j].setBackground(new Color(43, 68, 235));
					} else if (num[i][j] == 64) {
						labels[i][j].setBackground(new Color(255, 0, 255));
					} else if (num[i][j] == 128) {
						labels[i][j].setBackground(new Color(255, 80, 6));
					} else if (num[i][j] == 256) {
						labels[i][j].setBackground(new Color(6, 219, 0));
					} else if (num[i][j] == 512) {
						labels[i][j].setBackground(new Color(205, 254, 104));
					} else if (num[i][j] == 1024) {
						labels[i][j].setBackground(new Color(165, 165, 165));
					} else if (num[i][j] == 2048) {
						labels[i][j].setBackground(new Color(232, 192, 58));
					} else if (num[i][j] == 4096) {
						labels[i][j].setBackground(new Color(255, 80, 6));
					}
				} else {
					labels[i][j].setText("");
					labels[i][j].setBackground(new Color(255, 255, 255));
				}
			}
		}
	}

	/**
	 * 初始化界面
	 */
	public void init() {
		num[r.nextInt(4)][r.nextInt(4)] = 2;
		for (int i = 0; i < labels.length; i++) {
			for (int j = 0; j < labels[i].length; j++) {
				labels[i][j] = new JLabel();
			}
		}

		JMenu menu = new JMenu("重新开始");
		menu.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				// TODO Auto-generated method stub
				for (int i = 0; i < num.length; i++) {
					for (int j = 0; j < num[i].length; j++) {
						num[i][j] = 0;
					}
				}
				num[r.nextInt(4)][r.nextInt(4)] = 2;
				initNum();
				isWin = false;
			}
		});

		JMenu help = new JMenu("帮助");
		help.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				// TODO Auto-generated method stub
				JOptionPane.showMessageDialog(jf, "用键盘上的:↑ ← → ↓ 来控制移动。");
			}
		});
		JMenu about = new JMenu("关于");
		about.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				// TODO Auto-generated method stub
				JOptionPane.showMessageDialog(jf, "制作:吴庆龙\nQQ:1554165134");
			}
		});

		JMenuBar bar = new JMenuBar();
		bar.add(menu);
		bar.add(help);
		bar.add(about);

		jf.setJMenuBar(bar);

		jf.setFont(null);
		jf.setBounds(100, 100, 368, 410);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		jf.setContentPane(contentPane);
		contentPane.setLayout(null);

		labels[0][0] = new JLabel();
		labels[0][0].setOpaque(true);
		labels[0][0].setFont(new Font("宋体", Font.PLAIN, 40));
		labels[0][0].setHorizontalAlignment(SwingConstants.CENTER);
		labels[0][0].setBounds(0, 0, 85, 85);
		contentPane.add(labels[0][0]);

		labels[0][1] = new JLabel();
		labels[0][1].setFont(new Font("宋体", Font.PLAIN, 40));
		labels[0][1].setOpaque(true);
		labels[0][1].setHorizontalAlignment(SwingConstants.CENTER);
		labels[0][1].setBounds(90, 0, 85, 85);
		contentPane.add(labels[0][1]);

		labels[0][2] = new JLabel();
		labels[0][2].setFont(new Font("宋体", Font.PLAIN, 40));
		labels[0][2].setOpaque(true);
		labels[0][2].setHorizontalAlignment(SwingConstants.CENTER);
		labels[0][2].setBounds(180, 0, 85, 85);
		contentPane.add(labels[0][2]);

		labels[0][3] = new JLabel();
		labels[0][3].setFont(new Font("宋体", Font.PLAIN, 40));
		labels[0][3].setOpaque(true);
		labels[0][3].setHorizontalAlignment(SwingConstants.CENTER);
		labels[0][3].setBounds(270, 0, 85, 85);
		contentPane.add(labels[0][3]);

		labels[1][0] = new JLabel();
		labels[1][0].setFont(new Font("宋体", Font.PLAIN, 40));
		labels[1][0].setOpaque(true);
		labels[1][0].setHorizontalAlignment(SwingConstants.CENTER);
		labels[1][0].setBounds(0, 90, 85, 85);
		contentPane.add(labels[1][0]);

		labels[1][1] = new JLabel();
		labels[1][1].setFont(new Font("宋体", Font.PLAIN, 40));
		labels[1][1].setOpaque(true);
		labels[1][1].setHorizontalAlignment(SwingConstants.CENTER);
		labels[1][1].setBounds(90, 90, 85, 85);
		contentPane.add(labels[1][1]);

		labels[1][2] = new JLabel();
		labels[1][2].setFont(new Font("宋体", Font.PLAIN, 40));
		labels[1][2].setOpaque(true);
		labels[1][2].setHorizontalAlignment(SwingConstants.CENTER);
		labels[1][2].setBounds(180, 90, 85, 85);
		contentPane.add(labels[1][2]);

		labels[1][3] = new JLabel();
		labels[1][3].setFont(new Font("宋体", Font.PLAIN, 40));
		labels[1][3].setOpaque(true);
		labels[1][3].setHorizontalAlignment(SwingConstants.CENTER);
		labels[1][3].setBounds(270, 90, 85, 85);
		contentPane.add(labels[1][3]);

		labels[2][0] = new JLabel();
		labels[2][0].setFont(new Font("宋体", Font.PLAIN, 40));
		labels[2][0].setOpaque(true);
		labels[2][0].setHorizontalAlignment(SwingConstants.CENTER);
		labels[2][0].setBounds(0, 180, 85, 85);
		contentPane.add(labels[2][0]);

		labels[2][1] = new JLabel();
		labels[2][1].setFont(new Font("宋体", Font.PLAIN, 40));
		labels[2][1].setOpaque(true);
		labels[2][1].setHorizontalAlignment(SwingConstants.CENTER);
		labels[2][1].setBounds(90, 180, 85, 85);
		contentPane.add(labels[2][1]);

		labels[2][2] = new JLabel();
		labels[2][2].setFont(new Font("宋体", Font.PLAIN, 40));
		labels[2][2].setOpaque(true);
		labels[2][2].setHorizontalAlignment(SwingConstants.CENTER);
		labels[2][2].setBounds(180, 180, 85, 85);
		contentPane.add(labels[2][2]);

		labels[2][3] = new JLabel();
		labels[2][3].setFont(new Font("宋体", Font.PLAIN, 40));
		labels[2][3].setOpaque(true);
		labels[2][3].setHorizontalAlignment(SwingConstants.CENTER);
		labels[2][3].setBounds(270, 180, 85, 85);
		contentPane.add(labels[2][3]);

		labels[3][0] = new JLabel();
		labels[3][0].setFont(new Font("宋体", Font.PLAIN, 40));
		labels[3][0].setOpaque(true);
		labels[3][0].setHorizontalAlignment(SwingConstants.CENTER);
		labels[3][0].setBounds(0, 270, 85, 85);
		contentPane.add(labels[3][0]);

		labels[3][1] = new JLabel();
		labels[3][1].setFont(new Font("宋体", Font.PLAIN, 40));
		labels[3][1].setOpaque(true);
		labels[3][1].setHorizontalAlignment(SwingConstants.CENTER);
		labels[3][1].setBounds(90, 270, 85, 85);
		contentPane.add(labels[3][1]);

		labels[3][2] = new JLabel();
		labels[3][2].setFont(new Font("宋体", Font.PLAIN, 40));
		labels[3][2].setOpaque(true);
		labels[3][2].setHorizontalAlignment(SwingConstants.CENTER);
		labels[3][2].setBounds(180, 270, 85, 85);
		contentPane.add(labels[3][2]);

		labels[3][3] = new JLabel();
		labels[3][3].setFont(new Font("宋体", Font.PLAIN, 40));
		labels[3][3].setOpaque(true);
		labels[3][3].setHorizontalAlignment(SwingConstants.CENTER);
		labels[3][3].setBounds(270, 270, 85, 85);
		contentPane.add(labels[3][3]);

	}

	/**
	 * 随机产生2或者4
	 */
	public void randomNum() {
		while (true) {
			int i = r.nextInt(4);
			int j = r.nextInt(4);
			int k = r.nextInt(2);
			if (k == 1) {
				if (num[i][j] == 0) {
					num[i][j] = 4;
					break;
				}
			}
			if (k == 0) {
				if (num[i][j] == 0) {
					num[i][j] = 2;
					break;
				}
			}
		}
	}

	/**
	 * 键盘监听器
	 * 
	 * @author Administrator
	 * 
	 */
	class MyKeyListener implements KeyListener {

		@Override
		public void keyTyped(KeyEvent e) {
		}

		@Override
		public void keyPressed(KeyEvent e) {
			if (e.getKeyCode() == KeyEvent.VK_UP) {
				// [0][0] [0][1] [0][2] [0][3]
				// [1][0] [1][1] [1][2] [1][3]
				// [2][0] [2][1] [2][2] [2][3]
				// [3][0] [3][1] [3][2] [3][3]
				int length = num.length;
				for (int i = 0; i < length; i++) {
					for (int j = 0; j < length - 1; j++) {
						// 中间有一个 0
						if (num[j][i] == 0) {
							for (int j2 = j + 1; j2 < length - 1; j2++) {
								if (num[j2][i] != 0) {
									num[j][i] = num[j2][i];
									num[j2][i] = 0;
									flag = true;
									break;
								}
							}
						}
					}
				}
				for (int i = 0; i < length; i++) {
					if (num[3][i] != 0) {
						for (int j2 = 0; j2 < length; j2++) {
							if (num[j2][i] == 0) {
								num[j2][i] = num[3][i];
								num[3][i] = 0;
								flag = true;
							}
						}

					}
				}
				for (int i = 0; i < length; i++) {
					for (int j = 0; j < length - 1; j++) {
						// 中间没有 0
						if (num[j][i] == num[j + 1][i] && num[j][i] != 0) {
							num[j][i] *= 2;
							for (int j2 = j + 1; j2 < length - 1; j2++) {
								num[j2][i] = num[j2 + 1][i];
							}
							num[3][i] = 0;
							flag = true;
						}
					}
				}
				if (flag) {
					randomNum();
					initNum();
					flag = false;
				}
			} else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
				int length = num.length;
				for (int i = length - 1; i >= 0; i--) {
					for (int j = length - 1; j >= 0; j--) {
						// 中间有一个 0
						if (num[j][i] == 0) {
							for (int j2 = j - 1; j2 > 0; j2--) {
								if (num[j2][i] != 0) {
									num[j][i] = num[j2][i];
									num[j2][i] = 0;
									flag = true;
									break;
								}
							}
						}
					}
				}
				for (int i = length - 1; i >= 0; i--) {
					if (num[0][i] != 0) {
						for (int j2 = length - 1; j2 > 0; j2--) {
							if (num[j2][i] == 0) {
								num[j2][i] = num[0][i];
								num[0][i] = 0;
								flag = true;
							}
						}
					}
				}

				for (int i = length - 1; i >= 0; i--) {
					for (int j = length - 1; j > 0; j--) {
						// 中间没有 0
						if (num[j][i] == num[j - 1][i] && num[j][i] != 0) {
							num[j][i] *= 2;
							for (int j2 = j - 1; j2 > 0; j2--) {
								num[j2][i] = num[j2 - 1][i];
							}
							num[0][i] = 0;
							flag = true;
						}
					}
				}
				if (flag) {
					randomNum();
					initNum();
					flag = false;
				}
			} else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
				int length = num.length;
				for (int i = 0; i < length; i++) {
					for (int j = 0; j < length - 1; j++) {
						// 中间有一个 0
						if (num[i][j] == 0) {
							for (int j2 = j + 1; j2 < length - 1; j2++) {
								if (num[i][j2] != 0) {
									num[i][j] = num[i][j2];
									num[i][j2] = 0;
									flag = true;
									break;
								}
							}
						}
					}
				}
				for (int i = 0; i < length; i++) {
					if (num[i][3] != 0) {
						for (int j2 = 0; j2 < length - 1; j2++) {
							if (num[i][j2] == 0) {
								num[i][j2] = num[i][3];
								num[i][3] = 0;
								flag = true;
							}
						}

					}
				}

				for (int i = 0; i < length; i++) {
					for (int j = 0; j < length - 1; j++) {
						// 中间已经没有 0 了
						if (num[i][j] == num[i][j + 1] && num[i][j] != 0) {
							num[i][j] *= 2;
							for (int j2 = j + 1; j2 < length - 1; j2++) {
								num[i][j2] = num[i][j2 + 1];
							}
							num[i][3] = 0;
							flag = true;
						}
					}
				}
				if (flag) {
					randomNum();
					initNum();
					flag = false;
				}
			} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
				int length = num.length;
				for (int i = 3; i >= 0; i--) {
					for (int j = 3; j > 0; j--) {
						// 中间有一个 0
						if (num[i][j] == 0) {
							for (int j2 = j - 1; j2 > 0; j2--) {
								if (num[i][j2] != 0) {
									num[i][j] = num[i][j2];
									num[i][j2] = 0;
									flag = true;
									break;
								}
							}
						}
					}
				}
				for (int i = 3; i >= 0; i--) {
					if (num[i][0] != 0) {
						for (int j2 = length - 1; j2 > 0; j2--) {
							if (num[i][j2] == 0) {
								num[i][j2] = num[i][0];
								num[i][0] = 0;
								flag = true;
							}
						}

					}
				}

				for (int i = length - 1; i >= 0; i--) {
					for (int j = length - 1; j > 0; j--) {
						// 中间已经没有 0 了
						if (num[i][j] == num[i][j - 1] && num[i][j] != 0) {
							num[i][j] *= 2;
							for (int j2 = j - 1; j2 > 0; j2--) {
								num[i][j2] = num[i][j2 - 1];
							}
							num[i][0] = 0;
							flag = true;
						}
					}
				}
				if (flag) {
					randomNum();
					initNum();
					flag = false;
				}
			}
		}

		@Override
		public void keyReleased(KeyEvent e) {

		}

	}

}

无聊写了个2048

时间: 2024-10-09 14:46:33

无聊写了个2048的相关文章

学习java窗口基本操作时无聊写的

学习java窗口基本操作时无聊写的 就当记录 代码如下: package day08; import java.awt.BorderLayout;import java.awt.Color;import java.awt.FlowLayout;import java.awt.Font;import java.awt.GridLayout; import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;

用控制台写类窗体2048小游戏

原文地址:用控制台写类窗体2048小游戏作者:余文 2048是一个很简单的小游戏,这是我自己实现的一个版本. 这个版本有两个特色 这是一个高仿窗体程序的控制台程序. 通过使用指针将四个方向的移动简化成了一个方向的移动. 当初刚出来2048小游戏的时候,玩的不亦乐乎.之后根据游戏规则自己花了一下午时间用控制台写了一个玩,没有参考源码. 当时只实现了游戏的移动逻辑和胜负判定逻辑,界面很简单,但已经可以玩玩了. 这是当初刚写完发空间说说得瑟的时候. 今年5月有段时候比较闲,对程序做了较大更新. 实时显

空闲时间用C语言写了下2048游戏

本身这个游戏逻辑挺简单的,所以,不多说了,直接上代码吧 #include <climits> #include <cstdio> #include <cstring> #include <stack> #include <string> #include <map> #include <vector> #include <cmath> using namespace std; const int MAXX =

初学cocos2dx 写了个2048 跟大家一起分享下

首先是头文件 部分代码是借鉴加修改  大部分是自己写的. class HelloWorld : public cocos2d::CCLayer { public: virtual bool init(); static cocos2d::CCScene* scene(); void menuCloseCallback(CCObject* pSender); CREATE_FUNC(HelloWorld); //以上为自动生成的代码 bool doUp(); //实现上下左右移动功能 bool d

js+css 写出 简单2048游戏

新手写的,可能不是很完善,欢迎修改及探讨 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>2048游戏</title> 6 <style> 7 .container{ 8 width: 600px; 9 height: 600px; 10 border: 2px solid

下班无聊写个矩阵小算法,c#

今天是我正式成为程序员的第十天,也正式开始我的职业生涯,刚来公司要学的东西好多,既要掌握公司的框架(话说公司的框架真是太牛逼了,我真的是服了),还要学习EXT,Linq等等,对未来我是充满的希望,我希望我能成一个牛逼的系统架构师,希望通过写博客来记录我走过的每一步路,记录我的成长. 毕竟工作的时间太短了,也没什么可写的,就写两个矩阵相乘的算法吧,来开启我的博客之旅. 下面是实现的代码(是在控制台里实现的 1 public class Program 2 { 3 4 static void Mai

今天难得有空写了一下2048这个游戏,源码已经发上了,不喜勿碰.

#include<iostream> #include<cstdlib> #include<cstdio> #include<map> #include<string> using namespace std; map<int,string>zdy; long long sum; int x,y,dt[5][5],fx,cl[5],zsjs,djs,dx; bool bh=false; char d,dj[10]={}; int cx

出差周末加班无聊写点什么

来到河南的项目现场已有一个半月了,简单的说说这段时间的所见所感. 河南,在中国被黑的最惨的地方,没有之一.一直因为素质不高而被诟病,网上黑河南的段子随处可见,近年来少了不少,我觉得是国人素质普遍的提高了,黑河南的那批人老了,没精力了,这是个好现象. 从扬州出发,用流量看视频,出省后,忘了区分全国和省内流量导致手机欠费(10086被我屏蔽了,所以没有看到流量使用通知).还好找了临床的一位河南妹子帮忙充话费,然后微信还给了她(然而妹子并不漂亮,微信的存在没有什么用).这是我对河南的第一次接触----

无聊写了一个最简单的MVC4+Highcharts连数据库例子

乱搞了个数据库 后面发现没定INT类型 直接将ID当数据显示了 效果图: 前端 1 @{ 2 Layout = null; 3 } 4 5 <!DOCTYPE html> 6 7 <html> 8 <head> 9 <meta name="viewport" content="width=device-width" /> 10 11 <script src="~/Scripts/jquery-1.7.1