java.docx
- 文档编号:14786648
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:21
- 大小:81.21KB
java.docx
《java.docx》由会员分享,可在线阅读,更多相关《java.docx(21页珍藏版)》请在冰点文库上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java