结对项目
一、题目简介
游戏规则是模仿网络上普通的连连看游戏,主要是鼠标两次点击的图片能否消去的问题。当前,前提是点击两张相同的图片,若点击的是同一张图片或者两张不同的图片,则不予处理。在两张想同图片所能连通的所有路径中,如果存在一条转弯点不多于两个的路径,就可以消去;如果没有,则不予处理。
该游戏由30张不同的图片组成,游戏开始将会出现30张随机组合的图片,在规则下点击两张相同的图片后图片将会消失。图片全部消完为游戏成功。游戏还将设置退出,再来一局的按钮,并实现该功能,方便用户进行操作。
该游戏将有如下内容:
(1)游戏计分功能
当消去两个相同的图片后分数将增加100分。
(2)退出功能
该功能有一个“退出”按钮,当按下“退出”按钮后,将直接退出游戏。
(3)再来一局功能
该功能有一个“再来一局”的按钮,当按下“再来一局”按钮后,图片将会重新排列,重新开始游戏。
(4)游戏倒计时功能
在游戏界面的上方有一个倒计时的进度条,增加游戏的难度,激发玩家的挑战兴趣。
(5)用户登录注册功能
在进入游戏界面之前,将会出现用户登录界面,如果没有注册的玩家在按下“注册”按钮后将进入注册界面,玩家需要填写用户名,密码,性别等信息完成注册,再进入登录界面,输入用户名和密码按下“确定”后就将进入游戏界面,开始游戏。
连连看游戏的设计目标为:
(1)该游戏开始前,将设置一个用户登录注册界面,如果没有注册的玩家在按下“注册”按钮后将进入注册界面,玩家需要填写用户名,密码,性别等信息完成注册,再进入登录界面,输入用户名和密码按下“确定”后就将进入游戏界面,开始游戏。
(2)游戏中将有“退出”功能,选择退出命令后程序将终止执行,关闭窗口。
还将有“再来一局”功能,选择再来一局命令后程序将对图片重新排列,重新开始游戏。该游戏还有一个时间倒计时的进度条,提醒玩家剩余的时间,增加游戏的难度。在界面的顶部有计分功能,当玩家消去图片后就会赢得相应的分数。
二、代码地址
https://github.com/caowenjing/lanlainkan
初冬瑞的博客地址:
http://www.cnblogs.com/chudachuer/
三、结对分工情况
曹文静:主要负责登陆界面,时间到的界面,进度条界面。
初冬瑞:主要负责注册界面,执行界面,查找图片。
四、结对实践过程
五、测试情况
1、用户登录界面
此JavaScript函数的作用是检测用户登陆的合法性,并确认用户输入了合法的登录名和口令。
部分代码:
private void loginDialog() {
login = new JDialog();
login.setTitle("登录");
login.setLayout(new FlowLayout());
login.add(new JLabel("用户名:"));
final JTextField name = new JTextField(10);
login.add(name);
login.add(new JLabel("密 码:"));
final JPasswordField password = new JPasswordField(10);
password.setEchoChar('*');
login.add(password);
JButton confirm = new JButton("登录");
confirm.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (compareUserData(name.getText().trim(), new String(password.getPassword()))) {
login.setVisible(false);
mainFrame.setVisible(true);
Timer timer = new Timer(100, new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (time.isEnd()) {
System.exit(0);
}
}
});
timer.start();
} else {
JOptionPane.showMessageDialog(login, "用户名或密码错误!", "错误提示", JOptionPane.ERROR_MESSAGE);
}
}
});
login.add(confirm);
final JDialog regDialog = new JDialog(login, "注册", true);
registerDialog(regDialog);
JButton register = new JButton("注册");
register.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
regDialog.setVisible(true);
}
});
login.add(register);
login.setSize(400, 200);
login.setResizable(false);
login.setLocationRelativeTo(null);
login.setVisible(true);
}
private boolean compareUserData(String name, String password) {
try {
RandomAccessFile out = new RandomAccessFile("user.dat", "rw");
String fname, fpassword = null;
while (out.getFilePointer() < out.length()) {
fname = out.readUTF();
out.readUTF();
fpassword = out.readUTF();
if (fname.equals(name) && fpassword.equals(password)) return true;
}
out.close();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
2、时间到的界面
关键代码:
public void remove() {
firstButton.setVisible(false); // 不可见
secondButton.setVisible(false);
fraction();
pressInformation = false;
k = 0;
grid[x0][y0] = 0;
grid[x][y] = 0;
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == newlyButton) {
int grid[][] = new int[8][7];
this.grid = grid;
randomBuild();
mainFrame.setVisible(false);
pressInformation = false;
init();
}
if (e.getSource() == exitButton)
System.exit(0);
// if(e.getSource()==resetButton)
// reload();new ActionListener() {
if (e.getSource() == timer) {
if (time.isEnd()) {
timer.stop();
if (JOptionPane.showConfirmDialog(mainFrame,
"时间到了,o(︶︿︶)o \n要再来一局吗?", "提示",
JOptionPane.YES_NO_OPTION) == JOptionPane.OK_OPTION) {
int grid[][] = new int[8][7];
this.grid = grid;
randomBuild();
mainFrame.setVisible(false);
pressInformation = false;
init();
timer.start();
} else
System.exit(0);
}
}
for (int cols = 0; cols < 6; cols++) {
for (int rows = 0; rows < 5; rows++) {
if (e.getSource() == diamondsButton[cols][rows])
estimateEven(cols + 1, rows + 1, diamondsButton[cols][rows]);
}
}
}
3、进度条界面:
关键代码:
public void xiao() //相同的情况下能不能消去。
{
if((x0==x &&(y0==y+1||y0==y-1)) || ((x0==x+1||x0==x-1)&&(y0==y)))//判断是否相邻
{
remove();
}
else
{
for (j=0;j<7;j++ )
{
if (grid[x0][j]==0)//判断第一个按钮同行哪个按钮为空
{
if (y>j) //如果第二个按钮的Y坐标大于空按钮的Y坐标说明第一按钮在第二按钮左边
{
for (i=y-1;i>=j;i-- )//判断第二按钮左侧直到第一按钮中间有没有按钮
{
if (grid[x][i]!=0)
{
k=0;
break;
}
else{ k=1; } //K=1说明通过了第一次验证
}
if (k==1)
{
linePassOne();
}
}
if (y<j) //如果第二个按钮的Y坐标小于空按钮的Y坐标说明第一按钮在第二按钮右边
{
for (i=y+1;i<=j ;i++ )//判断第二按钮左侧直到第一按钮中间有没有按钮
{
if (grid[x][i]!=0)
{
k=0;
break;
}
else { k=1; }
}
if (k==1)
{
linePassOne();
}
}
if (y==j )
{
linePassOne();
}
}
if (k==2)
{
if (x0==x)
{
remove();
}
if (x0<x)
{
for (n=x0;n<=x-1;n++ )
{
if (grid[n][j]!=0)
{
k=0;
break;
}
if(grid[n][j]==0 && n==x-1)
{
remove();
}
}
}
if (x0>x)
{
for (n=x0;n>=x+1 ;n-- )
{
if (grid[n][j]!=0)
{
k=0;
break;
}
if(grid[n][j]==0 && n==x+1)
{
remove();
}
}
}
}
}
for (i=0;i<8;i++ )//列
{
if (grid[i][y0]==0)
{
if (x>i)
{
for (j=x-1;j>=i ;j-- )
{
if (grid[j][y]!=0)
{
k=0;
break;
}
else { k=1; }
}
if (k==1)
{
rowPassOne();
}
}
if (x<i)
{
for (j=x+1;j<=i;j++ )
{
if (grid[j][y]!=0)
{
k=0;
break;
}
else { k=1; }
}
if (k==1)
{
rowPassOne();
}
}
if (x==i)
{
rowPassOne();
}
}
if (k==2)
{
if (y0==y)
{
remove();
}
if (y0<y)
{
for (n=y0;n<=y-1 ;n++ )
{
if (grid[i][n]!=0)
{
k=0;
break;
}
if(grid[i][n]==0 && n==y-1)
{
remove();
}
}
}
if (y0>y)
{
for (n=y0;n>=y+1 ;n--)
{
if (grid[i][n]!=0)
{
k=0;
break;
}
if(grid[i][n]==0 && n==y+1)
{
remove();
}
}
}
}
}
}
}
public void linePassOne()
{
if (y0>j)//第一按钮同行空按钮在左边
{
for (i=y0-1;i>=j ;i-- )//判断第一按钮同左侧空按钮之间有没按钮
{
if (grid[x0][i]!=0)
{
k=0;
break;
}
else
{ k=2; } //K=2说明通过了第二次验证
}
}
if (y0<j)//第一按钮同行空按钮在与第二按钮之间
{
for (i=y0+1;i<=j ;i++)
{
if (grid[x0][i]!=0)
{
k=0;
break;
}
else
{ k=2; }
}
}
}
public void rowPassOne()
{
if (x0>i)
{
for (j=x0-1;j>=i ;j-- )
{
if (grid[j][y0]!=0)
{
k=0;
break;
}
else
{ k=2; }
}
}
if (x0<i)
{
for (j=x0+1;j<=i ;j++ )
{
if (grid[j][y0]!=0)
{
k=0;
break;
}
else
{ k=2; }
}
}
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==newlyButton)
{
int grid[][] = new int[8][7];
this.grid = grid;
randomBuild();
mainFrame.setVisible(false);
pressInformation=false;
init();
}
if(e.getSource()==exitButton)
System.exit(0);
//if(e.getSource()==resetButton)
// reload();
for(int cols=0;cols<6;cols++)
{
for(int rows=0;rows < 5;rows++ )
{
if(e.getSource()==diamondsButton[cols][rows])
estimateEven(cols+1,rows+1,diamondsButton[cols][rows]);
}
}
}
4、总运行结果
测试结果:
六、心得
通过本次实验我学会了两个人如何合作完成一个项目,虽然在做项目的过程中我出现过错误时,但是我的同伴能够及时指出我的错误,弥补了我的不足,同时也让我学到了很多。在完成这个项目的过程中,我复习了并学会了图形用户界面的概念、AWT的基本体系结构,掌握窗口的基本原理;还有掌握几种布局管理器的使用方法和java的事件处理机制;了解Swing的基本体系结构,掌握Swing组件的使用方法;掌握java小程序的工作原理和使用方法。另外,还了解了许多新的知识。经过两个人的合作努力,我们对此游戏进行各种完善,从原来的数字图片改成了一些水果的图片,从没有计时功能到增加了计时功能,从没有登录界面到制作了一个登录界面,从一次次的完善中,我们收获了很多。当然该游戏并不是完美的,还有一些功能可以加强完善,这需要我们继续努力,进一步探究。