2048是什么? 2048 是一款流行的单人益智游戏,其目标是在网格上滑动编号的图块,合并具有相同数字的图块以达到 2048 及以上。
我该如何玩2048? 您可以使用键盘上的箭头键或在支持触摸的设备上滑动,以四个方向滑动网格上的图块:上、下、左、右。 当两个相同数字的方块碰撞时,它们会合并成一个,并且它们的价值会加倍。 ...
当我到达 2048 时会发生什么? 当您达到 2048 块时,您可以选择继续玩并瞄准更高的数字,或者您可以考虑游戏获胜并开始新游戏。
有赢得2048的策略吗? 虽然没有保证每次都会获胜的策略,但一些技巧包括专注于合并更大的数字,为瓷砖移动创建清晰的路径,以及避免太快填满棋盘。
这就是2048游戏~
话不多说,直接启动,做一个略有简略但五脏俱全的小游戏版本
首先是我们的用户信息
public class UserInfo {
private static int score;
public String name;
public UserInfo(String name) {
this.name = name;
}
public static int getScore() {
return score;
}
public static void setScore(int score) {
UserInfo.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void addScore(int i){
UserInfo.score+=i;
}
}
很好,接下来我们应该摆出我们的胜利条件:
出现2048,然后我们会出现以下提示页面
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class winplay extends JFrame{
public winplay(){
UserInfo.addScore(5000);
JOptionPane.showMessageDialog(null,
"游戏胜利,你的评分已出炉:"+UserInfo.getScore(),
"胜利2048!",
JOptionPane.INFORMATION_MESSAGE);
}
}
接下来是我们的判断失败条件:
没有出现2048且每个方向上都无法移动
其中interplay这个类中包含了一个checkifvary方法,用来判断如果点击上下左右键,页面中方格布局是否会发生改变,如果不变,则移动无效。
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class overplay extends JFrame{
public overplay(){
JOptionPane.showMessageDialog(null,
"游戏结束,你的评分已出炉:"+UserInfo.getScore(),
"结束啦",
JOptionPane.INFORMATION_MESSAGE);
}
public static boolean finditOver(int[][] a){
return (interplay.checkifvary(a,1)
||interplay.checkifvary(a,2)
||interplay.checkifvary(a,3)
||interplay.checkifvary(a,4));
}
}
接下来是我们2048的主干部分,代码如下:
方法:
Ramdom2:随机生成2,如果方格已满,则游戏结束
isFull:判断是否已满
find2048:寻找是否已出现2048
phase1,2,3,4:分别对应上下左右的移动情形
checkifvary:移动是否为有效
public class interplay {
int[][] a={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
public static final int ROW=4;
public static final int COLUMN=4;
public static void Ramdom2(int[][] a){
int count =0;
int[] b=new int[16];
for(int i=0;i<ROW;i++){
for(int j=0;j<COLUMN;j++){
if(a[i][j]==0){
b[count]=i*4+j;
count++;
}
}
}
long l = System.currentTimeMillis();
int random = (int)l%(count);
int therow=b[random]/4;
int thecul=b[random]%4;
a[therow][thecul]=2;
}
public static boolean ifFull(int [][] a){
int num=0;
for(int i=0;i<ROW;i++){
for(int j=0;j<COLUMN;j++){
if(a[i][j]==2048){
return false;
}
if(a[i][j]==0){
num++;
}
}
}
if(num==0){
return false;
}
return true;
}
public static boolean find2048(int[][] a){
for(int i=0;i<ROW;i++){
for(int j=0;j<COLUMN;j++){
if(a[i][j]==2048){
return true;
}
}
}
return false;
}
public static int[][] phase1(int[][] a){
int[][] anew=new int[4][4];
for(int j=0;j<COLUMN;j++){
int[] d=new int[4];
int k=0;
for(int i=0;i<ROW;i++){
if(a[i][j]!=0){
d[k]=a[i][j];
k++;
}
}
for(int i=0;i<ROW-1;i++){
if(d[i]==d[i+1]){
d[i]*=2;
d[i+1]=0;
UserInfo.addScore(d[i]);
}
}
k=0;
for(int i=0;i<ROW;i++){
if(d[i]!=0){
anew[k][j]=d[i];
k++;
}
}
}
return anew;
}
public static int[][] phase2(int[][] a){
int[][] anew=new int[4][4];
for(int j=0;j<COLUMN;j++){
int[] d=new int[4];
int k=0;
for(int i=ROW-1;i>=0;i--){
if(a[i][j]!=0){
d[k]=a[i][j];
k++;
}
}
for(int i=0;i<ROW-1;i++){
if(d[i]==d[i+1]){
d[i]*=2;
d[i+1]=0;
UserInfo.addScore(d[i]);
}
}
k=ROW-1;
for(int i=0;i<ROW;i++){
if(d[i]!=0){
anew[k][j]=d[i];
k--;
}
}
}
return anew;
}
public static int[][] phase3(int[][] a){
int[][] anew=new int[4][4];
for(int i=0;i<ROW;i++){
int[] d=new int[4];
int k=0;
for(int j=0;j<COLUMN;j++){
if(a[i][j]!=0){
d[k]=a[i][j];
k++;
}
}
for(int j=0;j<COLUMN-1;j++){
if(d[j]==d[j+1]){
d[j]*=2;
d[j+1]=0;
UserInfo.addScore(d[i]);
}
}
k=0;
for(int j=0;j<COLUMN;j++){
if(d[j]!=0){
anew[i][k]=d[j];
k++;
}
}
}
return anew;
}
public static int[][] phase4(int[][] a){
int[][] anew=new int[4][4];
for(int i=0;i<ROW;i++){
int[] d=new int[4];
int k=0;
for(int j=COLUMN-1;j>=0;j--){
if(a[i][j]!=0){
d[k]=a[i][j];
k++;
}
}
for(int j=0;j<COLUMN-1;j++){
if(d[j]==d[j+1]){
d[j]*=2;
d[j+1]=0;
UserInfo.addScore(d[i]);
}
}
k=COLUMN-1;
for(int j=0;j<COLUMN;j++){
if(d[j]!=0){
anew[i][k]=d[j];
k--;
}
}
}
return anew;
}
public static boolean checkifvary(int[][] a,int iv){
int[][] b;
if(iv==1){
b=phase1(a);
}else if(iv==2){
b=phase2(a);
}else if(iv==3){
b=phase3(a);
}else{
b=phase4(a);
}
for(int i=0;i<ROW;i++){
for(int j=0;j<COLUMN;j++){
if(a[i][j]!=b[i][j]){
return true;
}
}
}
return false;
}
public static void main(String[] args) {
int[][] a={{2,4,8,16},{0,8,8,0},{16,16,8,0},{16,2,8,32}};
a=phase4(a);
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
System.out.print(a[i][j]+" ");
}
System.out.println();
}
}
}
最后,我们把它录入到JFrame里面,就可以显示啦
给每个按钮添加动作监听,已经查看JLabel里的数字,从而设置数字当前颜色
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class panelplay extends JFrame{
int[][] a0={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
JPanel jPanel=new JPanel();
JLabel[] jl=new JLabel[16];
public panelplay(int a[][]){
Container c=getContentPane();
setTitle("2048 得分:"+UserInfo.getScore());
setBounds(500, 300, 300, 250);
JButton j1=new JButton("㊤");
JButton j2=new JButton("㊦");
JButton j3=new JButton("㊧");
JButton j4=new JButton("㊨");
jPanel=showpanel(a);
j1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int[][] anew=new int[4][4];
if(interplay.checkifvary(a,1)){
UserInfo.addScore(2);
if(interplay.find2048(a)){
new winplay();
System.exit(0);
}
else if(interplay.ifFull(a)){
anew=interplay.phase1(a);
interplay.Ramdom2(anew);
jPanel=showpanel(anew);
dispose();
}else if(overplay.finditOver(a)){
anew=interplay.phase1(a);
jPanel=showpanel(anew);
dispose();
}else{
new overplay();
System.exit(0);
}
new panelplay(anew);
}else{
}
}
});
j2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int[][] anew=new int[4][4];
if(interplay.checkifvary(a, 2)){
UserInfo.addScore(2);
if(interplay.find2048(a)){
new winplay();
System.exit(0);
}
else if(interplay.ifFull(a)){
anew=interplay.phase2(a);
interplay.Ramdom2(anew);
jPanel=showpanel(anew);
dispose();
}else if(overplay.finditOver(a)){
anew=interplay.phase2(a);
jPanel=showpanel(anew);
dispose();
}else{
new overplay();
System.exit(0);
}
new panelplay(anew);
}else{
}
}
});
j3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int[][] anew=new int[4][4];
if(interplay.checkifvary(a, 3)){
UserInfo.addScore(2);
if(interplay.find2048(a)){
new winplay();
System.exit(0);
}
else if(interplay.ifFull(a)){
anew=interplay.phase3(a);
interplay.Ramdom2(anew);
jPanel=showpanel(anew);
dispose();
}else if(overplay.finditOver(a)){
anew=interplay.phase3(a);
jPanel=showpanel(anew);
dispose();
}else{
new overplay();
System.exit(0);
}
new panelplay(anew);
}else{
}
}
});
j4.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int[][] anew=new int[4][4];
if(!overplay.finditOver(a)){
new overplay();
System.exit(0);
}
else if(interplay.checkifvary(a, 4)){
UserInfo.addScore(2);
if(interplay.find2048(a)){
new winplay();
System.exit(0);
}
anew=interplay.phase4(a);
interplay.Ramdom2(anew);
jPanel=showpanel(anew);
dispose();
new panelplay(anew);
}else{
}
}
});
c.add(jPanel,BorderLayout.CENTER);
c.add(j1,BorderLayout.NORTH);
c.add(j2,BorderLayout.SOUTH);
c.add(j3,BorderLayout.WEST);
c.add(j4,BorderLayout.EAST);
setVisible(true);
}
public JPanel showpanel(int[][] a){
jPanel.setLayout(new GridLayout(4,4));
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
String s=" "+a[i][j];
jl[i*4+j]=new JLabel(s);
}
}
for(int i=0;i<16;i++){
if(jl[i].getText().equals(" 0")){
jl[i].setForeground(Color.WHITE);
}
else if(jl[i].getText().equals(" 2")){
jl[i].setForeground(Color.GRAY);
}
else if(jl[i].getText().equals(" 4")){
jl[i].setForeground(Color.GRAY);
}
else if(jl[i].getText().equals(" 8")){
jl[i].setForeground(Color.DARK_GRAY);
}
else if(jl[i].getText().equals(" 16")){
jl[i].setForeground(Color.BLACK);
}
else if(jl[i].getText().equals(" 32")){
jl[i].setForeground(Color.BLACK);
}
else if(jl[i].getText().equals(" 64")){
jl[i].setForeground(Color.BLUE);
}
else if(jl[i].getText().equals(" 128")){
jl[i].setForeground(Color.MAGENTA);
}
else if(jl[i].getText().equals(" 256")){
jl[i].setForeground(Color.RED);
}
else if(jl[i].getText().equals(" 512")){
jl[i].setForeground(Color.ORANGE);
}
else if(jl[i].getText().equals(" 1024")){
jl[i].setForeground(Color.YELLOW);
}
else if(jl[i].getText().equals(" 2048")){
jl[i].setForeground(Color.PINK);
}else{
jl[i].setForeground(Color.BLACK);
}
jPanel.add(jl[i]);
}
return jPanel;
}
public static void main(String[] args) {
UserInfo.setScore(0);
int[][] a={{2,4,8,16},{16,8,4,128},{32,256,1024,0},{2,16,512,32}};
int[][] a0={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
interplay.Ramdom2(a0);
new panelplay(a0);
}
}
最后生成的运行结果图:(当时还没加颜色,这是我唯一一次2048成功图)
当然这个是可以做出一个排行榜的,下次我会附上用MySQL做的排行榜的代码
挺有意思 ~