通过一个游戏编程熟悉事件处理

 

 

编程练习

 

       使用你熟悉的开发语言和开发方式,实现以下的编程目标(至少合理实现“编程目标一”才为合格):

编程目标一:根据下面的“游戏说明”,实现该游戏程序,完成响应用户的输入、显示游戏局面、判定游戏胜负等功能。

编程目标二:在“编程目标一”的基础上,顺序记录用户从游戏开始到游戏结束的所有输入,并在游戏结束时保存到游戏过程记录文件中。

编程目标三:在“编程目标二”的基础上,程序实现如下功能:从游戏过程记录文件中读取数据并回放游戏从开始到结束的整个过程。

 

 

【游戏说明】

有一种游戏,其规则如下:有一个 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("+");

           }

       }

    }

}

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值