1、窗口化
2、2048游戏可正常运行
3、可以显示分数
4、直接处于src下
5、因为此程序涉及数据库,修改了点,把有关数据库的内容进行了删除或者注释
//主函数
public class userPlay {
public static void main(String[] args) {//主函数
//游戏窗口
new initWindow();
}
}
//游戏窗口
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import java.util.Timer;
import javax.swing.*;
public class initWindow extends JFrame implements ActionListener , KeyListener {
//游戏结束之后输入名字
JTextField name=new JTextField();
boolean isExists;//是否开始了
JButton restart=new JButton("重新开始");
JButton confirm=new JButton("确定");
//方格数目为 number*number
static int number=4;
int Number[][]=new int[number][number];//定义一个四行四列的数字数组
int localx[][]=new int[number][number];//x位置
int localy[][]=new int[number][number];//y位置
int oldNumber[][]=new int[number][number];//之前的
public initWindow() {//构造方法
init();//初始化
setSize(800, 800);//窗口大小
setVisible(true);//显示窗口可见
setResizable(false);//不可扩大
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//点击右上角直接关闭程序
setTitle("2048小游戏");//设置标题
this.addKeyListener(this);//添加键盘事件
this.setFocusable(true);//获取焦点
validate();
}
public void init(){
setLayout(null);//布局
add(name);//加入布局---加入这个窗口中
add(confirm);//加入布局
add(restart);
restart.setBounds(300,675,200,50);//设置位置和大小
restart.addActionListener(this);//添加事件
restart.setFont(new Font("华文楷体",1,30));//设置字体大小和样式
restart.setBackground(Color.GREEN);//设置背景颜色
//存储文字显示的位置
for (int i = 0; i < number; i++) {
for (int j = 0; j < number; j++) {
localx[j][i]=100+150*i+65;
localy[j][i]=50+150*j+75;
}
}
//初始随机数字 里面的是随机数字的数字
rollNum(2);//刚开始的时候是出现两个数字,之后每次运动后随机出一个数字
common();//把旧的复制为新的---为了让新随机出现的数字和以前数字隔离出来
isExists=true;//游戏开始
}
public void paint(Graphics g) {
super.paint(g);//如果没有这个,图像不会重新绘制
if(!isExists){//游戏结束
name.setBounds(200, 500, 200, 50);
name.setFont(new Font("华文行楷",1,30));
g.setFont(new Font("华文楷体", 1, 50));
g.setColor(Color.black);
g.setFont(new Font("华文楷体", 1, 30));
g.drawString("输入你的昵称(确定之后不可更改):",200 ,500 );
//设置按钮大小
confirm.setBounds(400,500,100,50);
//统计分数----窗口上出现的所有数字之和
int fs=0;
for (int i = 0; i < number; i++) {
for (int j = 0; j < number; j++) {
fs+=Number[i][j];
}
}
//点击确定之后
String finalFs = String.valueOf(fs);//把分数转为字符形式
confirm.addActionListener(new ActionListener() {//确定名字之后执行
@Override
public void actionPerformed(ActionEvent e) {
//下面的为数据库操作
/* String sql=null;
if(name.getText().equals("")){
JOptionPane.showMessageDialog(null, "名字都补数!",
"",JOptionPane.PLAIN_MESSAGE);
return;
}
sql="insert into game_2048 values('"+name.getText()+"','"+finalFs+"')";
if(gamedatabase.Insertdata(sql))
JOptionPane.showMessageDialog(null, "存储成功!",
"",JOptionPane.PLAIN_MESSAGE);
else
JOptionPane.showMessageDialog(null, "存储失败!",
"",JOptionPane.PLAIN_MESSAGE);
}
*/
});
===============================================================
g.setFont(new Font("华文楷体", 1, 50));
g.setColor(Color.RED);
g.drawString("你的分数为:"+finalFs ,200 ,300 );
}
else {
Graphics2D g2 = (Graphics2D) g; //g是Graphics对象
g2.setStroke(new BasicStroke(10.0f));//设置线条宽度
g2.setColor(new Color(255, 245, 170));//设置字体颜色
for (int i = 0; i < number + 1; i++) {//用线条画出图形面板
g2.drawLine(100 + 150 * i, 50, 100 + 150 * i, 50 + 600);
g2.drawLine(100, 50 + 150 * i, 100 + 600, 50 + 150 * i);
}
g.setFont(new Font("华文楷体", 1, 30));
g.setColor(Color.BLUE);
for (int i = 0; i < number; i++) {//把所有的数字显示出来
for (int j = 0; j < number; j++) {
if (Number[i][j] == 0) {//为空的话
//覆盖掉数字
g.drawString(" ", localx[i][j], localy[i][j]);
} else {
//显示数字
if (oldNumber[i][j] != Number[i][j]) {
g.setColor(Color.red);
g.setFont(new Font("华文楷体", 3, 40));
g.drawString(String.valueOf(Number[i][j]), localx[i][j], localy[i][j]);
g.setColor(Color.blue);
g.setFont(new Font("华文楷体", 1, 30));
} else {
g.drawString(String.valueOf(Number[i][j]), localx[i][j], localy[i][j]);
}
}
}
}
}
}
/*
* 开始随机出现数字*/
public void rollNum( int num){
int k=0;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if(Number[i][j]==0){
++k;
}
}
}
if(k==0){
isExists=false;//结束
//弹出框提示
JOptionPane.showMessageDialog(this, "要加油啊!",
"你失败了",JOptionPane.PLAIN_MESSAGE);
return;
}
Random random = new Random();
for (int i = 0; i < num;) {
int x = random.nextInt(4);//从0-3中随机选择
int y = random.nextInt(4);
if(Number[x][y]==0){//等于空的时候---- 这个位置上没有数字
if(random.nextInt(2)==0){//随机数字为2 or 4
Number[x][y] = 2;
}
else{
Number[x][y] = 4;
}
i++;
}
}
}
@Override
public void actionPerformed(ActionEvent e) {
dispose(); //关掉窗口
new initWindow();//重新打开一个
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
//上下左右---1-4
int keyCode = e.getKeyCode();
if(isExists) {//游戏进行中
if (keyCode == KeyEvent.VK_UP) {//上
go(1);
}
if (keyCode == KeyEvent.VK_DOWN) {//下
go(2);
}
if (keyCode == KeyEvent.VK_LEFT) {//左
go(3);
}
if (keyCode == KeyEvent.VK_RIGHT) {右箭头
go(4);
}
}
}
@Override
public void keyReleased(KeyEvent e) {
}
/*
* 移动位置*/
public void go(int num){
//上下左右---1-4
int sz[]=new int[4];//设置一个一维数组
if(num==1){
for(int i=0;i<4;++i){
//移动前
for (int j = number -1 ; j >=0 ; j--) {
sz[number - j - 1]=Number[j][i];//把需要移动的方格按照移动方向存进数组
//如:一维数组每次移动都是从左到右
//所以按了上箭头之后,移动便是从下到上,依次从上到下复制到从左到有
}
for (int j = 0; j < 4; j++) {
}
//移动中
goes(sz);
//移动后
for (int j = number -1 ; j >=0 ; j--) {//移动好的复制回去
Number[j][i]=sz[number - j - 1];
}
}
}else if(num==2){
for(int i=0;i<4;++i){
//移动前
for (int j = 0; j < 4; j++) {
sz[j]=Number[j][i];
}
//移动中
goes(sz);
//移动后
for (int j = 0; j < 4; j++) {
Number[j][i]=sz[j];
}
}
}else if(num==3){
for (int i = 0; i < 4; i++) {
for (int j = number-1; j >=0 ; j--) {
sz[number - j - 1]=Number[i][j];
}
goes(sz);;
for (int j = number-1; j >=0 ; j--) {
Number[i][j]= sz[number - j - 1];
}
}
}else{
for(int i=0;i<4;++i){
//移动前
for (int j = 0; j < 4; j++) {
sz[j]=Number[i][j];
}
//移动中
goes(sz);;
//移动后
for (int j = 0; j < 4; j++) {
Number[i][j]=sz[j];
}
}
}
//旧的等于新的
common();
//每次移动完出现新的数字
rollNum(1);//出现一个
repaint();//重画
}
//每次都是左边到右边
public void goes(int sz[]) {
int goNum = number - 1;
boolean ising = false;
for (int i = number - 2; i >= 0; i--) {
if(sz[i]!=0){
if(sz[goNum]!=0){
//相等即相加
if(sz[goNum]==sz[i] && ising==false){
sz[goNum]+=sz[i];
sz[i]=0;
ising=true;
}
else
{
goNum--;
if(goNum!=i) {
sz[goNum] = sz[i];
sz[i] = 0;
}
ising=false;
}
}
else{
if(goNum!=i) {
sz[goNum] += sz[i];
sz[i] = 0;
}
}
}
}
}
public void common(){
for (int i = 0; i < number; i++) {
for (int j = 0; j < number; j++) {
oldNumber[i][j]=Number[i][j];
}
}
}
}