一.使用說明
1.“構造規律展示區”僅僅記錄“智能算法區”的“石頭”、“剪刀”、“布”三個按鈕,目的是讓用戶自己構造稍有規律的出拳序列,方便用戶按照“智能算法區”自己構造的出拳序列去點擊“隨機算法區”的石頭”、“剪刀”、“布”三個按鈕,以對比兩個算法的優劣。
2.“智能算法區”的“隨機生成”按鈕中,人使用了隨機算法,計算機使用了智能算法;而“隨機算法區”的“隨機生成”按鈕中,人和計算機同時使用了隨機算法。
二.程序的適用範圍
本程序的智能算法,在每一拳都謹慎思考,並總結失敗的玩家身上,更能體現智能算法的優勢。
對於完全不經思考,快速出拳的玩家,由於隨機性太大,算法的優勢不明顯。當盤數超過200時,勝、敗率呈現統計學規律,基本穩定在0.30—0.36之間。
三.推測
1.經過人類意識作用的社會活動,基本上會呈現出某種規律。即人的意識是有規律,有模式可循的。根據每個人的思考習慣不同而不相同;
2.人思考的時間越長,是否規律性越強?
3.人的潛意識是否也存在規律或者模式?
package jiandaoshitoubu;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class jiandaoshitoubu {
public static void main(String[] args) {
GameFrame gf = new GameFrame();
gf.setVisible(true);
}
}
class GameFrame extends JFrame implements ActionListener{
private static final long serialVersionUID = -7985988417690464374L;
private int result,ren;
public JTextArea jtext= new JTextArea(28,28);
public JTextArea jtext2= new JTextArea(28,28);
public JTextArea jtext3= new JTextArea(24,32);
int sum=0,sum_ying=0,sum_shu=0;
int[] xulie_ren = new int[1000];
public GameFrame(){
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (ClassNotFoundException e2) {
e2.printStackTrace();
} catch (InstantiationException e2) {
e2.printStackTrace();
} catch (IllegalAccessException e2) {
e2.printStackTrace();
} catch (UnsupportedLookAndFeelException e2) {
e2.printStackTrace();
}
SwingUtilities.updateComponentTreeUI(this);
this.setTitle("剪刀石頭布");
setSize(1000,600);
this.setResizable(true);
setLocation(160,100);
JMenuBar mbar = new JMenuBar();
this.setJMenuBar(mbar);
JMenu gameMenu = new JMenu("遊戲");
mbar.add(makeMenu(gameMenu, new Object[] {
"開始","清除右邊兩個框的內容", null,"退出"
}, this));
JMenu lookMenu =new JMenu("視圖");
mbar.add(makeMenu(lookMenu,new Object[] {
"Metal","Motif","Windows"
},this));
JMenu helpMenu = new JMenu("幫助");
mbar.add(makeMenu(helpMenu, new Object[] {
"關於"
}, this));
JPanel gridPanel = new JPanel();
gridPanel.setLayout(new GridLayout(1,3));
JPanel Jpanel1 = new JPanel();
JPanel Jpanel2 = new JPanel();
JPanel Jpanel3 = new JPanel();
gridPanel.add(Jpanel1);
gridPanel.add(Jpanel2);
gridPanel.add(Jpanel3);
JLabel jlabel = new JLabel(" 智能算法區 ");
JButton jButtonJiandao = new JButton("剪刀");
JButton jButtonShitou = new JButton("石頭");
JButton jButtonBu = new JButton("布");
JButton jButton100 = new JButton("隨機生成100盤");
JButton jButton50 = new JButton("隨機生成50盤");
JButton jButton200 = new JButton("隨機生成200盤");
JButton jButton500 = new JButton("隨機生成500盤");
JButton jButton1000 = new JButton("隨機生成1000盤");
JLabel jlabel2 = new JLabel(" 隨機算法區 ");
JButton jButtonJiandaor = new JButton("剪刀");
JButton jButtonShitour = new JButton("石頭");
JButton jButtonBur = new JButton("布");
JButton jButton100r = new JButton("隨機生成100盤");
JButton jButton50r = new JButton("隨機生成50盤");
JButton jButton200r = new JButton("隨機生成200盤");
JButton jButton500r = new JButton("隨機生成500盤");
JButton jButton1000r = new JButton("隨機生成1000盤");
JLabel jlabel3 = new JLabel(" 構造規律展示區 ");
Jpanel1.add(jlabel);
Jpanel1.add(jButtonJiandao);
Jpanel1.add(jButtonShitou);
Jpanel1.add(jButtonBu);
Jpanel1.add(jButton50);
Jpanel1.add(jButton100);
Jpanel1.add(jButton200);
Jpanel1.add(jButton500);
Jpanel1.add(jButton1000);
Jpanel1.add(jlabel2);
Jpanel1.add(jButtonJiandaor);
Jpanel1.add(jButtonShitour);
Jpanel1.add(jButtonBur);
Jpanel1.add(jButton50r);
Jpanel1.add(jButton100r);
Jpanel1.add(jButton200r);
Jpanel1.add(jButton500r);
Jpanel1.add(jButton1000r);
Jpanel1.add(jlabel3);
Jpanel1.add(jtext3);
jButtonJiandao.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ren=0;
xulie_ren[sum]= 0;
sum++;
result=Algroithm();
judge(result,ren);
jtext2.append(sum+":此時,您的勝率爲"+String.format("%.2f",(double)sum_ying/sum)+";計算機的勝率爲"+String.format("%.2f",(double)sum_shu/sum)+"\n");
jtext3.append("剪刀—>");
}
});
jButtonShitou.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ren=1;
xulie_ren[sum]= 1;
sum++;
result=Algroithm();
judge(result,ren);
jtext2.append(sum+":此時,您的勝率爲"+String.format("%.2f",(double)sum_ying/sum)+";計算機的勝率爲"+String.format("%.2f",(double)sum_shu/sum)+"\n");
jtext3.append("石頭—>");
}
});
jButtonBu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ren=2;
xulie_ren[sum]= 2;
sum++;
result=Algroithm();
judge(result,ren);
jtext2.append(sum+":此時,您的勝率爲"+String.format("%.2f",(double)sum_ying/sum)+";計算機的勝率爲"+String.format("%.2f",(double)sum_shu/sum)+"\n");
jtext3.append("布—>");
}
});
jButton50.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sum=0;sum_ying=0;sum_shu=0;
try {
finalize();
} catch (Throwable e1) {
e1.printStackTrace();
}
int[] xulie_ren = new int[50];
jtext.setText("");
jtext2.setText("");
for(int n=0;n<50;n++)
{
int number = new Random().nextInt(3);
ren=number;
xulie_ren[sum]= number;
sum++;
result=Algroithm();
judge(result,ren);
jtext2.append(sum+":此時,您的勝率爲"+String.format("%.2f",(double)sum_ying/sum)+";計算機的勝率爲"+String.format("%.2f",(double)sum_shu/sum)+"\n");
}
}
});
jButton100.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sum=0;sum_ying=0;sum_shu=0;
try {
finalize();
} catch (Throwable e1) {
e1.printStackTrace();
}
int[] xulie_ren = new int[100];
jtext.setText("");
jtext2.setText("");
for(int n=0;n<100;n++)
{
int number = new Random().nextInt(3);
ren=number;
xulie_ren[sum]= number;
sum++;
result=Algroithm();
judge(result,ren);
jtext2.append(sum+":此時,您的勝率爲"+String.format("%.2f",(double)sum_ying/sum)+";計算機的勝率爲"+String.format("%.2f",(double)sum_shu/sum)+"\n");
}
}
});
jButton200.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sum=0;sum_ying=0;sum_shu=0;
try {
finalize();
} catch (Throwable e1) {
e1.printStackTrace();
}
int[] xulie_ren = new int[200];
jtext.setText("");
jtext2.setText("");
for(int n=0;n<200;n++)
{
int number = new Random().nextInt(3);
ren=number;
xulie_ren[sum]= number;
sum++;
result=Algroithm();
judge(result,ren);
jtext2.append(sum+":此時,您的勝率爲"+String.format("%.2f",(double)sum_ying/sum)+";計算機的勝率爲"+String.format("%.2f",(double)sum_shu/sum)+"\n");
}
}
});
jButton500.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sum=0;sum_ying=0;sum_shu=0;
try {
finalize();
} catch (Throwable e1) {
e1.printStackTrace();
}
int[] xulie_ren = new int[500];
jtext.setText("");
jtext2.setText("");
for(int n=0;n<500;n++)
{
int number = new Random().nextInt(3);
ren=number;
xulie_ren[sum]= number;
sum++;
result=Algroithm();
judge(result,ren);
jtext2.append(sum+":此時,您的勝率爲"+String.format("%.2f",(double)sum_ying/sum)+";計算機的勝率爲"+String.format("%.2f",(double)sum_shu/sum)+"\n");
}
}
});
jButton1000.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sum=0;sum_ying=0;sum_shu=0;
try {
finalize();
} catch (Throwable e1) {
e1.printStackTrace();
}
int[] xulie_ren = new int[1000];
jtext.setText("");
jtext2.setText("");
for(int n=0;n<1000;n++)
{
int number = new Random().nextInt(3);
ren=number;
xulie_ren[sum]= number;
sum++;
result=Algroithm();
judge(result,ren);
jtext2.append(sum+":此時,您的勝率爲"+String.format("%.2f",(double)sum_ying/sum)+";計算機的勝率爲"+String.format("%.2f",(double)sum_shu/sum)+"\n");
}
}
});
/*==================================華麗的分割線=========================================*/
jButtonJiandaor.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ren=0;
xulie_ren[sum]= 0;
sum++;
result=Algroithm_random();
judge(result,ren);
jtext2.append(sum+":此時,您的勝率爲"+String.format("%.2f",(double)sum_ying/sum)+";計算機的勝率爲"+String.format("%.2f",(double)sum_shu/sum)+"\n");
}
});
jButtonShitour.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ren=1;
xulie_ren[sum]= 1;
sum++;
result=Algroithm_random();
judge(result,ren);
jtext2.append(sum+":此時,您的勝率爲"+String.format("%.2f",(double)sum_ying/sum)+";計算機的勝率爲"+String.format("%.2f",(double)sum_shu/sum)+"\n");
}
});
jButtonBur.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ren=2;
xulie_ren[sum]= 2;
sum++;
result=Algroithm_random();
judge(result,ren);
jtext2.append(sum+":此時,您的勝率爲"+String.format("%.2f",(double)sum_ying/sum)+";計算機的勝率爲"+String.format("%.2f",(double)sum_shu/sum)+"\n");
}
});
jButton50r.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sum=0;sum_ying=0;sum_shu=0;
try {
finalize();
} catch (Throwable e1) {
e1.printStackTrace();
}
int[] xulie_ren = new int[50];
jtext.setText("");
jtext2.setText("");
for(int n=0;n<50;n++)
{
int number = new Random().nextInt(3);
ren=number;
xulie_ren[sum]= number;
sum++;
result=Algroithm_random();
judge(result,ren);
jtext2.append(sum+":此時,您的勝率爲"+String.format("%.2f",(double)sum_ying/sum)+";計算機的勝率爲"+String.format("%.2f",(double)sum_shu/sum)+"\n");
}
}
});
jButton100r.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sum=0;sum_ying=0;sum_shu=0;
try {
finalize();
} catch (Throwable e1) {
e1.printStackTrace();
}
int[] xulie_ren = new int[100];
jtext.setText("");
jtext2.setText("");
for(int n=0;n<100;n++)
{
int number = new Random().nextInt(3);
ren=number;
xulie_ren[sum]= number;
sum++;
result=Algroithm_random();
judge(result,ren);
jtext2.append(sum+":此時,您的勝率爲"+String.format("%.2f",(double)sum_ying/sum)+";計算機的勝率爲"+String.format("%.2f",(double)sum_shu/sum)+"\n");
}
}
});
jButton200r.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sum=0;sum_ying=0;sum_shu=0;
try {
finalize();
} catch (Throwable e1) {
e1.printStackTrace();
}
int[] xulie_ren = new int[200];
jtext.setText("");
jtext2.setText("");
for(int n=0;n<200;n++)
{
int number = new Random().nextInt(3);
ren=number;
xulie_ren[sum]= number;
sum++;
result=Algroithm_random();
judge(result,ren);
jtext2.append(sum+":此時,您的勝率爲"+String.format("%.2f",(double)sum_ying/sum)+";計算機的勝率爲"+String.format("%.2f",(double)sum_shu/sum)+"\n");
}
}
});
jButton500r.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sum=0;sum_ying=0;sum_shu=0;
try {
finalize();
} catch (Throwable e1) {
e1.printStackTrace();
}
int[] xulie_ren = new int[500];
jtext.setText("");
jtext2.setText("");
for(int n=0;n<500;n++)
{
int number = new Random().nextInt(3);
ren=number;
xulie_ren[sum]= number;
sum++;
result=Algroithm_random();
judge(result,ren);
jtext2.append(sum+":此時,您的勝率爲"+String.format("%.2f",(double)sum_ying/sum)+";計算機的勝率爲"+String.format("%.2f",(double)sum_shu/sum)+"\n");
}
}
});
jButton1000r.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sum=0;sum_ying=0;sum_shu=0;
try {
finalize();
} catch (Throwable e1) {
e1.printStackTrace();
}
int[] xulie_ren = new int[1000];
jtext.setText("");
jtext2.setText("");
for(int n=0;n<1000;n++)
{
int number = new Random().nextInt(3);
ren=number;
xulie_ren[sum]= number;
sum++;
result=Algroithm_random();
judge(result,ren);
jtext2.append(sum+":此時,您的勝率爲"+String.format("%.2f",(double)sum_ying/sum)+";計算機的勝率爲"+String.format("%.2f",(double)sum_shu/sum)+"\n");
}
}
});
jtext.setLineWrap(true);
Font x = new Font("黑體",1,18);
jtext.setFont(x);
JScrollPane scroll=new JScrollPane(jtext);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
jtext.setCaretPosition(jtext.getText().length());
Jpanel2.add(scroll);
jtext2.setLineWrap(true);
Font x2 = new Font("黑體",1,18);
jtext2.setFont(x2);
JScrollPane scroll2=new JScrollPane(jtext2);
scroll2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scroll2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
jtext2.setCaretPosition(jtext2.getText().length());
Jpanel3.add(scroll2);
jtext3.setLineWrap(true);
Font x3 = new Font("黑體",1,14);
jtext3.setFont(x3);
JScrollPane scroll3=new JScrollPane(jtext3);
scroll3.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scroll3.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
jtext3.setCaretPosition(jtext3.getText().length());
Jpanel1.add(scroll3);
add(gridPanel,BorderLayout.CENTER);
}
public void judge(int count,int ren)
{
if((count == 0 && ren ==0)||(count == 1 && ren ==1)||(count == 2 && ren ==2)) //剪刀
{
if(count == 0)
jtext.append(sum+":平局。你出的剪刀,計算機出的也是剪刀。"+"\n");
else if(count == 1)
jtext.append(sum+":平局。你出的石頭,計算機出的也是石頭。"+"\n");
else
jtext.append(sum+":平局。你出的布,計算機出的也是布。"+"\n");
}
else if(count == 0 && ren == 1)
{
jtext.append(sum+":你贏了。你出的石頭,計算機出的是剪刀。"+"\n");
sum_ying++;
}
else if(count == 0 && ren == 2)
{
jtext.append(sum+":你輸了。你出的布,計算機出的是剪刀。"+"\n");
sum_shu++;
}
else if(count == 1 && ren == 2)
{
jtext.append(sum+":你贏了。你出的布,計算機出的是石頭。"+"\n");
sum_ying++;
}
else if(count == 1 && ren == 0)
{
jtext.append(sum+":你輸了。你出的剪刀,計算機出的是石頭。"+"\n");
sum_shu++;
}
else if(count == 2 && ren == 0)
{
jtext.append(sum+":你贏了。你出的剪刀,計算機出的是布。"+"\n");
sum_ying++;
}
else if(count == 2 && ren == 1)
{
jtext.append(sum+":你輸了。你出的石頭,計算機出的是布。"+"\n");
sum_shu++;
}
}
public int Algroithm_random() //石頭剪刀布核心算法
{
int number = new Random().nextInt(3);
return number;
}
public int Algroithm() //石頭剪刀布核心算法
{
if(sum == 1 || sum ==2)
{
int number = new Random().nextInt(3);
return number;
}
else
{
for(int n=2;sum-n>0;n++)
{
//長度爲n模式下的預測
if(search(n)==0) //下一把預測人出剪刀的概率大於0.5
return 1;
else if(search(n)==1)//下一把預測人出石頭的概率大於0.5
return 2;
else if(search(n)==2)//下一把預測人出布的概率大於0.5
return 0;
else if(search(n)==-1)//當前字符含本身的前n-1字符串在其本身之前不存在
{
int number = new Random().nextInt(3);
return number;
}
else//下一把預測人的拳型中沒有大於0.5的拳型
continue;
}
int number = new Random().nextInt(3);
return number;
}
}
public int search(int len)
{
int jiandao=0,shitou=0,bu=0,sum1;
for(int i=0;i<=sum-1-len;i++)
{
int j;
for(j=0;j<len-1;j++)
{
if(xulie_ren[i+j]!=xulie_ren[sum-len+j])
break;
}
if(j==len-1)
{
if(xulie_ren[i+j]==0)
jiandao++;
else if(xulie_ren[i+j]==1)
shitou++;
else
bu++;
}
}
if(jiandao==0&&shitou==0&&bu==0)
return -1;
sum1=jiandao+shitou+bu;
if((double)(jiandao/sum1)>0.5)
return 0;
if((double)(shitou/sum1)>0.5)
return 1;
if((double)(bu/sum1)>0.5)
return 2;
return -2;
}
public JMenu makeMenu(Object parent, Object items[], Object target)
{
JMenu m = null;
if(parent instanceof JMenu)
m = (JMenu)parent;
else if(parent instanceof String)
m = new JMenu((String)parent);
else
return null;
for(int i = 0; i < items.length; i++)
if(items[i] == null)
m.addSeparator();
else
m.add(makeMenuItem(items[i], target));
return m;
}
public JMenuItem makeMenuItem(Object item, Object target){
JMenuItem r = null;
if(item instanceof String)
r = new JMenuItem((String)item);
else if(item instanceof JMenuItem)
r = (JMenuItem)item;
else
return null;
if(target instanceof ActionListener)
r.addActionListener((ActionListener)target);
return r;
}
//構造剪刀石頭布遊戲的單選按鈕式菜單項
public JRadioButtonMenuItem makeRadioButtonMenuItem(
Object item, Object target){
JRadioButtonMenuItem r = null;
if(item instanceof String)
r = new JRadioButtonMenuItem((String)item);
else if(item instanceof JRadioButtonMenuItem)
r = (JRadioButtonMenuItem)item;
else
return null;
if(target instanceof ActionListener)
r.addActionListener((ActionListener)target);
return r;
}
public void restart(){
}
public void actionPerformed(ActionEvent e){
String arg=e.getActionCommand();
try{
if (arg.equals("Windows"))
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
else if(arg.equals("Motif"))
UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
else if(arg.equals("Metal"))
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel" );
SwingUtilities.updateComponentTreeUI(this);
}catch(Exception ee){}
if(arg.equals("開始"))
{
sum=0;sum_ying=0;sum_shu=0;
try {
finalize();
} catch (Throwable e1) {
e1.printStackTrace();
}
jtext.setText("");
jtext2.setText("");
jtext3.setText("");
}
if(arg.equals("清除右邊兩個框的內容"))
{
jtext3.append("共"+sum+"盤,計算機勝率爲"+String.format("%.2f",(double)sum_shu/sum)+"\n");
sum=0;sum_ying=0;sum_shu=0;
try {
finalize();
} catch (Throwable e1) {
e1.printStackTrace();
}
jtext.setText("");
jtext2.setText("");
}
if(arg.equals("關於"))
JOptionPane.showMessageDialog(this, "剪刀石頭布程序僅爲本人的業餘研究,歡迎提供改進意見~~——By qq:996169482", "關於", 0);
if(arg.equals("退出"))
System.exit(0);
}
}
</pre><pre name="code" class="java"><p>
</p>