版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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,构造方法
2
中设定游戏界面的大小,背景颜色,边框,字体,标签,布局,位置,记录剩余空
方块数目,记录分数,用于判断游戏是否失败,用于判断游戏是否失败,设置字
体类型和大小,为最高分标签添加按键监听器,一个KcyEvcnt按键事件,构造方
法中创建游戏主面板,设置主面板位置尺寸,设置空布局,创建文本框二维数组,
创建标签,调用时间处理方法,一个Create2方法,是在随机位置产生一个2号方
块的方法,II到14同时被键盘赋值为1说明任何方向键都不能产生新的数字2,那
就说明游戏失败GAMEOVER!一个selColor方法,是为了产生2048小游戏
方块的颜色。
(五)程序结构
1.重新开始,若是初次运行游戏,则从文件中读入最高分
voidrestart()
2.控制方法
publicvoidkcyPrcsscd(KcyEvcntc)
3.绘图方法
publicvoidpaint(Graphicsg)
4.判断是否已经失败,若失败则返回true,否则返回false
publicbooleanjudgeFail()
5.向下滑动,若各列均没有方块相消或移动,则返回false,否则返回irue;
publicvoidmoveDown()
6.向左滑动,若各行均没有方块相消或移动,则返回false,否则返回true:
publicvoidmoveLeft()
7.向右滑动,若各行均没有方块相消或移动,则返回false,否则返回true;
publicvoidmovcRight()
8.向上滑动,若各行均没有方块相消或移动,则返回fake,否则返回true;
PublicvoidmoveUpO
9.在游戏区空闲处随机生成2
publicvoidgenerateRandom2()
(六)游戏截图
3
2nAHPU版口冈
8
4
(七)程序代码
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{
5
privateJPanelscoresPane;
privateJPanelmainPane;
privateJLabellabelMaxScores;
privateJLabellabelScores;
privateJLabeltips;〃提示操作标签
privateJTextFieldtextMaxScores;
privateJLabeltextScores;
privateJLab©l[][]texts;
privateIconicon2;
privateinttimes=16;〃记录剩余空方块数目
privateintscores=0;〃记录分数
privateint11,12,13,14,15;〃用于判断游戏是否失败
Fontfont=newFontC",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();
6
setResizable(false);〃禁止调整窗体大小
getContentPane().setLayout(null);〃设置空布局
setBounds(500,50,500,615);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("2048PC®");〃设置窗体标题
scoresPane=newJPanel();〃创建分数显示面板
scoresPane.s©tBackground(Color.gr©Gn);〃设置分数显示面板的
背景色
scoresPane.setBounds(20,20,460,40);
scoresPane.setBorder(BorderFactory.createl\/atteBorder(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);
7
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]0]=newJLabel();〃创建标签
texts[i][j].setFont(font2);
texts[i][j].setHorizontalAlignment(SwingConstants.CENTER);
texts[i]0].setText("M);
texts[i]U].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);
8
mainPane.add(tips);
textMaxScores.addKeyListener(newKeyAdapter(){〃为最
高分标签添加按键监听器
publicvoidkeyPressed(KeyEvente){
doJabeLkeyPressed(e);〃调用时间处理方法
)
});
Create2();
Create2();
)
*按键输入事件的处理方法
*@parame
7
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方块
9
标签文本字符
if(pareTo(u")==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.parselnt(str);
scores+=num;
times++;
str=String.valueOf(2*num);
texts[i][j-1].setText(str);〃左1方块文本字符变为
两方块之和
setColor(i,j-1,str);
texts[i]D].setText(,n,);//当前方块字符
置空
setColor(i,j,
a=j;
)
11=1;〃用丁•判断游戏是否失败
Create2();
break;
caseKeyEvent.VKRIGHT:
caseKeyEvent.VKD:
for(inti=0;i<4;i++){
a=5;
for(intk=0;k<3;k++){
io
for(intj=2;j>=0;j-){
str=texts[i][j].getText();
str1=texts[i][j+1].getText();
if(str1.compareTo("")==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.parselnt(str);
scores+=num;
times++;
str=String.valueOf(2*num);
texts[i][j+1].setText(str);
setColor(i,j+1,str);
texts[i]O]setText(M");
setColor(i,j,
a=j;
)
)
)
)
I2=1;
Create2();
break;
caseKeyEvent.VKJJP:
caseKeyEvent.VKW:
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();
ii
str1=texts[i-1]0].getText();
if(pareTo(u")==0){
texts[i-1]0].setText(str);
setColor(i-1,j,str);
texts[i]O].setText(M");
setColor(i,j,
)
elseif(pareTo(str1)==0&&i!=a&&i!=a-1){
num=Integer.parselnt(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;
)
)
)
)
13=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();
12
if(pareTo("")==0){
texts[i+1]0].setText(str);
setColor(i+1,j,str);
texts[i][j].setText("");
setColor(i,j,
)
elseif(pareTo(str1)==0&&i!=a&&i!=a+1){
num=lnt©ger.parsGlnt(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;
)
)
)
)
I4=1;
Create2();
break;
default:
break;
)
textScores.setText(String.valueOf(scores));
)
*在随机位置产生一个2号方块的方法
*@parami,j
7
publicvoidCreate2(){
13
inti,j;
booleanr=false;
Stringstr;
if(times>O){
while(!r){
i=random.nextlnt(4);
j=random.nextlnt(4);
str=texts[i][j].getText();
if((pareTo("")==O)){
texts[i][j].setlcon(icon2);
texts[i]0].setText("2");
setColor(i,j,"2");
times
r=true;
11=12=13=14=0;
)
)
}
elseif(l1>0&aI2>0&aI3>0&&I4>0){//I1到I4同时被键盘赋值
为1说明任何方向键都不能产生新的数字2,说明游戏失败
tips.setText(MGAMEOVER!
");
)
)
*设置标签颜色
*@parami,j,str
7
publicvoidsetColor(inti,intj,Stringstr){
14
if(str=="2")
texts[i][j].setBackground(Color.yellow);
elseif(str=="4")
texts[i][j].setBackground(Color.red);
elseif(str=="8")
texts[i][j].setBackground(Color.pink);
elseif(str=="16")
t©xts[i][j].setBackground(Color.orange);
elseif(str=="32")
texts[i][j].setBackground(Color.magenta);
elseif(str=="64")
texts[i][j].setBackground(Color.LIGHT_GRAY);
elseif(str=="128")
texts[i][j].setBackground(Color.green);
elseif(str=="256")
texts[i][j].setBackground(Color.gray);
elseif(str=="512")
texts[i][j].setBackground(Color.DARKGRAY);
elseif(str=="1024H)
texts[i][j].setBackground(Color.cyan);
elseif(str=="2048")
texts[i][j].setBackground(Color.blue);
elseif(str=="4096")
texts[i][j].setBackground(Color.white);
)
)
GUI——加法计算器
15
(一)加法计算器:是通过键盘输入加数却被加数,执行Run按钮,
显示和在Thesumis上,如若重新输入数执行的话,点击Restart按钮
(-)程序截图
(三)程序代码
importjava.awt.event.*;
importjava.awt.*;
importjavax.swing.*;
publicclassSum_CalculationextendsJFrameimplementsActionListener
{Containercp;
JTextFieldtextl;JTextFieldtext2;JTextFieldanswertext;
JLabelIb1;JLabelIb2;JLabelIo3;
JButtonbt1;
JButtonbt2;
Sum_Calculation(){
cp=getContentPane();
textl=newJTextField(IO);
text2=newJTextField(10);
answertext=newJTextField(IO);
Ib1=newJLabel("Pleaseinputthefirstnumber");
Ib2=newJLabel("Pleaseinputthesecondnumber");
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026河南漯河市召陵区公益性岗位招聘5人考试备考试题及答案解析
- 2006云南昆明晋宁产业园区管理委员会招聘编外人员3人考试参考题库及答案解析
- 2026年合肥市园上园小学喻岗分校教师招聘考试备考题库及答案解析
- 2026广西来宾市忻城县职业技术学校城镇公益性岗位人员招聘1人考试参考试题及答案解析
- 2026山东烟台市教育局直属单位、学校第二批面向社会招聘教师、教研员18人考试备考试题及答案解析
- 2025江西九江市寻阳实业集团有限公司招聘延期考试备考试题及答案解析
- 2026上海烟草集团嘉定烟草糖酒有限公司应届生招聘1人考试参考试题及答案解析
- 2026浙江嘉兴幸福嘉保安服务有限公司招聘1人考试参考题库及答案解析
- 2026天津市粮食储备有限公司面向社会公开招聘考试备考题库及答案解析
- 2026勐海县公安局警务辅助人员招聘(12人)笔试模拟试题及答案解析
- 食品居间合同协议
- 2022学年上海复旦附中高一(上)期末信息技术试题及答案
- 励志类的美文欣赏范文(4篇)
- 广东省广州市白云区2024-2025学年六年级(上)期末语文试卷(有答案)
- 心内科护理带教工作总结
- 知行合一实践出真知主题班会
- GB/T 45166-2024无损检测红外热成像检测总则
- 山东省菏泽市东明县2024-2025学年七年级上学期考试生物试题
- 北京市海淀区2023-2024学年六年级上学期语文期末试卷(含答案)
- 2024集装箱储能系统测试大纲
- 保温班组安全晨会(班前会)
评论
0/150
提交评论