java.docx

上传人:b****1 文档编号:14786648 上传时间:2023-06-27 格式:DOCX 页数:21 大小:81.21KB
下载 相关 举报
java.docx_第1页
第1页 / 共21页
java.docx_第2页
第2页 / 共21页
java.docx_第3页
第3页 / 共21页
java.docx_第4页
第4页 / 共21页
java.docx_第5页
第5页 / 共21页
java.docx_第6页
第6页 / 共21页
java.docx_第7页
第7页 / 共21页
java.docx_第8页
第8页 / 共21页
java.docx_第9页
第9页 / 共21页
java.docx_第10页
第10页 / 共21页
java.docx_第11页
第11页 / 共21页
java.docx_第12页
第12页 / 共21页
java.docx_第13页
第13页 / 共21页
java.docx_第14页
第14页 / 共21页
java.docx_第15页
第15页 / 共21页
java.docx_第16页
第16页 / 共21页
java.docx_第17页
第17页 / 共21页
java.docx_第18页
第18页 / 共21页
java.docx_第19页
第19页 / 共21页
java.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

java.docx

《java.docx》由会员分享,可在线阅读,更多相关《java.docx(21页珍藏版)》请在冰点文库上搜索。

java.docx

java

 

JAVA程序课程实训报告

 

题目:

学号:

姓名:

班级:

2048小游戏

(一)程序介绍2048是一款益智小游戏,玩家需要在16个格子中通过数字叠加的方法将最初的数字2凑成数字2048。

有16个格子,初始时会有两个格子上安放了两个数字2,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,系统也会在空白的地方随即出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。

 2048是比较流行的一款数字游戏。

本课程设计通过设计与开发JVM平台上的2048游戏,进一步掌握所学Java课程的知识,体验Java的跨平台性,同时将Java设计方面的知识拓展应用 

(二)功能需求描述 

1、图形用户界面:

2048的最大特点就是玩家对图形界面里的数字进行操作,也就是是玩家与游戏的互动 

2、当前分数SCORE与最高分数的显示:

在我们设计的2048游戏中当前分数取了页面内所有数字相加的值为分数,对玩家玩游戏的进展有直接性、客观性的展现;同时,最高分数取了以往玩家退出游戏时所保存分数的最高分 

3、数字颜色:

游戏中数字的颜色以2为首项的等比数列变化,即2、4、8、16、32、64、128、256、512、1024、2048.......对应的数字卡片变色 

4、游戏的退出:

游戏退出时,我们采用弹出对话框的确认玩家是否真的要退出游戏,当然这样做更符合游戏人性化设计的观念。

 

(三)玩法技巧:

1、最大数尽可能放在角落。

2、数字按顺序紧邻排列。

3、首先满足最大数和次大数在的那一列/行是满的。

4、时刻注意活动较大数旁边要有相近的数。

5、以大数所在的一行为主要移动方向

6、不要急于“清理桌面”

(四)程序说明

一个类Copy2048继承JFrame,类中包括,一个构造方法Copy2048,构造方法中设定游戏界面的大小,背景颜色,边框,字体,标签,布局,位置,记录剩余空方块数目,记录分数,用于判断游戏是否失败,用于判断游戏是否失败,设置字体类型和大小,为最高分标签添加按键监听器,一个KeyEvent按键事件,构造方法中创建游戏主面板,设置主面板位置尺寸,设置空布局,创建文本框二维数组,创建标签,调用时间处理方法,一个Create2方法,是在随机位置产生一个2号方块的方法,l1到l4同时被键盘赋值为1说明任何方向键都不能产生新的数字2,那就说明游戏失败GAME OVER!

一个setColor方法,是为了产生2048小游戏方块的颜色。

(五)程序结构

1.重新开始,若是初次运行游戏,则从文件中读入最高分

voidrestart()

2.控制方法

publicvoidkeyPressed(KeyEvente)

3.绘图方法

publicvoidpaint(Graphicsg)

4.判断是否已经失败,若失败则返回true,否则返回false

publicbooleanjudgeFail()

5.向下滑动,若各列均没有方块相消或移动,则返回false,否则返回true;

publicvoidmoveDown()

6.向左滑动,若各行均没有方块相消或移动,则返回false,否则返回true;

publicvoidmoveLeft()

7.向右滑动,若各行均没有方块相消或移动,则返回false,否则返回true;

publicvoidmoveRight()

8.向上滑动,若各行均没有方块相消或移动,则返回false,否则返回true;

PublicvoidmoveUp()

9.在游戏区空闲处随机生成2

publicvoidgenerateRandom2()

(六)游戏截图

(七)程序代码

importjava.awt.Color;

importjava.awt.EventQueue;

importjava.awt.BorderLayout;

importjava.awt.FlowLayout;

importjava.awt.Font;

importjava.awt.event.*;

importjava.util.Random;

importjavax.swing.BorderFactory;

importjavax.swing.Icon;

importjavax.swing.ImageIcon;

importjavax.swing.JFrame;

importjavax.swing.JLabel;

importjavax.swing.JPanel;

importjavax.swing.SwingConstants;

importjavax.swing.border.*;

importjavax.swing.JTextField;

publicclassCopy2048extendsJFrame{

privateJPanelscoresPane;

privateJPanelmainPane;

privateJLabellabelMaxScores;

privateJLabellabelScores;

privateJLabeltips;//提示操作标签

privateJTextFieldtextMaxScores;

privateJLabeltextScores;

privateJLabel[][]texts;

privateIconicon2;

privateinttimes=16;//记录剩余空方块数目

privateintscores=0;//记录分数

privateintl1,l2,l3,l4,l5;//用于判断游戏是否失败

Fontfont=newFont("",Font.BOLD,14);//设置字体类型和大小

Fontfont2=newFont("",Font.BOLD,30);//设置字体类型和大小

Randomrandom=newRandom();//随机类实例化

publicstaticvoidmain(String[]args){

EventQueue.invokeLater(newRunnable(){

publicvoidrun(){

try{

Copy2048frame=newCopy2048();

frame.setVisible(true);

}

catch(Exceptione1){

e1.printStackTrace();

}

}

});

}

/**

*构造方法

*/

publicCopy2048(){

super();

setResizable(false);//禁止调整窗体大小

getContentPane().setLayout(null);//设置空布局

setBounds(500,50,500,615);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setTitle("2048PC版");//设置窗体标题

scoresPane=newJPanel();//创建分数显示面板

scoresPane.setBackground(Color.green);//设置分数显示面板的背景色

scoresPane.setBounds(20,20,460,40);

scoresPane.setBorder(BorderFactory.createMatteBorder(2,2,2,2,Color.YELLOW));//设置得分面板的边框

getContentPane().add(scoresPane);//将得分面板添加到窗体

scoresPane.setLayout(null);//设置面板空布局

labelMaxScores=newJLabel("最高分:

");//最高分标签

labelMaxScores.setFont(font);//设置字体类型和大小

labelMaxScores.setBounds(10,5,50,30);//设置最懂啊分标签的位置尺寸

scoresPane.add(labelMaxScores);//将最高分标签添加到得分容器中

textMaxScores=newJTextField("");//得分标签

textMaxScores.setBounds(60,5,150,30);

textMaxScores.setFont(font);

textMaxScores.setEditable(false);

scoresPane.add(textMaxScores);//将得分标签添加到分数面板中

labelScores=newJLabel("得分:

");

labelScores.setFont(font);//设置字体类型和大小

labelScores.setBounds(240,5,50,30);

scoresPane.add(labelScores);

textScores=newJLabel(String.valueOf(scores));

textScores.setFont(font);

textScores.setBounds(290,5,150,30);

scoresPane.add(textScores);

mainPane=newJPanel();//创建游戏主面板

mainPane.setBounds(20,70,460,500);//设置主面板位置尺寸

this.getContentPane().add(mainPane);

mainPane.setLayout(null);//设置空布局

texts=newJLabel[4][4];//创建文本框二维数组

for(inti=0;i<4;i++){//遍历数组

for(intj=0;j<4;j++){

texts[i][j]=newJLabel();//创建标签

texts[i][j].setFont(font2);

texts[i][j].setHorizontalAlignment(SwingConstants.CENTER);

texts[i][j].setText("");

texts[i][j].setBounds(120*j,120*i,100,100);//设置方块的大小位置

setColor(i,j,"");

texts[i][j].setOpaque(true);

texts[i][j].setBorder(BorderFactory.createMatteBorder(2,2,2,2,Color.green));//设置方块边框颜色

mainPane.add(texts[i][j]);//将创建的文本框放在

}

}

tips=newJLabel("Tips:

使用上、下、左、右键或者W、S、A、D键控制");

tips.setFont(font);

tips.setBounds(60,480,400,20);

mainPane.add(tips);

textMaxScores.addKeyListener(newKeyAdapter(){//为最高分标签添加按键监听器

publicvoidkeyPressed(KeyEvente){

do_label_keyPressed(e);//调用时间处理方法

}

});

Create2();

Create2();

}

/**

*按键输入事件的处理方法

*@parame

*/

protectedvoiddo_label_keyPressed(finalKeyEvente){

intcode=e.getKeyCode();//获取按键代码

inta;//a的引入是为了防止连加的情况出现

Stringstr;

Stringstr1;

intnum;

switch(code){

caseKeyEvent.VK_LEFT:

caseKeyEvent.VK_A:

//如果按键代码是左方向键或者A键

for(inti=0;i<4;i++){

a=5;

for(intk=0;k<3;k++){

for(intj=1;j<4;j++){//遍历16个方块

str=texts[i][j].getText();//获取当前方块标签文本字符

str1=texts[i][j-1].getText();//获取当前左1方块标签文本字符

if(pareTo("")==0){//如果左1方块文本为空字符

texts[i][j-1].setText(str);//字符左移

setColor(i,j-1,str);

texts[i][j].setText("");//当前方块字符置空

setColor(i,j,"");

}elseif((pareTo(str1)==0)&&(j!

=a)&&(j!

=a-1)){//如果当前方块和左1方块文本字符相等

num=Integer.parseInt(str);

scores+=num;

times++;

str=String.valueOf(2*num);

texts[i][j-1].setText(str);//左1方块文本字符变为两方块之和

setColor(i,j-1,str);

texts[i][j].setText("");//当前方块字符置空

setColor(i,j,"");

a=j;

}

}

}

}

l1=1;//用于判断游戏是否失败

Create2();

break;

caseKeyEvent.VK_RIGHT:

caseKeyEvent.VK_D:

for(inti=0;i<4;i++){

a=5;

for(intk=0;k<3;k++){

for(intj=2;j>=0;j--){

str=texts[i][j].getText();

str1=texts[i][j+1].getText();

if(pareTo("")==0){

texts[i][j+1].setText(str);

setColor(i,j+1,str);

texts[i][j].setText("");

setColor(i,j,"");

}

elseif(pareTo(str1)==0&&j!

=a&&j!

=a+1){

num=Integer.parseInt(str);

scores+=num;

times++;

str=String.valueOf(2*num);

texts[i][j+1].setText(str);

setColor(i,j+1,str);

texts[i][j].setText("");

setColor(i,j,"");

a=j;

}

}

}

}

l2=1;

Create2();

break;

caseKeyEvent.VK_UP:

caseKeyEvent.VK_W:

for(intj=0;j<4;j++){

a=5;

for(intk=0;k<3;k++){

for(inti=1;i<4;i++){

str=texts[i][j].getText();

str1=texts[i-1][j].getText();

if(pareTo("")==0){

texts[i-1][j].setText(str);

setColor(i-1,j,str);

texts[i][j].setText("");

setColor(i,j,"");

}

elseif(pareTo(str1)==0&&i!

=a&&i!

=a-1){

num=Integer.parseInt(str);

scores+=num;

times++;

str=String.valueOf(2*num);

texts[i-1][j].setText(str);

setColor(i-1,j,str);

texts[i][j].setText("");

setColor(i,j,"");

a=i;

}

}

}

}

l3=1;

Create2();

break;

caseKeyEvent.VK_DOWN:

caseKeyEvent.VK_S:

for(intj=0;j<4;j++){

a=5;

for(intk=0;k<5;k++){

for(inti=2;i>=0;i--){

str=texts[i][j].getText();

str1=texts[i+1][j].getText();

if(pareTo("")==0){

texts[i+1][j].setText(str);

setColor(i+1,j,str);

texts[i][j].setText("");

setColor(i,j,"");

}

elseif(pareTo(str1)==0&&i!

=a&&i!

=a+1){

num=Integer.parseInt(str);

scores+=num;

times++;

str=String.valueOf(2*num);

texts[i+1][j].setText(str);

setColor(i+1,j,str);

texts[i][j].setText("");

setColor(i,j,"");

a=i;

}

}

}

}

l4=1;

Create2();

break;

default:

break;

}

textScores.setText(String.valueOf(scores));

}

/**

*在随机位置产生一个2号方块的方法

*@parami,j

*/

publicvoidCreate2(){

inti,j;

booleanr=false;

Stringstr;

if(times>0){

while(!

r){

i=random.nextInt(4);

j=random.nextInt(4);

str=texts[i][j].getText();

if((pareTo("")==0)){

texts[i][j].setIcon(icon2);

texts[i][j].setText("2");

setColor(i,j,"2");

times--;

r=true;

l1=l2=l3=l4=0;

}

}

}

elseif(l1>0&&l2>0&&l3>0&&l4>0){//l1到l4同时被键盘赋值为1说明任何方向键都不能产生新的数字2,说明游戏失败

tips.setText("GAME OVER!

");

}

}

/**

*设置标签颜色

*@parami,j,str

*/

publicvoidsetColor(inti,intj,Stringstr){

if(str=="2")

texts[i][j].setBackground(Color.yellow);

elseif(str=="4")

texts[i][j].setBackground(Color.red);

elseif(st

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2