编程练习
使用你熟悉的开发语言和开发方式,实现以下的编程目标(至少合理实现“编程目标一”才为合格):
编程目标一:根据下面的“游戏说明”,实现该游戏程序,完成响应用户的输入、显示游戏局面、判定游戏胜负等功能。
编程目标二:在“编程目标一”的基础上,顺序记录用户从游戏开始到游戏结束的所有输入,并在游戏结束时保存到游戏过程记录文件中。
编程目标三:在“编程目标二”的基础上,程序实现如下功能:从游戏过程记录文件中读取数据并回放游戏从开始到结束的整个过程。
【游戏说明】
有一种游戏,其规则如下:有一个 3×3 的方格,每个方格中只可画‘+’符号或‘-’符号,表示该方格的值。图 (a) 定义了各方格的位置,表 1 为每个方格位置定义了与其相关联的位置集,各方格的初值如图 (b) 所示。游戏开始后,每次可选一个值为‘+’的方格位置,然后根据表 1 将该位置所对应的每个相关联的位置上的符号重画成与其不同的符号,即将‘+’重画成‘-’,将‘-’重画成‘+’。重画操作可用所选的位置编号来描述。例如在图 (b) 所示的情况下,选择位置 4 时,重画结果如图 (c) 所示。经过连续的若干次这样的操作后,当 3×3 方格呈现出图 (d) 所示的图形时,表示获胜;当呈现出图 (e) 所示的图形时,表示失败。
0 1 2 | - - - | - + - | + + + | - - - |
3 4 5 | - + - | + - + | + - + | - - - |
6 7 8 | - - - | - + - | + + + | - - - |
图(a) | 图(b) | 图(c) | 图(d) | 图(e) |
表1 方格位置及其相关位置集的对照表
0 | 0 1 3 4 |
1 | 0 1 2 |
2 | 1 2 4 5 |
3 | 0 3 6 |
4 | 1 3 4 5 7 |
5 | 2 5 8 |
6 | 3 4 6 7 |
7 | 6 7 8 |
8 | 4 5 7 8 |
因为我们还没有学习文件操作和多线程,所以目标二和目标三还不能实现它,这里我们实现目标一。
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
class GameButton extends JButton
{
GameButton(String str)
{
super(str);
super.setSize(10, 10);
super.setBackground(Color.WHITE);
super.setFont(new java.awt.Font("Dialog",1,60));//设置字体
}
}
public class MyGame extends JFrame implements ActionListener
{
private JFrame f = new JFrame("Game-Java 实现");
private JPanel jp = new JPanel(new GridLayout(3,3,10,10));
private GameButton [] gb = new GameButton[9];
private int[][] relationShips = new int[9][];
MyGame()
{
f.setLocation(10,100);
f.setSize(600,400);
f.getContentPane().add(jp);
for(int i=0;i<gb.length;i++)
{
gb[i]=new GameButton("-");
jp.add(gb[i]);
gb[i].addActionListener(this); //添加按钮事件
}
gb[4].setText("+");
f.setVisible(true);
relationShips[0] = new int[] { 0, 1, 3, 4 };
relationShips[1] = new int[] { 0, 1, 2 };
relationShips[2] = new int[] { 1, 2, 4, 5 };
relationShips[3] = new int[] { 0, 3, 6 };
relationShips[4] = new int[] { 1, 3, 4, 5, 7 };
relationShips[5] = new int[] { 2, 5, 8 };
relationShips[6] = new int[] { 3, 4, 6, 7 };
relationShips[7] = new int[] { 6, 7, 8 };
relationShips[8] = new int[] { 4, 5, 7, 8 };
}
public static void main(String[] args)
{
MyGame g=new MyGame();
}
public void actionPerformed(ActionEvent e)
{
for(int i=0;i<9;i++)
{
if(e.getSource().equals(gb[i])) //如果点中第i个
{
if(gb[i].getText().equals("-"))
{
JOptionPane.showMessageDialog(null,"你应该点“+”的");
return;
}
ButtonChange(i);
}
}
}
private void ButtonChange(int i)
{
for(int j=0;j<relationShips[i].length;j++)
{
if(gb[relationShips[i][j]].getText().equals("+"))
{
gb[relationShips[i][j]].setText("-");
}
else
{
gb[relationShips[i][j]].setText("+");
}
}
}
}