当前位置: 移动技术网 > IT编程>开发语言>Java > Java完美实现2048小游戏

Java完美实现2048小游戏

2019年07月22日  | 移动技术网IT编程  | 我要评论

完美地模仿了2048游戏,是根据网友的一个2048改的。

block.java

import javax.swing.*;
import java.awt.*;
public class block extends jlabel 
{
  private int value;
  public block() 
  {
    value = 0;//初始化值为0
    setfont(new font("font", font.plain, 40));//设定字体
    setbackground(color.gray);//设定初始颜色为灰色
  }
 
  public int getvalue()//获取值
  {
    return value;
  }
 
  public void setvalue(int value)
  {
    this.value = value;
    string text = string.valueof(value);
    if (value != 0)
      settext(text);
    else
      settext("");//如果值为0则不显示
    setcolor();
  }
 
  public void setcolor() //根据值的不同设定不同的背景颜色、label字体
  {
    switch (value) 
      {
    case 0:
      setbackground(color.gray);
      break;
    case 2:
      setbackground(new color(238, 228, 218));
      break;
    case 4:
      setbackground(new color(238, 224, 198));
      break;
    case 8:
      setbackground(new color(243, 177, 116));
      break;
    case 16:
      setbackground(new color(243, 177, 116));
      break;
    case 32:
      setbackground(new color(248, 149, 90));
      break;
    case 64:
      setbackground(new color(249, 94, 50));
      break;
    case 128:
      setbackground(new color(239, 207, 108));
      break;
    case 256:
      setbackground(new color(239, 207, 99));
      break;
    case 512:
      setbackground(new color(239, 203, 82));
      break;
    case 1024:
      setbackground(new color(239, 199, 57));
      break;
    case 2048:
      setbackground(new color(239, 195, 41));
      break;
    case 4096:
      setbackground(new color(255, 60, 57));
      break;
      }
  }
}

my2048.java

import java.awt.*;
import javax.swing.*;
public class my2048 extends jframe 
{ 
  public my2048()//构造函数 
  {
    settitle("2048");//设置标题
    setsize(400, 400);//设定窗口大小
    setlocation(500, 200);//设定窗口起始位置
    setdefaultcloseoperation(jframe.exit_on_close);
    getcontentpane().setlayout(new gridlayout(4, 4, 5, 5));//设定布局方式为gridlayout型
    new operation(this);
    this.setvisible(true);//设为可视
  }
 
  public static void main(string args[]) //程序入口点
  {
    try
    {
      uimanager.setlookandfeel("org.jvnet.substance.skin.substanceravengraphitelookandfeel");//设定ui
    } //接受抛出的异常
    catch (classnotfoundexception | instantiationexception| illegalaccessexception | unsupportedlookandfeelexception e)
    {
      e.printstacktrace();
    }
    jframe.setdefaultlookandfeeldecorated(true);//设定frame的缺省外观
    new my2048();
  }
 
}

operation.java

import java.awt.event.*;
import javax.swing.*;
public class operation implements keylistener
{
  block[] block;//用于储存16个数据
  jpanel panel;
  public boolean up,down,left,right;
  int moveflag;//用于累计移动的次数
  boolean numflag;//用于判断是否还能加入新的数字
  public operation(jframe frame) 
  {
    this.panel = (jpanel)frame.getcontentpane();//构造出panel
    block = new block[16];//构造出长度为16的数组
    numflag = true;//初始化
    moveflag = 0;
    up=true;down=true;left=true;right=true;
    addblock();
    for (int i = 0; i < 2; i++)
      appearblock();
    frame.addkeylistener(this);
  }
 
  private void addblock() 
  {
    for (int i = 0; i < 16; i++) //往panel里加入block
    {
      block[i] = new block();
      block[i].sethorizontalalignment(jlabel.center);// 不透明的标签
      block[i].setopaque(true);
      panel.add(block[i]);  
    }
  } 
  public void appearblock() 
  {
    while (numflag) //当还能加入随机的一个新的值得时候
    {
      int index = (int) (math.random() * 16);//取一个0到15的随机整数,这个数作为随机加入盘中的2或4的位置
      if (block[index].getvalue() == 0)//如果这个数所在的block数组中值为0,即在为空的时候,加入一个2或4的数字
      {
        if (math.random() < 0.5)
        {
          block[index].setvalue(2);
        }
        else
        {
          block[index].setvalue(4);
        }
        break;//跳出while
      }
    }
  }
 
  public void judgeappear() //统计block数组中是否含有值为0的元素,若没有,则numflag变为false
  {
    int sum = 0;
    for (int i = 0; i < 16; i++) 
    {
      if (block[i].getvalue() != 0)
      {
        sum++;
      }
    }
    if (sum == 16)
      numflag = false;
 
  }
 
  public int find(int i,int j,int a,int b)
  {
    while(i<b&&i>=a)
    {
       if(block[i].getvalue()!=0)
       {
        return i;
       }
       i=i+j;
    }
    return -1;
  }
  public void upblock()
  {
    int i=0,j=0;int t=0;int valuej=0;int valuei=0;int index=0;
    for(i=0;i<4;i++)
    {
      index=i;
      for(j=i+4;j<16;j+=4)
      {  
        valuej=0; valuei=0;
        if(block[index].getvalue()==0)
        {
          t=find(index,4,0,16);
          if(t!=-1)
          {
            block[index].setvalue(block[t].getvalue());
            block[t].setvalue(0);
          }
          else
          {
            break;
          }
        }
        valuei=block[index].getvalue();
        if(block[j].getvalue()==0)
        {
          t=find(j,4,0,16);
          if(t!=-1)
          {
            block[j].setvalue(block[t].getvalue());
            block[t].setvalue(0);
          }
          else
          {
            break;
          }
        }
        valuej=block[j].getvalue();
        if(valuei==valuej&&valuei!=0&&valuej!=0)
        {
          block[index].setvalue(valuei+valuej);
          block[j].setvalue(0);
          numflag = true;
        }
        index=j;
      }
       
    }
  }
  public void downblock() {
 
    int i=0,j=0;int t=0;int valuej=0;int valuei=0;int index=0;
    for(i=12;i<16;i++)
    {
      index=i;
      for(j=i-4;j>=0;j-=4)
      {  
        valuej=0; valuei=0;
        if(block[index].getvalue()==0)
        {
          t=find(index,-4,0,16);
          if(t!=-1)
          {
            block[index].setvalue(block[t].getvalue());
            block[t].setvalue(0);
          }
          else
          {
            break;
          }
        }
        valuei=block[index].getvalue();
        if(block[j].getvalue()==0)
        {
          t=find(j,-4,0,16);
          if(t!=-1)
          {
            block[j].setvalue(block[t].getvalue());
            block[t].setvalue(0);
          }
          else
          {
            break;
          }
        }
        valuej=block[j].getvalue();
        if(valuei==valuej&&valuei!=0&&valuej!=0)
        {
          block[index].setvalue(valuei+valuej);
          block[j].setvalue(0);
          numflag = true;
        }
        index=j;
      }
       
    }
  }
  public void rightblock() 
  {
    int i=0,j=0;int t=0;int valuej=0;int valuei=0;int index=0;
    for(i=3;i<16;i+=4)
    {
      index=i;
      for(j=i-1;j>i-4;j--)
      {  
        valuej=0; valuei=0;
        if(block[index].getvalue()==0)
        {
          t=find(index,-1,i-3,index+1);
          if(t!=-1)
          {
            block[index].setvalue(block[t].getvalue());
            block[t].setvalue(0);
          }
          else
          {
            break;
          }
        }
        valuei=block[index].getvalue();
        if(block[j].getvalue()==0)
        {
          t=find(j,-1,i-3,j+1);
          if(t!=-1)
          {
            block[j].setvalue(block[t].getvalue());
            block[t].setvalue(0);
          }
          else
          {
            break;
          }
        }
        valuej=block[j].getvalue();
        if(valuei==valuej&&valuei!=0&&valuej!=0)
        {
          block[index].setvalue(valuei+valuej);
          block[j].setvalue(0);
          numflag = true;
        }
        index=j;
      }
       
    }
  }
  public void leftblock() 
  {
    int i=0,j=0;int t=0;int valuej=0;int valuei=0;int index=0;
    for(i=0;i<16;i+=4)
    {
      index=i;
      for(j=i+1;j<i+4;j++)
      {  
        valuej=0; valuei=0;
        if(block[index].getvalue()==0)
        {
          t=find(index,1,index,i+4);
          if(t!=-1)
          {
            block[index].setvalue(block[t].getvalue());
            block[t].setvalue(0);
          }
          else
          {
            break;
          }
        }
        valuei=block[index].getvalue();
        if(block[j].getvalue()==0)
        {
          t=find(j,1,j,i+4);
          if(t!=-1)
          {
            block[j].setvalue(block[t].getvalue());
            block[t].setvalue(0);
          }
          else
          {
            break;
          }
        }
        valuej=block[j].getvalue();
        if(valuei==valuej&&valuei!=0&&valuej!=0)
        {
          block[index].setvalue(valuei+valuej);
          block[j].setvalue(0);
          numflag = true;
        }
        index=j;
      }
       
    }
  }
  public void over() 
  {
    if (numflag ==false&& up==false&&down==false&&left==false&&right==false) //当不能添加元素,并且不可移动的步数超过36就输了,输了的时候在盘中央显示gameover
    {
      block[4].settext("g");
      block[5].settext("a");
      block[6].settext("m");
      block[7].settext("e");
      block[8].settext("o");
      block[9].settext("v");
      block[10].settext("e");
      block[11].settext("r"); 
      block[11].addmouselistener(new mouseadapter() {public void mousepressed(mouseevent e){restart();}});
    }
  }
   
  public void win() //同over
  { 
    block[0].settext("y");
    block[1].settext("o");
    block[2].settext("u");
    block[13].settext("w");
    block[14].settext("i");
    block[15].settext("n");
    block[15].addmouselistener(new mouseadapter() {
      public void mousepressed(mouseevent e) {
        restart();
      }
    });
  }
  public void restart()//重启游戏,和构造函数类似,不在累述
  {
    numflag=true;
    moveflag=0;
    up=true;down=true;left=true;right=true;
    for(int i=0;i<16;i++)
      block[i].setvalue(0);
    for (int i = 0; i < 2; i++)
      appearblock();
  }
  public void keypressed(keyevent e) //判断按的上下左右键,并依次调用移动函数、判断函数、添加函数、判断是否输掉的函数
  {
    switch (e.getkeycode()) {
    case keyevent.vk_up:
      if(up){
      upblock();}
      judgeappear();
      appearblock();
      over();
       
      if(numflag==false)
      {
        up=false;
      }
      else
      {
        up=true;down=true;left=true;right=true;
      }
      break;
    case keyevent.vk_down:
      if(down){
      downblock();}
      judgeappear();
      appearblock();
      over();
      if(numflag==false)
      {
        down=false;
      }
      else
      {
        up=true;down=true;left=true;right=true;
      }
      break;
    case keyevent.vk_left:
      if(left){
      leftblock();}
      judgeappear();
      appearblock();
      over();
       
      if(numflag==false)
      {
        left=false;
      }
      else
      {
        up=true;down=true;left=true;right=true;
      }
      break;
    case keyevent.vk_right:
      if(right){
      rightblock();}
      judgeappear();
      appearblock();
      over();
       
      if(numflag==false)
      {
        right=false;
      }
      else
      {
        up=true;down=true;left=true;right=true;
      }
      break;
    }
 
  }
  public void keytyped(keyevent e) {
 
  }
  public void keyreleased(keyevent e) {
 
  }
 
}

以上所述就是本文给大家分享的关于java完美实现2048小游戏的全部代码了,希望对大家学习java能够有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网