版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
JAVA程序課程實訓報告
題目:
學號:
姓名:
班級:
2048小游戲
(-)程序介紹2048是一款益智小游戲,玩家需要在16個格子中通過數字
疊加的方法將最初的數字2湊成數字2048。有16個格子,初始時會有兩個格子
上安放了兩個數字2,每次可以選擇上下左右其中一個方向去滑動,每滑動一次,
所有的數字方塊都會往滑動的方向靠攏外,系統也會在空臼的地方隨即出現一
個數字方塊,相同數字的方塊在靠攏、相撞時會相加。2048是比較流行的一款
數字游戲。本課程設計通過設計與開發(fā)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
中設定游戲界面的大小,背景顏色,邊框,字體,標簽,布局,位置,記錄剩余空
方塊數目,記錄分數,用于判斷游戲是否失敗,用于判斷游戲是否失敗,設置字
體類型和大小,為最高分標簽添加按鍵監(jiān)聽器,一個KcyEvcnt按鍵事件,構造方
法中創(chuàng)建游戲主面板,設置主面板位置尺寸,設置空布局,創(chuàng)建文本框二維數組,
創(chuàng)建標簽,調用時間處理方法,一個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.在游戲區(qū)空閑處隨機生成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();〃創(chuàng)建分數顯示面板
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();〃創(chuàng)建游戲主面板
mainPane.setBounds(20,70,460,500);〃設置一七面板位汽尺寸
this.getContentPane().add(mainPane);
mainPane.setLayout(null);〃設置空布局
texts=newJLabel[4][4];〃創(chuàng)建文本框二維數組
for(inti=0;i<4;i++){〃遍歷數組
for(intj=0;j<4;j++){
texts[i]0]=newJLabel();〃創(chuàng)建標簽
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]);〃將創(chuàng)建的
文本框放在
)
tips=newJLabel;"Tips:使用上、下、左、右鍵或者W、S、A.D鍵控制
tips.setFont(font);
tips.setBounds(60,480,400,20);
8
mainPane.add(tips);
textMaxScores.addKeyListener(newKeyAdapter(){〃為最
高分標簽添加按鍵監(jiān)聽器
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方塊文本字符變?yōu)?/p>
兩方塊之和
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
(一)加法計算器:是通過鍵盤輸入加數卻被加數,執(zhí)行Run按鈕,
顯示和在Thesumis上,如若重新輸入數執(zhí)行的話,點擊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. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026河南漯河市召陵區(qū)公益性崗位招聘5人考試備考試題及答案解析
- 2006云南昆明晉寧產業(yè)園區(qū)管理委員會招聘編外人員3人考試參考題庫及答案解析
- 2026年合肥市園上園小學喻崗分校教師招聘考試備考題庫及答案解析
- 2026廣西來賓市忻城縣職業(yè)技術學校城鎮(zhèn)公益性崗位人員招聘1人考試參考試題及答案解析
- 2026山東煙臺市教育局直屬單位、學校第二批面向社會招聘教師、教研員18人考試備考試題及答案解析
- 2025江西九江市尋陽實業(yè)集團有限公司招聘延期考試備考試題及答案解析
- 2026上海煙草集團嘉定煙草糖酒有限公司應屆生招聘1人考試參考試題及答案解析
- 2026浙江嘉興幸福嘉保安服務有限公司招聘1人考試參考題庫及答案解析
- 2026天津市糧食儲備有限公司面向社會公開招聘考試備考題庫及答案解析
- 2026勐海縣公安局警務輔助人員招聘(12人)筆試模擬試題及答案解析
- 食品居間合同協議
- 2022學年上海復旦附中高一(上)期末信息技術試題及答案
- 勵志類的美文欣賞范文(4篇)
- 廣東省廣州市白云區(qū)2024-2025學年六年級(上)期末語文試卷(有答案)
- 心內科護理帶教工作總結
- 知行合一實踐出真知主題班會
- GB/T 45166-2024無損檢測紅外熱成像檢測總則
- 山東省菏澤市東明縣2024-2025學年七年級上學期考試生物試題
- 北京市海淀區(qū)2023-2024學年六年級上學期語文期末試卷(含答案)
- 2024集裝箱儲能系統測試大綱
- 保溫班組安全晨會(班前會)
評論
0/150
提交評論