Java版2048小游戏

前段时间刚刚学习事件监听器,于是便选择比较经典的[b]2048小游戏[/b]来找一下感觉 :oops: :oops:

[b]实现的大致思路如下:[/b]
[b] 1.先定义一个500*500的窗口,可以在上面把当前分数,最高分,游戏区及开始按钮画出来;[/b]
//初始化game2048游戏界面的方法
public void initUI(){

this.setTitle("2048_PC版");
this.setSize(500, 500);
this.setLocationRelativeTo(null);
this.setResizable(false);
this.setDefaultCloseOperation(3);

FlowLayout fl = new FlowLayout();
this.setLayout(fl);

//Graphics g = this.getGraphics();

//添加当前分数标签
JLabel jl=new JLabel("分数:");
jl.setFont(new Font("黑体",Font.BOLD,24));
jl.setFocusable(false);
this.add(jl);
JTextField jf=new JTextField ();
jf.setFocusable(false);
jf.setPreferredSize(new Dimension(100,30));
//设置文本框大小
jf.setBackground(new Color(230,230,250));
//设置文本框的背景色
jf.setFont(new Font("黑体",Font.BOLD,25));
jf.setBorder(new LineBorder( new Color(230,230,250)));
//设置文本框的边框颜色
jf.setEditable(false);
//文本框不可编辑
this.add(jf);
。。。
this.setVisible(true);
}


[b]
2.在游戏区实现4*4的网格,用来放数字(当然,数字要存在数组中,可以定义不同数字拥有不同的颜色字体大小等);[/b]

//重绘窗体的方法
public void paint(Graphics g){

super.paint(g);//重绘初始化界面 代表调用父类的方法
this.Numbers(g);//绘制数字和格子
this.test();
}

我在这里是把画数字和格子写成了一个方法,然后在重绘方法中调用,如果不用重绘方法的话,当你把窗口拖出屏幕后会发现原来的数字和格子会全部消失了,哈哈,很神奇吧。

//画出数字以及方格的方法
public void Numbers(Graphics g){


g.setColor(java.awt.Color.magenta);
g.drawRoundRect(50,70,400,400,15,15);//画大矩形

//画16个小矩形
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
//g.setColor(java.awt.Color.green);
g.drawRoundRect(57+i*100, 78+j*100, 85, 85, 15, 15);
}
}
//在随机方格放入随机数字(2或4)
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(num[i][j]!=0){
switch( num[i][j] ){
case 2:
g.setColor(new Color(250,250,20));
g.fillRoundRect(57+i*100, 78+j*100, 85, 85, 15, 15);
g.setColor(Color.BLACK);
g.setFont(new Font("宋体",Font.BOLD,46));
g.drawString(num[i][j]+"",54+100*i+32,

74+100*j+60);
break;
case 4:
g.setColor(new Color(240,10,230));
g.fillRoundRect(57+i*100, 78+j*100, 85, 85,

15, 15);
g.setColor(Color.BLACK);
g.setFont(new Font("宋体",Font.BOLD,46));
g.drawString(num[i][j]+"",54+100*i+32,

74+100*j+60);
break;
case 8:
... break;
...
default: break;
}
}}}}
//随机数字结束

为了验证随机的数字与位置是正确的,我在这里添加了一个test()方法,来检查数组里的数字:

//用于检测数组中的数字
public void test(){
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
System.out.println("num["+i+"]"+"["+j+"]"+"="+num[i]

[j]);
}
}
}

运行一下,嗯,数组里的数字和位置与输出是对应的,很好!继续~ :D :D


[b] 3.添加事件监听器,实现开始按钮的功能:点击可以随机两个位置来放两个随机数字(2或4);[/b]
//添加监听器
ButtonListener bl = new ButtonListener(this,num,jf);//通过构造方法传参
bt_start.addActionListener(bl);
this.addKeyListener(bl);

//构造函数对game初始化,g获得画笔对象,等
public ButtonListener(Game2048 game,int num[][],JTextField jf) {
this.game=game;
this.num=num;
this.jf=jf;
// TODO Auto-generated constructor stub
}


4.在监听器中可以通过构造方法把要用到的参数传到监听器类中;然后实现上下左右键的操作算法;

这是左键操作的方法:先向左移动一次数字,然后判断是否有相同的数字可以合并,最后在判断能否左移;

switch(e.getKeyCode()){
case 37: //按左方向键
//System.out.println("左键");
//移动数字
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(num[i][j]!=0){
int c=i-1;
//System.out.println("r="+r);
while(c>-1&&num[c][j]==0){
num[c][j]=num[i][j];
num[i][j]=0;
c--;
count++;
}
}
}
}
//合并数字
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(i+1<4&&num[i][j]==num[i+1][j]){
num[i][j]=num[i][j]+num[i+1][j];
num[i+1][j]=0;
count++;
Score=Score+num[i][j]+num[i+1][j];
jf.setText(""+Score);
}

}
}
//移动数字
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(num[i][j]!=0){
int c=i-1;
//System.out.println("r="+r);
while(c>=0&&num[c][j]==0){
num[c][j]=num[i][j];
num[i][j]=0;
c--;
count++;
}
}
}
}
break;

其他键的实现也是用 移动-合并-移动 的方法,就不一一枚举拉 :D :D


[b]5.最后可以设定分数以及输赢判断等细节。[/b]

该游戏是通过是否出现数字2048为判断标准的,遍历判断一下即可;
至于分数,在上一步中每次合并时累加上即可。


哈哈,2048_1.0版本基本已经成型啦,试着运行一下吧~ :lol:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值