鱼C论坛

 找回密码
 立即注册
查看: 3175|回复: 0

[学习笔记] Java暑期学习Day27

[复制链接]
发表于 2017-7-31 23:58:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今天是第27天,对于之前的学习的整理


                               
登录/注册后可看大图



①扫雷
1.规则:用户点击第i个按钮,如果该位置没有雷,则显示该位置的周围(左右 上下 左上 右上 左下 右下)雷的个数


2.例如:21--->(2,3)
  2=21/9 取整
  3=21%9 取模

一般公式:m= i/N   n= i%N     i = m * N + n

  3.如果某个数是(m,n)
  上:(m-1,n)

  下:(m+1,n)
  左: (m,n-1)
  右:  (m,n+1)

  右下 row<=N-2
  
  4.代码
  1. package SaoLeiFrame;

  2. import java.awt.Color;
  3. import java.awt.GridLayout;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import java.util.Random;

  7. import javax.swing.JButton;
  8. import javax.swing.JFrame;
  9. import javax.swing.JOptionPane;

  10. //简单扫雷游戏
  11. public class SaoleiFrame extends JFrame implements ActionListener {

  12.         final int N = 9;// 格子的行列数
  13.         final int M = 10;// 雷的个数

  14.         // 定义一个数组,用于存放N*N个按钮
  15.         JButton[] btns = new JButton[N * N];
  16.         // 定义一个数组,用于存放N*N个位置的状态,0-无雷,1-有雷

  17.         int[] pos = new int[N * N];

  18.         // 定义界面初始化方法
  19.         public void Ini() {

  20.                 setSize(400, 400);
  21.                 setTitle("我的山寨扫雷= =");
  22.                 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  23.                 // 生成N*N个按钮,放到屏幕
  24.                 // 设置屏幕布局为网格布局
  25.                 setLayout(new GridLayout(N, N));
  26.                 for (int i = 0; i < N * N; i++) {
  27.                         // 创建第i个按钮
  28.                         btns[i] = new JButton();
  29.                         btns[i].setBackground(Color.green);

  30.                         // 放置到屏幕上
  31.                         add(btns[i]);
  32.                         // 设置按钮的监视器
  33.                         btns[i].addActionListener(this);

  34.                 } // end for

  35.                 // 随机生成10个雷
  36.                 Random rd = new Random();
  37.                 for (int i = 0; i < M; i++) {
  38.                         while(true){
  39.                         int x = rd.nextInt(N * N);// !!随机生成一个位置
  40.                         //判断x 在前面的i-1次中是否出现过
  41.                        
  42.                         //检测x在前面是否出现过
  43.                         if(pos[x]==0)
  44.                                
  45.                         {   pos[x] = 1;
  46.                               break;
  47.                               }
  48.                        
  49.                         }
  50.                         // 设置该位置的状态为 1
  51.                 }
  52.                         }

  53.                 // 显示雷的分布情况
  54.                 // showLeiPos();

  55.         // end Ini

  56.         // 显示雷的分布情况

  57.         public void showLeiPos() {

  58.                 for (int i = 0; i < N * N; i++) {
  59.                         if (pos[i] == 1) // 判断第i个位置是否有雷
  60.                                 btns[i].setBackground(Color.red);

  61.                 }

  62.         }

  63.         // 编写main方法,作为程序运行入库

  64.         public static void main(String[] args) {
  65.                 SaoleiFrame f1 = new SaoleiFrame();
  66.                 f1.Ini();
  67.                 f1.setVisible(true);

  68.         }

  69.         // 重写按钮点击事件的处理方法
  70.         @Override
  71.         public void actionPerformed(ActionEvent e) {
  72.                 // 区分第几个按钮被点击

  73.                 for (int i = 0; i < N * N; i++) {

  74.                         if (e.getSource() == btns[i])// 第i个被点击

  75.                         {
  76.                                 if (pos[i] == 1)// 判断第i个位置是否有雷
  77.                                 {
  78.                                         JOptionPane.showMessageDialog(null, "恭喜你被炸死了!哈哈哈");

  79.                                         showLeiPos();// 显示雷的位置

  80.                                 } else {

  81.                                         btns[i].setBackground(Color.white);
  82.                                         // 提示该位置雷的数量
  83.                                         showAroundLeiNumber(i);
  84.                                        
  85.                                         checkWinner();//判断是否扫雷成功

  86.                                 }

  87.                         } // end if

  88.                 } // end for

  89.         }// end actionPerformed

  90.         // 定义显示第i个位置周围雷的个数

  91.         void showAroundLeiNumber(int i) {

  92.                 // 1.计算出第i个按钮在屏幕上网格的行号和列号

  93.                 int row = i / N;
  94.                 int col = i % N;

  95.                 // 定义雷的个数

  96.                 int num = 0;

  97.                 // 3.以该位置 ( row,col )为中心,判断周围8个位置雷的个数
  98.                 // 3.1 判断上方位置
  99.                 if (row > 0) {
  100.            
  101.                         //计算正上方的行列号
  102.                        
  103.                         int m = row - 1;
  104.                         int n = col;
  105.   
  106.                         // 计算在数组中的位置
  107.                         int k =m*N+n;
  108.                
  109.                         //判断该位置是否有雷
  110.                         if(pos[k]==1)
  111.                                 num++;
  112.                         else btns[k].setBackground(Color.white);
  113.                
  114.        
  115.                 }

  116.                 //判断下方位置
  117.                
  118.                 if(row<N-1){
  119.                        
  120.                         //计算正下方的行列号
  121.                        
  122.                         int m = row +1;
  123.                         int n = col;
  124.   
  125.                         // 计算在数组中的位置
  126.                         int k =m*N+n;
  127.                
  128.                         //判断该位置是否有雷
  129.                         if(pos[k]==1)
  130.                                 num++;
  131.                         else btns[k].setBackground(Color.white);
  132.                
  133.                 }

  134.                 //判断正左方位置
  135.                
  136.                 if(col>0){
  137.                        
  138.                        
  139.                         //计算正左方的行列号
  140.                        
  141.                         int m = row ;
  142.                         int n = col-1;
  143.   
  144.                         // 计算在数组中的位置
  145.                         int k =m*N+n;
  146.                
  147.                         //判断该位置是否有雷
  148.                         if(pos[k]==1)
  149.                                 num++;
  150.                         else btns[k].setBackground(Color.white);
  151.                
  152.                 }

  153.                 //判断正右方位置
  154.                
  155.                 if(col<N-1){
  156.                        
  157.                         //计算正右方的行列号
  158.                        
  159.                         int m = row ;
  160.                         int n = col+1;
  161.   
  162.                         // 计算在数组中的位置
  163.                         int k =m*N+n;
  164.                
  165.                         //判断该位置是否有雷
  166.                         if(pos[k]==1)
  167.                                 num++;
  168.                         else btns[k].setBackground(Color.white);
  169.                
  170.                 }
  171.                
  172.                 //判断左上方位置
  173.                
  174.                 if(row>0&&col>0){
  175.                        
  176.                         //计算左上方的行列号
  177.                        
  178.                         int m = row-1 ;
  179.                         int n = col-1;
  180.   
  181.                         // 计算在数组中的位置
  182.                         int k =m*N+n;
  183.                
  184.                         //判断该位置是否有雷
  185.                         if(pos[k]==1)
  186.                                 num++;
  187.                         else btns[k].setBackground(Color.white);
  188.                
  189.                 }
  190.                 //判断左下方位置
  191.                
  192.                                 if(row<N-1&& col>0){
  193.                                        
  194.                                         //计算左下方的行列号
  195.                                        
  196.                                         int m = row+1 ;
  197.                                         int n = col-1;
  198.                   
  199.                                         // 计算在数组中的位置
  200.                                         int k =m*N+n;
  201.                                
  202.                                         //判断该位置是否有雷
  203.                                         if(pos[k]==1)
  204.                                                 num++;
  205.                                         else btns[k].setBackground(Color.white);
  206.                                
  207.                                 }
  208.                                 //判断右上方位置
  209.                                
  210.                                 if(row>0&&col<N-1){
  211.                                        
  212.                                         //计算右上方的行列号
  213.                                        
  214.                                         int m = row -1;
  215.                                         int n = col+1;
  216.                   
  217.                                         // 计算在数组中的位置
  218.                                         int k =m*N+n;
  219.                                
  220.                                         //判断该位置是否有雷
  221.                                         if(pos[k]==1)
  222.                                                 num++;
  223.                                         else btns[k].setBackground(Color.white);
  224.                                
  225.                                 }
  226.                                
  227.                 //判断右下方位置
  228.                                
  229.                                 if(row<N-1&&col<N-1){
  230.                                        
  231.                                         //计算右下方的行列号
  232.                                        
  233.                                         int m = row +1;
  234.                                         int n = col+1;
  235.                   
  236.                                         // 计算在数组中的位置
  237.                                         int k =m*N+n;
  238.                                
  239.                                         //判断该位置是否有雷
  240.                                         if(pos[k]==1)
  241.                                                 num++;
  242.                                         else btns[k].setBackground(Color.white);
  243.                                
  244.                                 }
  245.                
  246.                
  247.                
  248.                 if(num>0)
  249.                 btns[i].setText(""+num);
  250.        
  251.        
  252.         }

  253.             //判断是否扫雷成功的方法checkWinner
  254.        
  255.          public void checkWinner(){
  256.                  //判断屏幕上,背景为白色的按钮的个数是否为N*N-m
  257.                  
  258.                  int blankNum=0;
  259.                  for(int i=0;i<N*N;i++){
  260.                          
  261.                          if( btns[i].getBackground()==Color.white)
  262.                                  blankNum++;
  263.                  }
  264.                     if(blankNum==N*N-M){
  265.                             JOptionPane.showMessageDialog(null,"恭喜您!扫雷成功哈哈哈哈哈哈");
  266.                             showLeiPos();
  267.                            
  268.                     }
  269.                  
  270.          }//end checkWinner

  271. }

复制代码

②简单打字测试程序

1.规则:在给定的时间内,界面上每隔特定的时间出现一个字符
            用户在输入框中输入所看到的字符,如果输入正确,则分数+1
            最后根据用户所得的分数,时间终止后,根据得分给予其评价

2.步骤:
a.创建工程
WorldExam
b.创建类
WorldExamFrame

c.排列: 边框布局  流式布局 网格布局(m X n)
             复杂界面的排列---综合运用多种布局方法

  整体采用一个布局,将屏幕分成若干个部分,在某个局部
则采用其他的布局

Java提供一个JPanel的容器组件,用于放置小的界面元素

d.创建线程任务类TaskOfCreateWord

3.代码
  1. import java.awt.BorderLayout;
  2. import java.awt.Color;
  3. import java.awt.Font;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import java.util.Random;

  7. import javax.swing.JButton;
  8. import javax.swing.JFrame;
  9. import javax.swing.JLabel;
  10. import javax.swing.JOptionPane;
  11. import javax.swing.JPanel;
  12. import javax.swing.JTextField;

  13. //打字工具界面类
  14. public class WordExamFrame extends JFrame implements ActionListener {

  15.         // 定义随机产生的候选字符数组
  16.         final char[] rndChars = { 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
  17.                         '!', '#', '@', 's', 't', 'v', 'u', 'w', 'x', 'y', 'z' };
  18.         // 定义存放用户的分数
  19.         int score = 0;
  20.         // 定义总时间
  21.         int totalTime = 60 * 2;
  22.   //定义是否为新产生的字符,控制重复输入累加的问题
  23.        
  24.         boolean isNew=false;
  25.        
  26.        
  27.         // 定义界面上的各种界面元素

  28.         JButton btnBegin = new JButton("开始");
  29.         JButton btnClose = new JButton("关闭");
  30.         JLabel lblScore = new JLabel("得分:");
  31.         JLabel lblWord = new JLabel("等待产生字符..");
  32.         JLabel lblTime = new JLabel("倒计时:");
  33.         JTextField tfdWord = new JTextField(20);

  34.         // 定义界面初始化方法initial(init)

  35.         public void init() {

  36.                 setTitle("打字测试工具---测试你 是否是打字高手!");
  37.                 setSize(400, 300);
  38.                 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  39.                 // 将上面定义的六个界面元素加入到窗口中
  40.                 // 1.将整个窗口采用BorderLayout布局

  41.                 setLayout(new BorderLayout());

  42.                 // 2.顶部部分
  43.                 // 2.1创建顶部托盘

  44.                 JPanel pTop = new JPanel();

  45.                 // 2.2将顶部的界面元素,放入到顶部托盘上

  46.                 pTop.add(btnBegin);
  47.                 pTop.add(btnClose);
  48.                 pTop.add(lblScore);
  49.                 pTop.setBackground(Color.pink);

  50.                 // 2.3将顶部托盘,放置到界面的顶部(North)
  51.                 add(pTop, BorderLayout.NORTH);

  52.                 // 3.中间部分

  53.                 add(lblWord, BorderLayout.CENTER);

  54.                 // 4.底部部分

  55.                 JPanel pBottom = new JPanel();
  56.                 pBottom.add(lblTime);
  57.                 pBottom.add(tfdWord);
  58.                 pBottom.setBackground(Color.green);
  59.                 add(pBottom, BorderLayout.SOUTH);

  60.                 // 设置字体
  61.                 lblWord.setFont(new Font(("楷体"), 1, 50));
  62.                 // 设置文字水平居中
  63.                 lblWord.setHorizontalAlignment(JLabel.CENTER);

  64.         }

  65.         // 定义一个构造方法 不能加返回值

  66.         public WordExamFrame() {
  67.                 // 窗口初始化

  68.                 init();
  69.                 // 设置对各种事件的监听
  70.                 // 2.1对输入框的回车事件实行监听
  71.                 tfdWord.addActionListener(this);
  72.           //2.2 对开始按钮进行监听
  73.                 btnBegin.addActionListener(this);
  74.                 //2.3对关闭按钮进行监听
  75.           btnClose.addActionListener(this);               
  76.                
  77.                
  78.        

  79.         }

  80.         // 定义一个产生中间字符的线程类 TaskOfCreateWord
  81.         class TaskOfCreateWord extends Thread {

  82.                 @Override
  83.                 public void run() {
  84.                         Random rd = new Random();
  85.                         while (totalTime > 0) {
  86.                                 // 随机从候选数组中产生一个位置
  87.                                 int index = rd.nextInt(rndChars.length);
  88.                                 String x = "" + rndChars[index];// 取出该位置的字符

  89.                                 // String x=""+rd.nextInt(10);
  90.                                 lblWord.setText(x);// 显示在提示框中
  91.                              isNew=true;//设置一个新产生的字符标志!!!!!
  92.                                
  93.                                
  94.                                
  95.                                
  96.                                 // 任务休眠一秒
  97.                                 try {
  98.                                         sleep(1000 * 2);
  99.                                 } catch (Exception e) {

  100.                                         e.printStackTrace();
  101.                                 }

  102.    
  103.         }

  104.                 }// end run

  105.         }// end class

  106.         // 定义一个倒计时任务线程TaskOfCountTime
  107.         class TaskOfCountTime extends Thread {
  108.                 @Override
  109.                 public void run() {
  110.                         while (totalTime > 0) {
  111.                                 try {
  112.                                         sleep(1000 * 1);
  113.                                 } catch (Exception e) {}
  114.                                        
  115.                                 totalTime--;// 时间倒计时计数器-1
  116.                                         lblTime.setText("倒计时:" + totalTime);
  117.                                 } // end while
  118.                         JOptionPane.showMessageDialog(null, "本次测试结束!");
  119.                         } // end run
  120.                 }// end class
  121.        

  122.         // 定义main
  123.         public static void main(String[] args) {

  124.                 new WordExamFrame().setVisible(true);

  125.         }

  126.         // 重写事件处理方法

  127.         @Override
  128.         public void actionPerformed(ActionEvent e) {
  129.                 // 区分发生事件的事件源
  130.                 if (e.getSource() == tfdWord)// 用户在输入框里按回车
  131.                 {
  132.                         // 判断用户的输入和系统产生的字符是否一致
  133.                         String s1 = tfdWord.getText();
  134.                         String s2 = lblWord.getText();
  135.                         if (s1.equals(s2)) {
  136.                                 //判断是否为新产生的字符
  137.                        
  138.                                
  139.                                 if(isNew==true){
  140.                                         score++;
  141.                                         lblScore.setText("得分:" + score);
  142.                                         isNew=false;//设置该字符已经处理过
  143.                                 }
  144.                                
  145.                        
  146.                         }
  147.                         // 清空输入框的内容
  148.                         tfdWord.setText("");

  149.                 }//end if
  150.                 else if(e.getSource()==btnBegin){        //开始按钮被点击
  151.                        
  152.                         totalTime=2*60;
  153.                        
  154.                         score=0;
  155.                        
  156.                         // 创建产生字符的线程任务并启动
  157.                         TaskOfCreateWord t1 = new TaskOfCreateWord();
  158.                         t1.start();
  159.                         // 创建倒计时线程任务并启动
  160.                         TaskOfCountTime t2 = new TaskOfCountTime();
  161.                         t2.start();
  162.            //设置开始按钮不可用
  163.                         btnBegin.setEnabled(false);
  164.                        
  165.                 }
  166.                
  167.                
  168.                
  169.                 else if(e.getSource()==btnClose){  //停止按钮
  170.                        
  171.                         totalTime=0;
  172.                         //设置开始按钮可用
  173.                         btnBegin.setEnabled(true);
  174.                        
  175.                 }
  176.                
  177.                
  178.                

  179.         }// end   actionPerformed

  180. }
复制代码





  


本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 07:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表