四則運算實驗 驗證碼生成實驗
程序設計要求:
編寫一個程序,寫一個能自動生成30道小學四則運算題目的 “軟件”。
實驗要求:
1) 按照題目內容要求編寫程序實現功能。
2) 實驗報告中要求包括程序設計思想、程序流程圖、源程序、實現結果截圖、實驗總結(包括調試過程中出現的錯誤等)。
程序設計思想:
1. 首先我們調用java.util包裏獲取隨機數的函數import java.util.Radom;然後定義加減乘除,獲取隨機數的取值範圍,我把取值範圍設為1-999。接下來我們要設置題的生成量,根據題意要求,我把它設置為30。
源碼:
package sizeMATH;
import java.util.Random;
public class sizeMATHt {
public static void main(String[] args) {
String[] operate=new String[] {"+","-","*","/"};
int[] numbers=new int[1000];
for(int i = 1;i<1000;i++)
{
numbers[i-1]=i;
}
Random r=new Random();
for(int i=0;i<30;i++)
{
System.out.println(numbers[r.nextInt(1000)]+
operate[r.nextInt(4)]+
numbers[r.nextInt(1000)]+"=");
}
}
}
實現結果截圖:
實驗總結:
這次的實驗是個有些實際的事情做得實驗,因為它來源於生活,給小孩子出題這個作業我們肯定知道,但是把它用一個程序來完成就很有意思了。這個實驗讓我接觸到java之中有些功能是可以調用已有類的。像這次我就調用了util.Random包。這次實驗又讓我得到了歷練。
程序設計思想:
該程序我們首先設置驗證碼的長寬高,在開始生成隨機數以及數的形狀,接下來要畫幹擾線。我們將隨機函數運用到單個字符的形狀以及幹擾線的形狀上。
源程序:
package yanzhengma;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
/**
* 繪制驗證碼圖像
*
* @author
*
*/
public class yanzhengma {
public static class Captcha {
// 圖像寬度
private int width = 100;
// 圖像高度
private int height = 30;
// 驗證碼字符長度
private int length = 6;
// 隨機生成驗證碼基礎字符串
private final String baseCharacters = "abcdefghijkmnpqrstuvwxyABCDEFGHIJKLMNPQRSTUVWXYZ123456789";
/**
* 獲取驗證碼圖像
*
* @return 驗證碼圖像
*/
public BufferedImage getCaptchaImage() {
// 創建圖像緩沖區
BufferedImage img = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 獲取圖像上下文(畫筆)
Graphics g = img.getGraphics();
// 設定圖像背景色,填充背景矩形
g.setColor(getRandomColor(200, 255));
g.fillRect(0, 0, width, height);
// 畫邊框
g.setColor(Color.BLACK);
g.drawRect(0, 0, width - 1, height - 1);
/* 生成隨機驗證碼 */
int len = baseCharacters.length(); // 基礎字符串長度
g.setFont(new Font("楷體", Font.HANGING_BASELINE, 24)); // 設置驗證碼字體
// 循環生成驗證碼各字符
Random rand = new Random();
for (int i = 0; i < length; i++) {
// 隨機生成驗證碼中單個字符
String randStr = String.valueOf(baseCharacters.charAt(rand
.nextInt(len)));
// 單個字符繪制寬度
int width = this.width / this.length;
// 當前字符繪制原點
int x = width * i;
int y = this.height / 2 + rand.nextInt(this.height / 3);
/* 將該字符畫到圖像中 */
drawString(g, x, y, randStr);
}
// 畫幹擾線
drawLine(g, 10);
// 釋放圖像上下文(畫筆)
g.dispose();
return img;
}
/**
* 畫驗證碼字符串中單個字符
*
* @param g
* 圖像上下文
* @param width
* 字符所占寬度
* @param height
* 字符所占高度
* @param str
* 待繪制字符串
*/
private void drawString(Graphics g, int width, int height, String str) {
Random rand = new Random();
// 隨機生成字符旋轉角度(-30~30度)
int degree = rand.nextInt(60);
if (degree > 30)
degree = 30 - degree;
// 設置字體顏色
g.setColor(getRandomColor(0, 80));
// 轉換 Graphics2D
Graphics2D g2 = (Graphics2D) g.create();
// 平移原點到圖形環境的中心 ,這個方法的作用實際上就是將字符串移動到某一個位置
g2.translate(width + rand.nextInt(5), height + rand.nextInt(5));
// 旋轉文本
g2.rotate(degree * Math.PI / 180);
// 畫文本,特別需要註意的是,這裏的畫筆已經具有了上次指定的一個位置,所以這裏指定的其實是一個相對位置
g2.drawString(str, 0, 0);
}
/**
* 畫隨機幹擾線
*
* @param g
* 畫筆(圖像上下文)
* @param count
* 幹擾線條數
*/
private void drawLine(Graphics g, int count) {
Random rand = new Random();
// 循環繪制每條幹擾線
for (int i = 0; i < count; i++) {
// 設置線條隨機顏色
g.setColor(getRandomColor(180, 200));
// 生成隨機線條起點終點坐標點
int x1 = rand.nextInt(this.width);
int y1 = rand.nextInt(this.height);
int x2 = rand.nextInt(this.width);
int y2 = rand.nextInt(this.height);
// 畫線條
g.drawLine(x1, y1, x2, y2);
}
}
/**
* 獲取隨機顏色
*
* @param minimum
* 顏色下限值
* @param maximum
* 顏色上限值
* @return 隨機顏色對象
*/
private Color getRandomColor(int minimum, int maximum) {
if (minimum > maximum) {
int tmp = minimum;
minimum = maximum;
maximum = tmp;
}
if (maximum > 255)
maximum = 255;
if (minimum < 0)
minimum = 0;
int r = minimum + (int) (Math.random() * (maximum - minimum));
int g = minimum + (int) (Math.random() * (maximum - minimum));
int b = minimum + (int) (Math.random() * (maximum - minimum));
return new Color(r, g, b);
}
public static void main(String[] args) {
Captcha captcha = new Captcha();
JFrame frame = new JFrame("驗證碼");
frame.setSize(300, 200);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel lbl = new JLabel(new ImageIcon(captcha.getCaptchaImage()));
frame.add(lbl);
frame.setVisible(true);
}
實驗截圖:
}
}
實驗總結:
這次的實驗挺難的,畢竟以前我以為我們現在做的程序輸出的結果只不過是在彈出來的黑框框裏出現一堆我們想要的結果罷了,但是我沒想到我們現在這個水平還可以做驗證碼。這讓我感覺很新鮮。通過實踐我運行出來了我想要的東西。
四則運算實驗 驗證碼生成實驗