java课程设计.docx
《java课程设计.docx》由会员分享,可在线阅读,更多相关《java课程设计.docx(29页珍藏版)》请在冰豆网上搜索。
java课程设计
java课程设计2048
Java语言程序设计
课程设计
题目2048游戏的设计与实现
学院数信学院
专业计算机科学与技术
班级计科121
学号201259225131
学生姓名郑帅兵
指导教师赵利平
编写日期2014-7-8
一、需求分析
《2048》是比较流行的一款数字游戏。
原版2048首先在github上发布,原作者是GabrieleCirulli。
它是基于《1024》和《小3传奇》的玩法开发而成的新型数字游戏[1] 。
随后2048便出现各种版本,走各大平台。
由Ketchapp公司移植到IOS的版本最为火热,现在约有1000万下载,其名字跟原版一模一样。
衍生版中最出名的是《2048六边形》版本,先后在全球81个国家中的boardgame中排进了前200。
安卓版非常火爆的有《挑战2048》,其2.0.0版以后还加入了双人对战。
其次比较特别的有2048中国朝代版。
更有2048自定义版,可以自己定义文字和图片。
《2048》是IOS中流行的一款。
本课程设计通过设计与开发JVM平台上的2048游戏,进一步掌握所学Java课程的知识,体验Java的跨平台性,同时将Java设计方面的知识拓展应用
二、系统运行环境
1、硬件环境:
2、软件环境:
操作系统:
WindowsXP/Windows7
软件:
集成开发环境Eclipse
三、功能需求描述
1、图形用户界面:
2048的最大特点就是玩家对图形界面里的数字进行操作,也就是是玩家与游戏的互动
2、当前分数SCORE与最高分数的显示:
在我们设计的2048游戏中当前分数取了页面内所有数字相加的值为分数,对玩家玩游戏的进展有直接性、客观性的展现;同时,最高分数取了以往玩家退出游戏时所保存分数的最高分
3、数字颜色:
游戏中数字的颜色以2为首项的等比数列变化,即2、4、8、16、32、64、128、256、512、1024、2048.......对应的数字卡片变色
4、游戏的退出:
游戏退出时,我们采用弹出对话框的确认玩家是否真的要退出游戏,当然这样做更符合游戏人性化设计的观念。
功能图如下:
四、总体设计
简要设计流程:
程序结构说明:
//重新开始,若是初次运行游戏,则从文件中读入最高分
voidrestart()
//控制方法
publicvoidkeyPressed(KeyEvente)
//绘图方法
publicvoidpaint(Graphicsg)
//判断是否已经失败,若失败则返回true,否则返回false
publicbooleanjudgeFail()
//向下滑动,若各列均没有方块相消或移动,则返回false,否则返回true;
publicvoidmoveDown()
//向左滑动,若各行均没有方块相消或移动,则返回false,否则返回true;
publicvoidmoveLeft()
//向右滑动,若各行均没有方块相消或移动,则返回false,否则返回true;
publicvoidmoveRight()
//向上滑动,若各行均没有方块相消或移动,则返回false,否则返回true;
PublicvoidmoveUp()
//在游戏区空闲处随机生成2或4
publicvoidgenerateRandom2or4()
五、程序模块设计
源码如下:
Main类:
importjavax.swing.JFrame;
publicclassMain{
publicstaticvoidmain(String[]args){
JFrameframe=newJava2048();
frame.setTitle("Java2048");
frame.setSize(455,610);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
Java2048类:
importjava.awt.*;
importjava.awt.event.*;
importjava.io.*;
importjava.util.*;
importjavax.swing.*;
publicclassJava2048extendsJFrameimplementsKeyListener{
privatestaticfinallongserialVersionUID=1L;
Colorbackground=newColor(190,173,160);//背景色
Colorforeground=newColor(204,192,178);//前景色
ColorwordColor=newColor(232,216,203);//单词色
FontwordFont=newFont("微软雅黑",Font.PLAIN,20);//单词字体
FontnumberFont=newFont("微软雅黑",Font.BOLD,40);//数字字体
Randomrandom=newRandom();//随机数发生器
int[][]array;//游戏用2维数组
//逐行或逐列处理数组,第一个参数为实际数字,第二个为判断值,用来判断是否应该消除相同的数字
int[][]process=newint[4][2];
intscore;//分数,初始化为零
inthighestScore;//游戏中最高分
inthighestScore2=0;//文件中最高分
intbiggestNumber=0;
booleanifGenerate2or4;
int[]rd=newint[16];//生成随机2或4的位置
privateGraphicsgBuffer;
//构造方法
publicJava2048(){
addKeyListener(this);
addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
if(JOptionPane.showConfirmDialog(null,"确定退出?
","提示",JOptionPane.YES_NO_OPTION)==JOptionPane.YES_NO_OPTION){
if(highestScore>highestScore2){//若在本次游戏中破了纪录,则更新文件中的最高分
highestScore2=highestScore;
Filefile=newFile("Java2048beta1.txt");
BufferedWriterbw;
try{
bw=newBufferedWriter(newFileWriter(file));
bw.write(String.valueOf(highestScore2),0,String.valueOf(highestScore2).length());
bw.close();
}catch(Exceptione1){JOptionPane.showMessageDialog(null,"找不到同目录下Java2048beta1.txt文件或文件已损坏!
","提示",JOptionPane.INFORMATION_MESSAGE);
};
}
System.exit(0);
}
}
});
restart();
}
voidrestart(){//重新开始
//若是初次运行游戏,则从文件中读入最高分
if(highestScore==0){}
Filefile=newFile("Java2048beta1.txt");
BufferedReaderbr;
try{
br=newBufferedReader(newFileReader(file));
highestScore2=Integer.valueOf(br.readLine());
br.close();
}catch(Exceptione){
JOptionPane.showMessageDialog(this,"找不到同目录下Java2048beta1.txt文件或文件已损坏!
","提示",JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
};
highestScore=highestScore2;
array=newint[4][4];//清空游戏用2维数组
score=0;//重置分数为零
biggestNumber=0;//重置最大数字为零
//在游戏区随机生成两个2或4
generateRandom2or4();
generateRandom2or4();
}
//绘图方法
publicvoidpaint(Graphicsg){
gBuffer=g;
gBuffer.setColor(background);
gBuffer.drawRoundRect(30,40,185,90,20,20);//画分数显示区
gBuffer.fillRoundRect(30,40,185,90,20,20);
gBuffer.drawRoundRect(245,40,185,90,20,20);//画最高分显示区
gBuffer.fillRoundRect(245,40,185,90,20,20);
gBuffer.drawRoundRect(0,150,454,460,10,10);//画主游戏区
gBuffer.fillRoundRect(0,150,454,460,10,10);
gBuffer.setFont(wordFont);
gBuffer.setColor(wordColor);
gBuffer.drawString("SCORE",90,70);//画SCORE
gBuffer.drawString("BEST",315,70);//画BEST
gBuffer.setFont(numberFont);
gBuffer.setColor(Color.white);
if(score<10){
gBuffer.drawString(String.valueOf(score),110,115);//画分数数字}elseif(score<100){
gBuffer.drawString(String.valueOf(score),100,115);//画分数数字
}elseif(score<1000){
gBuffer.drawString(String.valueOf(score),85,115);//画分数数字
}elseif(score<10000){
gBuffer.drawString(String.valueOf(score),73,115);//画分数数字
}elseif(score<100000){
gBuffer.drawString(String.valueOf(score),60,115);//画分数数字
}elseif(score<1000000){
gBuffer.drawString(String.valueOf(score),50,115);//画分数数字
}else{
gBuffer.drawString(String.valueOf(score),37,115);//画分数数字
}
if(highestScore<10){
gBuffer.drawString(String.valueOf(highestScore),325,115);
//画分数数字
}elseif(highestScore<100){
gBuffer.drawString(String.valueOf(highestScore),315,115);
//画分数数字
}elseif(highestScore<1000){
gBuffer.drawString(String.valueOf(highestScore),300,115);
//画分数数字
}elseif(highestScore<10000){
gBuffer.drawString(String.valueOf(highestScore),288,115);
//画分数数字
}elseif(highestScore<100000){
gBuffer.drawString(String.valueOf(highestScore),275,115);
//画分数数字
}elseif(highestScore<1000000){
gBuffer.drawString(String.valueOf(highestScore),265,115);
//画分数数字
}else{
gBuffer.drawString(String.valueOf(highestScore),252,115);
//画分数数字
}
gBuffer.setColor(foreground);
for(inti=0;i<4;i++){
for(intj=0;j<4;j++){
gBuffer.drawRoundRect(10+j*112,160+i*112,100,100,10,10);gBuffer.fillRoundRect(10+j*112,160+i*112,100,100,10,10);
}
}
for(inti=0;i<4;i++){
for(intj=0;j<4;j++){
switch(array[i][j]){
case2:
{
gBuffer.setColor(newColor(238,228,218));
gBuffer.drawRoundRect(10+j*112,160+i*112,100,100,10,10);
gBuffer.fillRoundRect(10+j*112,160+i*112,100,100,10,10);
gBuffer.setColor(newColor(122,113,104));
gBuffer.setFont(newFont("微软雅黑",Font.BOLD,50));
gBuffer.drawString("2",45+j*112,230+i*113);
break;
}
case4:
{
gBuffer.setColor(newColor(236,224,200));
gBuffer.drawRoundRect(10+j*112,160+i*112,100,100,10,10);
gBuffer.fillRoundRect(10+j*112,160+i*112,100,100,10,10);
gBuffer.setColor(newColor(119,110,103));
gBuffer.setFont(newFont("微软雅黑",Font.BOLD,50));
gBuffer.drawString("4",45+j*112,230+i*113);
break;
}
case8:
{
gBuffer.setColor(newColor(242,177,121));
gBuffer.drawRoundRect(10+j*112,160+i*112,100,100,10,10);
gBuffer.fillRoundRect(10+j*112,160+i*112,100,100,10,10);
gBuffer.setColor(newColor(250,248,235));
gBuffer.setFont(newFont("微软雅黑",Font.BOLD,50));
gBuffer.drawString("8",45+j*112,230+i*113);
break;
}
case16:
{
gBuffer.setColor(newColor(245,149,101));
gBuffer.drawRoundRect(10+j*112,160+i*112,100,100,10,10);
gBuffer.fillRoundRect(10+j*112,160+i*112,100,100,10,10);
gBuffer.setColor(newColor(252,244,242));
gBuffer.setFont(newFont("微软雅黑",Font.BOLD,45));
gBuffer.drawString("16",33+j*112,230+i*111);
break;
}
case32:
{
gBuffer.setColor(newColor(245,124,95));
gBuffer.drawRoundRect(10+j*112,160+i*112,100,100,10,10);
gBuffer.fillRoundRect(10+j*112,160+i*112,100,100,10,10);
gBuffer.setColor(newColor(255,241,249));
gBuffer.setFont(newFont("微软雅黑",Font.BOLD,45));
gBuffer.drawString("32",33+j*112,230+i*111);
break;
}
case64:
{
gBuffer.setColor(newColor(246,93,59));
gBuffer.drawRoundRect(10+j*112,160+i*112,100,100,10,10);
gBuffer.fillRoundRect(10+j*112,160+i*112,100,100,10,10);
gBuffer.setColor(newColor(247,249,235));
gBuffer.setFont(newFont("微软雅黑",Font.BOLD,45));
gBuffer.drawString("64",33+j*112,230+i*111);
break;
}
case128:
{
gBuffer.setColor(newColor(237,206,113));
gBuffer.drawRoundRect(10+j*112,160+i*112,100,100,10,10);
gBuffer.fillRoundRect(10+j*112,160+i*112,100,100,10,10);
gBuffer.setColor(newColor(248,246,255));
gBuffer.setFont(newFont("微软雅黑",Font.BOLD,40));
gBuffer.drawString("128",23+j*112,228+i*111);
break;
}
case256:
{
gBuffer.setColor(newColor(237,204,97));
gBuffer.drawRoundRect(10+j*112,160+i*112,100,100,10,10);
gBuffer.fillRoundRect(10+j*112,160+i*112,100,100,10,10);
gBuffer.setColor(newColor(245,244,249));
gBuffer.setFont(newFont("微软雅黑",Font.BOLD,40));
gBuffer.drawString("256",23+j*112,228+i*111);
break;
}
case512:
{
gBuffer.setColor(newColor(235,201,78));
gBuffer.drawRoundRect(10+j*112,160+i*112,100,100,10,10);
gBuffer.fillRoundRect(10+j*112,160+i*112,100,100,10,10);
gBuffer.setColor(newColor(255,241,248));
gBuffer.setFont(newFont("微软雅黑",Font.BOLD,40));
gBuffer.drawString("512",23+j*112,228+i*111);
break;
}
case1024:
{
gBuffer.setColor(newColor(237,197,63));
gBuffer.drawRoundRect(10+j*112,160+i*112,100,100,10,10);
gBuffer.fillRoundRect(10+j*112,160+i*112,100,100,10,10);
gBuffer.setColor(newColor(240,246,244));
gBuffer.setFont(newFon