日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

抽卡模拟系统(包含图形界面,结果可存储到数据库中)

發(fā)布時(shí)間:2024/1/8 windows 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 抽卡模拟系统(包含图形界面,结果可存储到数据库中) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

軟件工程的大作業(yè),要求寫一個系統(tǒng)。自己平時(shí)玩過一些抽卡手游,類似于《原神》、《FGO》之類的,因此想試一試寫一個類似的程序。
這篇文章受到了這個講解抽卡機(jī)制的b站視頻的啟發(fā):

https://www.bilibili.com/video/BV1LE411H79s?from=search&seid=1515395401480087823

另外我也參考了其它作者寫的抽卡程序,在此一并表示感謝。

該程序包含以下功能:

  • 自定義☆/☆☆/☆☆☆概率。
  • 自定義是否有概率Up,及Up概率的值(0-100%)。
  • 自定義是否有大保底,及大保底的數(shù)量。
  • 單抽。
  • 十連抽。
  • 小保底(即十連保底)。
  • 大保底。
  • 圖形界面。
  • 數(shù)據(jù)庫。

概念簡述

概率Up:當(dāng)Up概率為70%時(shí),若某次抽卡結(jié)果是☆☆☆,則該☆☆☆有70%概率是限定☆☆☆,30%概率是普通☆☆☆。
小保底(十連保底):對于十連抽中累計(jì)九次都沒出現(xiàn)☆☆/☆☆☆的玩家,使其第十次抽取必為☆☆/☆☆☆中的一種。
大保底:對于抽取次數(shù)到達(dá)管理員規(guī)定的大保底次數(shù)的前一次時(shí)仍未抽取到up角色的非酋玩家,那么下一次抽取必定獲得☆☆☆角色。

模塊介紹

前三個模塊是主要的核心算法,可以實(shí)現(xiàn)除了圖形界面和數(shù)據(jù)庫的所有功能。
Main模塊中輸入概率、概率Up、保底后運(yùn)行,可以輸出單抽和十連抽的結(jié)果,是我前期進(jìn)行測試時(shí)使用的。

Setting(設(shè)置概率、概率Up、保底)

package 抽卡系統(tǒng); import java.util.Scanner; public class Setting {/** 設(shè)置☆/☆☆/☆☆☆概率* 設(shè)置是否有概率up* 設(shè)置是否有保底*/Scanner sc=new Scanner(System.in); /*-------------------------------------------------------------------------------------------*/ public double [] Chance() {//設(shè)置☆/☆☆/☆☆☆概率double[] allchance= new double[3];//創(chuàng)建一個double數(shù)組,用于返回所有概率for(int i=0;i<3;i++)allchance[i]=0;System.out.print("請分別設(shè)置☆☆/☆☆☆出現(xiàn)概率");System.out.println("(☆概率為100%-☆☆/☆☆☆概率之和)");double twostarchance=0;double threestarchance=0;System.out.print("請分別輸入☆☆/☆☆☆概率(小數(shù)):");if (sc.hasNextDouble()) {twostarchance = sc.nextDouble();threestarchance=sc.nextDouble();if(twostarchance+threestarchance>1) {System.out.println("☆☆/☆☆☆概率之和超過100%!");return allchance;//數(shù)值不符合要求,退出函數(shù)}else if(twostarchance<0||threestarchance<0) {System.out.println("☆☆/☆☆☆概率<0!");return allchance;}} else {System.out.println("輸入的不是小數(shù)!");return allchance;}double onestarchance=1-twostarchance-threestarchance;System.out.println("概率分別是:");System.out.println("☆概率:"+onestarchance);System.out.println("☆☆概率:"+twostarchance);System.out.println("☆☆☆概率:"+threestarchance);allchance[0]=onestarchance;allchance[1]=twostarchance;allchance[2]=threestarchance;return allchance;} /*-------------------------------------------------------------------------------------------*/ public double UpChance() {//是否概率Updouble upchance=0;System.out.print("請輸入up概率(小數(shù))(0代表不up):");if (sc.hasNextDouble()) {upchance=sc.nextDouble();if(upchance>1) {System.out.println("Up概率超過100%!");return -1;}else if(upchance<0) {System.out.println("Up概率<0!");return -1;}} else {System.out.println("輸入的不是小數(shù)!");return -1;}System.out.println("Up概率是:");System.out.println(upchance);return upchance;} /*-------------------------------------------------------------------------------------------*/ public int MinimumGuarantee() {//是否保底int minimumguarantee=0;System.out.print("請輸入保底數(shù)(整數(shù))(0代表無保底):");if (sc.hasNextInt()) {minimumguarantee=sc.nextInt();if(minimumguarantee<0) {System.out.println("保底不可為負(fù)數(shù)");return -1;}} else {System.out.println("輸入的不是整數(shù)!");return -1;}System.out.println("保底數(shù)是:");System.out.println(minimumguarantee);return minimumguarantee;} /*-------------------------------------------------------------------------------------------*/ }

LuckyDraw(單抽、十連抽算法)

package 抽卡系統(tǒng);public class LuckyDraw {/** 進(jìn)行單抽或十連抽* 包含主要抽卡算法*/ public static int counter=0;//類變量,統(tǒng)計(jì)已抽次數(shù)public static int flag1=0;//類變量,小保底計(jì)數(shù)器,統(tǒng)計(jì)多少抽未出小保底,用來計(jì)算小保底(出小保底后清零)public static int flag2=0;//類變量,大保底計(jì)數(shù)器,統(tǒng)計(jì)多少抽未出大保底,用來計(jì)算大保底(出大保底后清零) /*-------------------------------------------------------------------------------------------*/ public String[] LuckyDrawTen(double allchance[],double upchance,int minimumguarantee){//十連抽,將結(jié)果儲存在字符串?dāng)?shù)組中String[] result = new String[10];for(int i=0;i<10;i++){result[i]=Draw(allchance,upchance,minimumguarantee);}return result;//返回字符串?dāng)?shù)組} /*-------------------------------------------------------------------------------------------*/public String LuckyDrawOne(double allchance[],double upchance,int minimumguarantee){//單抽,將結(jié)果儲存在字符串中String result=Draw(allchance,upchance,minimumguarantee);return result;//返回字符串} /*-------------------------------------------------------------------------------------------*/ public String Draw(double allchance[],double upchance,int minimumguarantee) {//抽卡算法String str="Null";if(flag2!=minimumguarantee-1&&flag1==9)//十連保底(小保底),條件:不觸發(fā)大保底且累計(jì)九次都未出☆☆/☆☆☆(flag1=9)//結(jié)果:出☆☆/☆☆☆{flag2++;int per=(int) (Math.random() * 101); if(per>=0&&per<=allchance[0]*100+allchance[1]*100) {//出☆☆str="☆☆";flag1=0;//出☆☆,清零小保底計(jì)數(shù)器counter++;return str;}else {//出☆☆☆,判斷是否是up☆☆☆flag2=0;//出☆☆☆,清零大保底計(jì)數(shù)器flag1=0;//同時(shí)清零小保底計(jì)數(shù)器int mgper=(int) (Math.random() * 101);if(upchance!=0&&mgper>=0&&mgper<=upchance*100) {//有概率up且抽到概率upstr="限定☆☆☆"; counter++;return str;}else if(upchance==0){//無概率upstr="☆☆☆"; counter++;return str;}else {//有概率up但未抽到str="普通☆☆☆";counter++;return str;}} }else if(minimumguarantee!=0&&flag2==minimumguarantee-1)//大保底,條件:存在大保底且已抽次數(shù)等于大保底前一次且仍未出☆☆☆//出☆☆☆{flag2=0;//出☆☆☆,清零大保底計(jì)數(shù)器flag1=0;//同時(shí)清零小保底計(jì)數(shù)器int mgper=(int) (Math.random() * 101);//判斷是否是限定☆☆☆if(upchance!=0&&mgper>=0&&mgper<=upchance*100) {//有概率up且抽到概率upstr="限定☆☆☆";}else if(upchance==0) {//無概率upstr="☆☆☆";}else{//有概率up但未抽到str="普通☆☆☆";}counter++; return str; }else//隨機(jī)判斷概率,出☆/☆☆/☆☆☆{int per=(int) (Math.random() * 101);if(per>=0&&per<=allchance[0]*100) {//出☆str="☆";counter++;flag1++;flag2++;return str;}else if(per>=allchance[0]*100+1&&per<=allchance[0]*100+allchance[1]*100) {//出☆☆str="☆☆";flag1=0;//出☆☆,清零小保底計(jì)數(shù)器flag2++;counter++;return str;}else {//出☆☆☆,判斷是否是up☆☆☆flag2=0;//出☆☆☆,清零大保底計(jì)數(shù)器flag1=0;//同時(shí)清零小保底計(jì)數(shù)器int mgper=(int) (Math.random() * 101);if(upchance!=0&&mgper>=0&&mgper<=upchance*100) {//有概率up且抽到概率upstr="限定☆☆☆"; counter++;return str;}else if(upchance==0){//無概率upstr="☆☆☆"; counter++;return str;}else {//有概率up但未抽到str="普通☆☆☆"; counter++;return str;}}}} /*-------------------------------------------------------------------------------------------*/}

Main(在控制臺輸出抽卡結(jié)果,便于測試)

package 抽卡系統(tǒng);public class Main {public static void main(String[] args) {Setting s=new Setting();LuckyDraw ld =new LuckyDraw();System.out.println("您的單次抽卡結(jié)果是:");System.out.println(ld.LuckyDrawOne(s.Chance(), s.UpChance(), s.MinimumGuarantee()));System.out.println("您的十連抽卡結(jié)果是:");String []results=ld.LuckyDrawTen(s.Chance(), s.UpChance(), s.MinimumGuarantee());for(int i=0;i<10;i++) {System.out.println(results[i]);}System.out.println("已抽:"+LuckyDraw.counter);s.sc.close();}}

輸出結(jié)果

Window(創(chuàng)建窗口)

package 抽卡系統(tǒng); import java.awt.*;public class Window {public static void main(String[] args) {ComponentInWindow win=new ComponentInWindow();ButtonListener1 bl1=new ButtonListener1();win.setCommandListener1(bl1);ButtonListener2 bl2=new ButtonListener2();win.setCommandListener2(bl2);win.setBackground(Color.white);win.setBounds(400,100,800,800);win.setTitle("抽卡系統(tǒng)"); } }

ComponentInWindow(設(shè)置組件)

package 抽卡系統(tǒng); import javax.swing.*; import java.awt.*;public class ComponentInWindow extends JFrame{JTextField ChanceTextField,UpChanceTextField,MinimumGuaranteeTextField;JLabel ChanceLabel,UpChanceLabel,MinimumGuaranteeLabel;JButton OneDrawButton,TenDrawsButton;JTextArea results;CommandListener listener1;public ComponentInWindow(){init();setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}void init() {//初始化,添加組件setLayout(new FlowLayout());//流式布局ChanceTextField=new JTextField(10);//創(chuàng)建三個文本框,來獲取輸入的概率UpChanceTextField=new JTextField(10);MinimumGuaranteeTextField=new JTextField(10);ChanceLabel=new JLabel("概率");//創(chuàng)建三個標(biāo)簽,表明文本框內(nèi)容UpChanceLabel=new JLabel("Up概率");MinimumGuaranteeLabel=new JLabel("保底數(shù)");add(ChanceLabel);add(ChanceTextField);add(UpChanceLabel);add(UpChanceTextField);add(MinimumGuaranteeLabel);add(MinimumGuaranteeTextField);OneDrawButton=new JButton("單次抽取");//創(chuàng)建兩個按鈕TenDrawsButton=new JButton("十連抽取");add(OneDrawButton);add(TenDrawsButton);results=new JTextArea(38,28);//創(chuàng)建文本區(qū)add(results);JScrollPane jsp=new JScrollPane(results);//創(chuàng)建滾動條results.setEditable(false);add(jsp);}void setCommandListener1(CommandListener listener) {//給單抽按鈕添加單抽按鈕監(jiān)視器this.listener1=listener;listener1.setJTextField(ChanceTextField,UpChanceTextField,MinimumGuaranteeTextField); listener1.setJTextArea(results);OneDrawButton.addActionListener(listener1); }void setCommandListener2(CommandListener listener) {//給十連按鈕添加十連按鈕監(jiān)視器this.listener1=listener;listener1.setJTextField(ChanceTextField,UpChanceTextField,MinimumGuaranteeTextField);listener1.setJTextArea(results);TenDrawsButton.addActionListener(listener1);}}

由于我比較懶,所以用了流式布局。如果你想讓窗口上各組件更加整齊,可以單獨(dú)設(shè)置各組件的大小和位置。

CommandListener (提供接口,由ButtonListener1和ButtonListener2來實(shí)現(xiàn))

package 抽卡系統(tǒng); import java.awt.event.*; import javax.swing.*;public interface CommandListener extends ActionListener{public void setJTextField(JTextField fieldtext1,JTextField fieldtext2,JTextField fieldtext3);public void setJTextArea(JTextArea areatext); }

ButtonListener1(單抽按鈕監(jiān)視器)

數(shù)據(jù)庫的連接和存儲都直接放在了actionPerformed()方法中。如果想要寫的更規(guī)范的話可以單獨(dú)封裝一下。
不需要的話可以直接刪除“//-------------------------------------------------------”中間的部分。
注:數(shù)據(jù)庫使用的是SQL Sever。

package 抽卡系統(tǒng); import java.awt.event.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.*; import javax.swing.*;public class ButtonListener1 implements CommandListener{//單抽按鈕監(jiān)視器JTextField textInput1;JTextField textInput2;JTextField textInput3;JTextArea textShow;public void setJTextField(JTextField fieldtext1,JTextField fieldtext2,JTextField fieldtext3) {textInput1=fieldtext1;textInput2=fieldtext2;textInput3=fieldtext3;}public void setJTextArea(JTextArea areatext) {textShow=areatext;}public void actionPerformed(ActionEvent e) {String str1=textInput1.getText();String str2=textInput2.getText();String str3=textInput3.getText();String cut=" ";String[] str4=str1.split(cut);//將從文本款中獲得的字符串轉(zhuǎn)化為字符串?dāng)?shù)組,通過分割" "實(shí)現(xiàn)double a1[]=new double[3];for(int i=0;i<3;i++) {//將字符串?dāng)?shù)組轉(zhuǎn)化為double數(shù)組a1[i]=Double.parseDouble(str4[i]);}double a2=Double.parseDouble(str2);int a3=Integer.parseInt(str3);LuckyDraw ld =new LuckyDraw();String OneResult=ld.LuckyDrawOne(a1, a2, a3);//獲得單抽結(jié)果textShow.append("單抽\n"+OneResult+' ');String num1=String.valueOf(LuckyDraw.counter);textShow.append("已抽"+num1+' ');String num2=String.valueOf(LuckyDraw.flag2);textShow.append(num2+"抽未出大保底"+' ');String num3=String.valueOf(LuckyDraw.flag1);textShow.append(num3+"抽未出小保底"+'\n');textShow.append("---------------------------------------------------"+'\n'); //------------------------------------------------------- Connection conn=null;Statement stmt=null;ResultSet rs = null;//第一步加載驅(qū)動try {Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");}catch(ClassNotFoundException E) {E.printStackTrace();}//第二步建立連接try {conn=DriverManager.getConnection("jdbc:sqlserver://localhost:1433; DatabaseName=choukaxitong","sa","123");System.out.println("數(shù)據(jù)庫連接成功");String sql="insert into chouka (drawdata) values (?)";PreparedStatement pstm = conn.prepareStatement(sql);pstm.setString(1, OneResult);pstm.executeUpdate();System.out.println("插入成功...");System.out.println("插入數(shù)據(jù)成功");}catch(SQLException E) {E.printStackTrace();}finally {try {if(conn!=null) {conn.close();System.out.println("數(shù)據(jù)庫關(guān)閉成功");}}catch(SQLException E) {E.printStackTrace();}} //------------------------------------------------------- } }

ButtonListener2(十連按鈕監(jiān)視器)

同上,偷懶把數(shù)據(jù)庫的連接和存儲都直接放在了actionPerformed()方法中。
不需要的話可以直接刪除“//-------------------------------------------------------”中間的部分。
注:數(shù)據(jù)庫使用的是SQL Sever。

package 抽卡系統(tǒng);import java.awt.event.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;import javax.swing.*;public class ButtonListener2 implements CommandListener{//十連按鈕監(jiān)視器JTextField textInput1;JTextField textInput2;JTextField textInput3;JTextArea textShow;public void setJTextField(JTextField fieldtext1,JTextField fieldtext2,JTextField fieldtext3) {textInput1=fieldtext1;textInput2=fieldtext2;textInput3=fieldtext3;}public void setJTextArea(JTextArea areatext) {textShow=areatext;}public void actionPerformed(ActionEvent e) {String str1=textInput1.getText();String str2=textInput2.getText();String str3=textInput3.getText();String cut=" ";String[] str4=str1.split(cut);//將從文本款中獲得的字符串轉(zhuǎn)化為字符串?dāng)?shù)組,通過分割" "實(shí)現(xiàn)double a1[]=new double[3];for(int i=0;i<3;i++) {//將字符串?dāng)?shù)組轉(zhuǎn)化為double數(shù)組a1[i]=Double.parseDouble(str4[i]);}double a2=Double.parseDouble(str2);int a3=Integer.parseInt(str3);LuckyDraw ld =new LuckyDraw();String TenResults[]=ld.LuckyDrawTen(a1, a2, a3);//獲得十連結(jié)果String num1=String.valueOf(LuckyDraw.counter);String num2=String.valueOf(LuckyDraw.flag2);String num3=String.valueOf(LuckyDraw.flag1); //------------------------------------------------------- Connection conn=null;Statement stmt=null;ResultSet rs = null;//第一步加載驅(qū)動try {Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");}catch(ClassNotFoundException E) {E.printStackTrace();}//第二步建立連接try {conn=DriverManager.getConnection("jdbc:sqlserver://localhost:1433; DatabaseName=choukaxitong","sa","123");System.out.println("數(shù)據(jù)庫連接成功");for(int i=0;i<10;i++) {textShow.append(TenResults[i]+'\n');String sql="insert into chouka (drawdata) values (?)";PreparedStatement pstm = conn.prepareStatement(sql);pstm.setString(1, TenResults[i]);pstm.executeUpdate();}System.out.println("插入成功...");System.out.println("插入數(shù)據(jù)成功");}catch(SQLException E) {E.printStackTrace();}finally {try {if(conn!=null) {conn.close();System.out.println("數(shù)據(jù)庫關(guān)閉成功");}}catch(SQLException E) {E.printStackTrace();}} //------------------------------------------------------- textShow.append("已抽"+num1+' ');textShow.append(num2+"抽未出大保底"+' ');textShow.append(num3+"抽未出小保底"+'\n');textShow.append("十連"+'\n');textShow.append("---------------------------------------------------"+'\n');}}

輸出結(jié)果

數(shù)據(jù)庫存儲結(jié)果


代碼寫的不是很成熟,如果發(fā)現(xiàn)了什么問題還請指出,謝謝。

總結(jié)

以上是生活随笔為你收集整理的抽卡模拟系统(包含图形界面,结果可存储到数据库中)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。