游戏规则:[请玩家仔细阅读]
(1)点击开始游戏进行游戏,玩家初始积分是40分,当玩家积分超过100分时,玩家赢,低于0分时,玩家输;
(2)游戏开始时,会自动随机生成一定可以通过四则运算得到24的四张扑克牌【J、Q、K、大小鬼记作10】;
(3)游戏过程中,玩家可以刷新扑克牌,但每刷新一次都会扣3分;
(4)玩家将四张扑克牌,用+、-、*、/及适当的括号组合起来,并把组合的表达式【用英文输入法】填到输入框里面【注意每张纸牌只可以使用一次】;
(5)单击确定按钮,游戏将会判断你输入的表达式是否符合数学规律,及是否为游戏显示的四张扑克牌的上的数字;
(6)如果输入合法,将系统将计算玩家所输入的表达式的值,如果正确则得5分,有鬼且正确加10分,错误扣2分;
(7)若玩家在1分30秒后才算出答案,则得4分,有鬼得8分,错误扣2分;
Java代码片段:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.URL;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
public class Calculate24 implements ActionListener{
JFrame frame=new JFrame();//创建窗口框架
Dimension screen=frame.getToolkit().getScreenSize();//获取显示器的分辨率
Container con=frame.getContentPane();//给窗体框架添加容器
TextField txtField=new TextField(30);//输入表达式的区域
JPanel Buttompnl=new JPanel(); //按钮和其他组件的面板
private int count=43;//初始积分40
JLabel Title=new JLabel("欢迎使用头脑风暴之心算24点----刘学炜、范碧天、许培涛、陈燕茜同组合作设计");
JTextArea Count=new JTextArea();//用于显示游戏规则及提示
MyTimer timeshow=new MyTimer();//显示时间
JPanel pokerPanel=new JPanel();//显示扑克牌的面板
JButton btnStart=new JButton("开始游戏/洗牌");//开始游戏和刷牌的按钮
JButton btnOk=new JButton("确定");//确定按钮
Label label=new Label("请输入表达式:");//显示输入表达式
JLabel poker1=new JLabel();//显示四张扑克牌
JLabel poker2=new JLabel();
JLabel poker3=new JLabel();
JLabel poker4=new JLabel();
private Check c=new Check();//引入check类的对象
Random ran=new Random();//引入随机函数类对象
private float [] myStatus=new float[4];//四张扑克牌上对应的数字
private char [] mystatus=new char[4];//四张扑克牌上对应的花色
private float[] numbers=new float[4];//输入表达式的四个数字
private float[] different=new float[4];//调整积分的差别
private boolean addscore=false;//判断是否加双倍积分
Calculate24(){
frame.setTitle("头脑风暴之心算24点");
Count.setEditable(false);
Count.setLineWrap(true);
Count.setWrapStyleWord(true);
Count.setSize(600, 85);
Count.setBackground(new Color(18,132,57));
Count.setText("游戏规则:[请玩家仔细阅读]" +
"\n(1)点击开始游戏进行游戏,玩家初始积分是40分,当玩家积分超过100分时,玩家赢,低于0分时,玩家输;" +
"\n(2)游戏开始时,会自动随机生成一定可以通过四则运算得到24的四张扑克牌【J、Q、K、大小鬼记作10】;" +
"\n(3)游戏过程中,玩家可以刷新扑克牌,但每刷新一次都会扣3分;"+
"\n(4)玩家将四张扑克牌,用+、-、*、/及适当的括号组合起来,并把组合的表达式【用英文输入法】填到输入框里面【注意每张纸牌只可以使用一次】;"+
"\n(5)单击确定按钮,游戏将会判断你输入的表达式是否符合数学规律,及是否为游戏显示的四张扑克牌的上的数字;"+
"\n(6)如果输入合法,将系统将计算玩家所输入的表达式的值,如果正确则得5分,有鬼且正确加10分,错误扣2分;" +
"\n(7)若玩家在1分30秒后才算出答案,则得4分,有鬼得8分,错误扣2分;"
);
//界面组件的相关设计
con.add(Title,BorderLayout.NORTH);
con.add(Buttompnl,BorderLayout.SOUTH);
con.add(pokerPanel,BorderLayout.CENTER);
Buttompnl.add(btnStart);
Buttompnl.add(label);
Buttompnl.add(txtField);
btnStart.setActionCommand("start");
btnStart.addActionListener(this);//添加开始按钮监听器
btnOk.setActionCommand("ok");
btnOk.addActionListener(this); //添加确定按钮监听器
pokerPanel.add(poker1);
pokerPanel.add(poker2);
pokerPanel.add(poker3);
pokerPanel.add(poker4);
pokerPanel.add(Count,BorderLayout.SOUTH);
}
//监听器设计
public void actionPerformed(ActionEvent e) {
//按下开始按钮
Count.setFont(new Font("Dialog",Font.PLAIN,20));
if(e.getActionCommand().equals("start")){
timeshow.usedTime=0;//时间归零
timeshow.timer.start(); //开始计时
Buttompnl.add(btnOk);
Buttompnl.add(timeshow.usedTimeLabel);
timeshow.timeText.setText("0分0秒");
Buttompnl.add(timeshow.timeText);
count-=3;//刷牌扣3分
Count.setText("\n\n您目前的积分是:"+count+
"\n上一道题的系统答案是:"+c.outputs);
try{for(int i=0;i<4;i++){
myStatus[i]=(float) ((int)(ran.nextFloat()*14+1));//随机产生四张牌
mystatus[i]=(char) ('A'+(int)(ran.nextFloat()*4));//随机产生花色
if(myStatus[i]>10f){//对J、Q、K、鬼作10处理
different[i]=myStatus[i]-10f;
myStatus[i]-=different[i];
}
else
different[i]=0f;
if(i==3&&!c.check(myStatus))//检验所产生的纸牌是否能够算出24
i=2;
}
if(count<0){//查看刷牌后剩余的积分是否小于0
timeshow.timer.stop();//停止计时
timeshow.usedTime=0;//重新时间归零
for(int i=0;i<4;i++){//返回初始界面
myStatus[i]=0f;
mystatus[i]='A';
}
NewPanel(myStatus,mystatus);
Buttompnl.remove(btnOk);
txtField.setText("");
Count.setFont(new Font("Dialog",Font.PLAIN,12));
Count.setText("游戏规则:[请玩家仔细阅读]" +
"\n(1)点击开始游戏进行游戏,玩家初始积分是40分,当玩家积分超过100分时,玩家赢,低于0分时,玩家输;" +
"\n(2)游戏开始时,会自动随机生成一定可以通过四则运算得到24的四张扑克牌【J、Q、K、大小鬼记作10】;" +
"\n(3)游戏过程中,玩家可以刷新扑克牌,但每刷新一次都会扣3分;"+
"\n(4)玩家将四张扑克牌,用+、-、*、/及适当的括号组合起来,并把组合的表达式【用英文输入法】填到输入框里面【注意每张纸牌只可以使用一次】;"+
"\n(5)单击确定按钮,游戏将会判断你输入的表达式是否符合数学规律,及是否为游戏显示的四张扑克牌的上的数字;"+
"\n(6)如果输入合法,将系统将计算玩家所输入的表达式的值,如果正确则得5分,有鬼且正确加10分,错误扣2分;" +
"\n(7)若玩家在1分30秒后才算出答案,则得4分,有鬼得8分,错误扣2分;"
);
count=43;//初始积分40
new MasgDlg(this,"对不起,挑战失败!重新游戏请按【确定】,退出游戏请按【退出】");
}
else{
for(int i=0;i<4;i++)
myStatus[i]+=different[i];
NewPanel(myStatus,mystatus);//显示生成的四张扑克牌
for(int i=0;i<4;i++){
myStatus[i]-=different[i];
if(different[i]==4)//双倍加分条件,遇鬼
addscore=true;
}
}
}catch(Exception e1){
}
}
//按下确定按钮
else if (e.getActionCommand().equals("ok")){
try{float result=calculateString(txtField.getText().trim());
if(result==-1f){//输入不合法,或者没有输入正确的数字
txtField.requestFocus();
new MsgDlg("您输入的表达式不合法或你使用的数字不是扑克牌上的数字,请重新输入!",this);
}else if(result!=24f){//输入合法,但计算结果不是24
timeshow.usedTime-=8%60;//减去输入时间
count-=2; //错误扣2分
if(count<0){ //判断积分是否小于0
timeshow.timer.stop();
timeshow.usedTime=0;
timeshow.timeText.setText("0分0秒");
for(int i=0;i<4;i++){//返回初始界面
myStatus[i]=0f;
mystatus[i]='A';
}
NewPanel(myStatus,mystatus);
Buttompnl.remove(btnOk);
txtField.setText("");
Count.setFont(new Font("Dialog",Font.PLAIN,12));
Count.setText("游戏规则:[请玩家仔细阅读]" +
"\n(1)点击开始游戏进行游戏,玩家初始积分是40分,当玩家积分超过100分时,玩家赢,低于0分时,玩家输;" +
"\n(2)游戏开始时,会自动随机生成一定可以通过四则运算得到24的四张扑克牌【J、Q、K、大小鬼记作10】;" +
"\n(3)游戏过程中,玩家可以刷新扑克牌,但每刷新一次都会扣3分;"+
"\n(4)玩家将四张扑克牌,用+、-、*、/及适当的括号组合起来,并把组合的表达式【用英文输入法】填到输入框里面【注意每张纸牌只可以使用一次】;"+
"\n(5)单击确定按钮,游戏将会判断你输入的表达式是否符合数学规律,及是否为游戏显示的四张扑克牌的上的数字;"+
"\n(6)如果输入合法,将系统将计算玩家所输入的表达式的值,如果正确则得5分,有鬼且正确加10分,错误扣2分;" +
"\n(7)若玩家在1分30秒才算出答案,则得4分,有鬼得8分,错误扣2分;"
);
count=43;
new MasgDlg(this,"对不起,挑战失败!重新游戏请按【确定】,退出游戏请按【退出】");
}
else//输出用户所输入的表达式的值
{
Count.setText("\n您目前的积分是:"+count+"\n对不起,您输入的表达式的值是"+result+",扣除2分,请重新输入!");
}
}else if(result==24f){//输入正确,得到24
timeshow.usedTime-=8%60;//减去输入时间
if(addscore){//遇鬼,双倍积分
addscore=false;
if(timeshow.usedTime>90){//遇鬼,超时加分方法
count+=8;
Count.setText("\n您目前的积分是:"+count+"\n恭喜你,你的输入正确!但超出1分30秒,获得8分奖励,请做下一道题"+
"\n上一道题的系统答案是:"+c.outputs);
}
else{//遇鬼,正常加分方法
count+=10;
Count.setText("\n您目前的积分是:"+count+"\n恭喜你,你的输入正确!获得10分奖励,请做下一道题" +
"\n上一道题的系统答案是:"+c.outputs);
}
}
else{//普通加分
if(timeshow.usedTime/60>=2){//超时,普通加分
count+=4;
Count.setText("\n您目前的积分是:"+count+"\n恭喜你,你的输入正确!但超出1分30秒,获得4分奖励,请做下一道题"+
"\n上一道题的系统答案是:"+c.outputs);
}
else{//普通加分
count+=5;
Count.setText("\n您目前的积分是:"+count+"\n恭喜你,你的输入正确!获得5分奖励,请做下一道题"+
"\n上一道题的系统答案是:"+c.outputs);
}
}
timeshow.usedTime = 0;
txtField.setText("");
txtField.requestFocus();
if(count>=100){
timeshow.timer.stop();
timeshow.usedTime=0;
timeshow.timeText.setText("0分0秒");
for(int i=0;i<4;i++){
myStatus[i]=0f;
mystatus[i]='A';
}
NewPanel(myStatus,mystatus);
Buttompnl.remove(btnOk);
txtField.setText("");
Count.setFont(new Font("Dialog",Font.PLAIN,12));
Count.setText("游戏规则:[请玩家仔细阅读]" +
"\n(1)点击开始游戏进行游戏,玩家初始积分是40分,当玩家积分超过100分时,玩家赢,低于0分时,玩家输;" +
"\n(2)游戏开始时,会自动随机生成一定可以通过四则运算得到24的四张扑克牌【J、Q、K、大小鬼记作10】;" +
"\n(3)游戏过程中,玩家可以刷新扑克牌,但每刷新一次都会扣3分;"+
"\n(4)玩家将四张扑克牌,用+、-、*、/及适当的括号组合起来,并把组合的表达式【用英文输入法】填到输入框里面【注意每张纸牌只可以使用一次】;"+
"\n(5)单击确定按钮,游戏将会判断你输入的表达式是否符合数学规律,及是否为游戏显示的四张扑克牌的上的数字;"+
"\n(6)如果输入合法,将系统将计算玩家所输入的表达式的值,如果正确则得5分,有鬼且正确加10分,错误扣2分;" +
"\n(7)若玩家在1分30秒后才算出答案,则得4分,有鬼得8分,错误扣2分;"
);
count=43;
new MasgDlg(this,"恭喜您,挑战成功!重新游戏请按【确定】,退出游戏请按【退出】");
}
else{
for(int i=0;i<4;i++){
myStatus[i]=(float) ((int)(ran.nextFloat()*14+1));
mystatus[i]=(char) ('A'+(int)(ran.nextFloat()*4));
if(myStatus[i]>10f){
different[i]=myStatus[i]-10f;
myStatus[i]-=different[i];
}
else
different[i]=0f;
if(i==3&&!c.check(myStatus))
i=2;
}
for(int i=0;i<4;i++)
myStatus[i]+=different[i];
NewPanel(myStatus,mystatus);
for(int i=0;i<4;i++){
myStatus[i]-=different[i];
if(different[i]==4)
addscore=true;
}
}
}
}catch(Exception e1){
e1.printStackTrace();
}
}
}
private float calculateString(String str) {
// 判断玩家输入的表达式的合法性
int LBracketNum=0;//记录左括号个数
int RBracketNum=0;//记录右括号个数
int LBracketPla = 0;//记录左括号位置和
int RBracketPla = 0;//记录右括号位置和
int []LeftBracket=new int[10];//存放左括号的位置
int []RightBracket=new int[10];//存放左括号的位置
String tempStr,myString="";//临时字符,数字字符
int numberNo=0,operatorNo=0;//数字个数,运算符个数
String[]operators=new String[4];//保存运算符
for(int i=0;i<4;i++){
operators[i]="";//运算符数组初始化
}
for(int i=0;i<str.length();i++){
tempStr=str.substring(i,i+1);//对玩家输入的字符串逐个检验
if(isNumber(tempStr)){//判断是否数字
myString+=tempStr;
}else if(isOperator(tempStr)){//判断是否运算符
if(numberNo>=4||operatorNo>=3)
return -1f;
try{
numbers[numberNo]=(float) Integer.parseInt(myString);//对输入的字符串中的数字,转换成浮点型
}catch(Exception e){
}
myString="";
numberNo++;//记录数字的个数
operators[operatorNo]=tempStr;
operatorNo++;//记录运算符的个数
}else if(isBracket(tempStr)){//判断是否括号
continue; //Do Nothing,跳出本次循环
}
else
return -1f;
}
if(myString.length()!=0&&numberNo==3){
try{
numbers[numberNo]=Float.parseFloat(myString);
}catch(Exception e){
return -1f;
}
}
numberNo=0;operatorNo=0;myString="";
for(int i=0;i<str.length();i++){
tempStr=str.substring(i,i+1);
if(isNumber(tempStr)){
myString+=tempStr;
if(numbers[numberNo]==Float.parseFloat(myString)){//判断数字是否一样,若一样则记录个数
numberNo++;
}
continue;
}
else if(isOperator(tempStr)){
operatorNo++;
myString="";
continue;
}
else if(isBracket(tempStr)){
myString="";
if(tempStr.equals("(")){//记录左括号个数
LBracketNum ++;
LeftBracket[LBracketNum-1]=numberNo+operatorNo+1;//记录每个左括号的位置
LBracketPla +=numberNo+operatorNo; //记录所有左括号的位置和
}
else {//用同样的方法处理右括号
RBracketNum ++;
RightBracket[RBracketNum-1]=numberNo+operatorNo+1;
RBracketPla +=numberNo+operatorNo;
}
}
}
if(LBracketNum==RBracketNum&&LBracketNum==0)//判断是否没有左右括号
{
;//Do Nothing
}
else if(LBracketNum!=RBracketNum||LBracketPla>=RBracketPla){//括号使用错误(不匹配)
return -1f;
}
for(int i1=0;i1<LeftBracket.length&&LeftBracket[i1]!=0;i1++){
if(LeftBracket[i1]%2==0||LeftBracket[i1]==7){//括号使用错误(左括号位置不正确)
return -1f;
}
}
for(int i1=0;i1<RightBracket.length&&LeftBracket[i1]!=0;i1++){
if(RightBracket[i1]%2!=0||RightBracket[i1]==2){//括号使用错误(右括号位置不正确)
return -1f;
}
}
if(!isRightNum())//判断用户输入的数字是否为扑克牌上的数字
return -1f;
//计算用户输入的表达式的值
else
{
float result=c.string_float(str);
return result;
}
}
private boolean isBracket(String str) {//判断是否为括号的方法
if(str.equals("(")||str.equals(")")){
return true;
}else
return false;
}
private boolean isNumber(String str) {//判断是否为数字的方法
if(str.equals("0")||str.equals("1")||str.equals("2")||str.equals("3")
||str.equals("4")||str.equals("5")||str.equals("6")||str.equals("7")
||str.equals("8")||str.equals("9")){
return true;
}
else
return false;
}
private boolean isOperator(String str) {//判断是否为运算符的方法
if(str.equals("+")||str.equals("-")||str.equals("*")||str.equals("/")){
return true;
}
else
return false;
}
private boolean isRightNum(){//判断表达式的数字就是扑克牌上的数字
float tempStatus[]=new float[4];
for(int i=0;i<4;i++){
tempStatus[i]=myStatus[i];
}
for(int i=0;i<4;i++){
int j=0;
boolean existed=false;
while(j<4&&!existed){
if(tempStatus[j]==numbers[i]){
tempStatus[j]=-1f;
existed=true;
}
j++;
}
if(!existed)
return false;
}
return true;
}
private void NewPanel(float[] a,char[] Tempb){//扑克牌面板
pokerPanel.setLayout(new FlowLayout());
int []Tempa=new int[4];
for(int i=0;i<4;i++){
Tempa[i]=(int)a[i];
System.out.print(Tempa[i]+""+Tempb[i]+" ");
}
System.out.println();
//装载图片
URL url1=getClass().getResource(Tempa[0]+""+Tempb[0]+".jpg");
URL url2=getClass().getResource(Tempa[1]+""+Tempb[1]+".jpg");
URL url3=getClass().getResource(Tempa[2]+""+Tempb[2]+".jpg");
URL url4=getClass().getResource(Tempa[3]+""+Tempb[3]+".jpg");
poker1.setIcon(new ImageIcon(url1));
poker2.setIcon(new ImageIcon(url2));
poker3.setIcon(new ImageIcon(url3));
poker4.setIcon(new ImageIcon(url4));
poker1.setBackground(new Color(18,152,57));
poker2.setBackground(new Color(18,152,57));
poker3.setBackground(new Color(18,152,57));
poker4.setBackground(new Color(18,152,57));
frame.setSize(650, 480);
pokerPanel.setBackground(new Color(18,132,57));
Buttompnl.setBackground(new Color(18,132,57));
frame.setLocation((screen.width-frame.getSize().width)/2, (screen.height-frame.getSize().height)/2);
frame.setVisible(true);
frame.setResizable(false);
frame.addWindowListener(new WindowAdapter(){//设置窗口关闭监听器
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
public static void main(String[] args){//程序入口,主函数调用
Calculate24 Start=new Calculate24();//实例化为对象
float []a=new float[4];
char []b=new char [4];
for(int i=0;i<4;i++)
b[i]='A';
Start.NewPanel(a,b);
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
- 132.
- 133.
- 134.
- 135.
- 136.
- 137.
- 138.
- 139.
- 140.
- 141.
- 142.
- 143.
- 144.
- 145.
- 146.
- 147.
- 148.
- 149.
- 150.
- 151.
- 152.
- 153.
- 154.
- 155.
- 156.
- 157.
- 158.
- 159.
- 160.
- 161.
- 162.
- 163.
- 164.
- 165.
- 166.
- 167.
- 168.
- 169.
- 170.
- 171.
- 172.
- 173.
- 174.
- 175.
- 176.
- 177.
- 178.
- 179.
- 180.
- 181.
- 182.
- 183.
- 184.
- 185.
- 186.
- 187.
- 188.
- 189.
- 190.
- 191.
- 192.
- 193.
- 194.
- 195.
- 196.
- 197.
- 198.
- 199.
- 200.
- 201.
- 202.
- 203.
- 204.
- 205.
- 206.
- 207.
- 208.
- 209.
- 210.
- 211.
- 212.
- 213.
- 214.
- 215.
- 216.
- 217.
- 218.
- 219.
- 220.
- 221.
- 222.
- 223.
- 224.
- 225.
- 226.
- 227.
- 228.
- 229.
- 230.
- 231.
- 232.
- 233.
- 234.
- 235.
- 236.
- 237.
- 238.
- 239.
- 240.
- 241.
- 242.
- 243.
- 244.
- 245.
- 246.
- 247.
- 248.
- 249.
- 250.
- 251.
- 252.
- 253.
- 254.
- 255.
- 256.
- 257.
- 258.
- 259.
- 260.
- 261.
- 262.
- 263.
- 264.
- 265.
- 266.
- 267.
- 268.
- 269.
- 270.
- 271.
- 272.
- 273.
- 274.
- 275.
- 276.
- 277.
- 278.
- 279.
- 280.
- 281.
- 282.
- 283.
- 284.
- 285.
- 286.
- 287.
- 288.
- 289.
- 290.
- 291.
- 292.
- 293.
- 294.
- 295.
- 296.
- 297.
- 298.
- 299.
- 300.
- 301.
- 302.
- 303.
- 304.
- 305.
- 306.
- 307.
- 308.
- 309.
- 310.
- 311.
- 312.
- 313.
- 314.
- 315.
- 316.
- 317.
- 318.
- 319.
- 320.
- 321.
- 322.
- 323.
- 324.
- 325.
- 326.
- 327.
- 328.
- 329.
- 330.
- 331.
- 332.
- 333.
- 334.
- 335.
- 336.
- 337.
- 338.
- 339.
- 340.
- 341.
- 342.
- 343.
- 344.
- 345.
- 346.
- 347.
- 348.
- 349.
- 350.
- 351.
- 352.
- 353.
- 354.
- 355.
- 356.
- 357.
- 358.
- 359.
- 360.
- 361.
- 362.
- 363.
- 364.
- 365.
- 366.
- 367.
- 368.
- 369.
- 370.
- 371.
- 372.
- 373.
- 374.
- 375.
- 376.
- 377.
- 378.
- 379.
- 380.
- 381.
- 382.
- 383.
- 384.
- 385.
- 386.
- 387.
- 388.
- 389.
- 390.
- 391.
- 392.
- 393.
- 394.
- 395.
- 396.
- 397.
- 398.
- 399.
- 400.
- 401.
- 402.
- 403.
- 404.
- 405.
- 406.
- 407.
- 408.
- 409.
- 410.
- 411.
- 412.
- 413.
- 414.
- 415.
- 416.
- 417.
- 418.
- 419.
- 420.
- 421.
- 422.
- 423.
- 424.
- 425.
- 426.
- 427.
- 428.
- 429.
- 430.
- 431.
- 432.
- 433.
- 434.
- 435.
- 436.
- 437.
- 438.
- 439.
- 440.
- 441.
- 442.
- 443.
- 444.
- 445.
- 446.
- 447.
- 448.
- 449.
- 450.
- 451.
- 452.
- 453.
- 454.
- 455.
- 456.
- 457.
- 458.
- 459.
- 460.
- 461.
- 462.
- 463.
- 464.
- 465.
- 466.
- 467.
- 468.
- 469.
- 470.
- 471.
- 472.
- 473.
- 474.
- 475.
- 476.
- 477.
- 478.
- 479.
- 480.
- 481.
- 482.
- 483.
- 484.
- 485.
- 486.
- 487.
- 488.
- 489.
- 490.
- 491.
- 492.
- 493.
- 494.
- 495.
- 496.
- 497.
- 498.
- 499.
- 500.
- 501.
- 502.
- 503.
- 504.
- 505.
- 506.
- 507.
- 508.
- 509.
- 510.
- 511.
#p#
Java代码片段:
//import java.util.Random;
/*
* 检查类,【本游戏的核心算法】
* ①用于检查随机生成的4个1~10的随机数能否通过运算得到24,
* 如果不能则再次产生4个随机数,
* 直到产生能够运算得到24的随机数为止
* ②检查用户输入的表达式是否合法或运算结果是否正确
*/
public class Check {
protected String outputs=new String();
/*
* 返回随机数全排列的方法,
* 对产生的四个随机数进行全排列,
* 共有4*3*2*1=24种情况,
* 考虑到运行效率,
* 直接将各种情况罗列出来,
* 没有用递归全排列的方法,
* 该方法通过形参i控制选取24种排列的第几种,
* 返回四个数的一维浮点型数组
*/
private float[] number(float [] a,int i){
final float[] Array = new float[4];
switch(i){
case 0 : Array[0]=a[0];Array[1]=a[1];Array[2]=a[2];Array[3]=a[3];break;
case 1 : Array[0]=a[0];Array[1]=a[1];Array[2]=a[3];Array[3]=a[2];break;
case 2 : Array[0]=a[0];Array[1]=a[2];Array[2]=a[1];Array[3]=a[3];break;
case 3 : Array[0]=a[0];Array[1]=a[2];Array[2]=a[3];Array[3]=a[1];break;
case 4 : Array[0]=a[0];Array[1]=a[3];Array[2]=a[2];Array[3]=a[1];break;
case 5 : Array[0]=a[0];Array[1]=a[3];Array[2]=a[1];Array[3]=a[2];break;
case 6 : Array[0]=a[1];Array[1]=a[0];Array[2]=a[2];Array[3]=a[3];break;
case 7 : Array[0]=a[1];Array[1]=a[0];Array[2]=a[3];Array[3]=a[2];break;
case 8 : Array[0]=a[1];Array[1]=a[2];Array[2]=a[0];Array[3]=a[3];break;
case 9 : Array[0]=a[1];Array[1]=a[2];Array[2]=a[3];Array[3]=a[0];break;
case 10: Array[0]=a[1];Array[1]=a[3];Array[2]=a[2];Array[3]=a[0];break;
case 11: Array[0]=a[1];Array[1]=a[3];Array[2]=a[0];Array[3]=a[2];break;
case 12: Array[0]=a[2];Array[1]=a[1];Array[2]=a[0];Array[3]=a[3];break;
case 13: Array[0]=a[2];Array[1]=a[1];Array[2]=a[3];Array[3]=a[0];break;
case 14: Array[0]=a[2];Array[1]=a[0];Array[2]=a[1];Array[3]=a[3];break;
case 15: Array[0]=a[2];Array[1]=a[0];Array[2]=a[3];Array[3]=a[1];break;
case 16: Array[0]=a[2];Array[1]=a[3];Array[2]=a[0];Array[3]=a[1];break;
case 17: Array[0]=a[2];Array[1]=a[3];Array[2]=a[1];Array[3]=a[0];break;
case 18: Array[0]=a[3];Array[1]=a[1];Array[2]=a[2];Array[3]=a[0];break;
case 19: Array[0]=a[3];Array[1]=a[1];Array[2]=a[0];Array[3]=a[2];break;
case 20: Array[0]=a[3];Array[1]=a[2];Array[2]=a[1];Array[3]=a[0];break;
case 21: Array[0]=a[3];Array[1]=a[2];Array[2]=a[0];Array[3]=a[1];break;
case 22: Array[0]=a[3];Array[1]=a[0];Array[2]=a[2];Array[3]=a[1];break;
case 23: Array[0]=a[3];Array[1]=a[0];Array[2]=a[1];Array[3]=a[2];break;
}
return Array ;
}
/*
* 返回运算符排列的方法,
* 四个数进行运算时需要三个运算符,
* 三个运算符的所有可能的排列是4^3=64种,
* 该方法直接返回64种运算符,
* 保存在二维字符型数组
*/
private char [][]Calculate(){
final char [][] Char=new char [64][3];//返回的运算符数组
final int [][] ar=new int [64][3];//控制返回三个运算符
int t=0;
stop:for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
for(int k=0;k<4;k++){
ar[t][0]=i;
ar[t][1]=j;
ar[t][2]=k;
for(int l=0;l<3;l++){//i,j,k的范围都是0~3,通过switch,将0~3分别映射为+,—,*,/
switch(ar[t][l]){
case 0:Char[t][l]='+';break;
case 1:Char[t][l]='-';break;
case 2:Char[t][l]='*';break;
case 3:Char[t][l]='/';break;
}
}
t++;
if(t==64)
break stop; //通过t的自增控制循环的结束
}
}
}
return Char;
}
/*
* 返回计算结果的方法,
* 对两个随机数进行运算
*/
private float Run(float a,float b,char c){
float sum=0f;
switch(c){
case '+': sum=a+b;break; //将'+'字符转换成加法运算
case '-': sum=a-b;break; //将'-'字符转换成减法运算
case '*': sum=a*b;break; //将'*'字符转换成乘法运算
case '/': sum=a/b;break; //将'/'字符转换成除法运算
}
return sum;
}
/*
* check方法
* 如果可以运算得到24,
* 返回true,
* 否则返回false
* 为了节省运行时间,
* 运算时,
* 只要某一次运算结果是24就直接返回true
* 只有产生的随机数不能运算得到24时才会运行所有情况
*/
protected boolean check(float[] myStatus){
float num[]=new float [4];
char [][] allcha=new char [64][3];
allcha=Calculate();
for(int i=0;i<24;i++){
for(int j=0;j<64;j++){
float x;
num=number(myStatus,i);
/*
* 注释解析:
* ABCD表示四个参与运算的随机数
* ①②③表示运算顺序
*/
x=Run(Run(Run(num[0],num[1],allcha[j][0]),num[2],allcha[j][1]),num[3],allcha[j][2]);
if(x==24.0f){
//System.out.println("(("+num[0]+allcha[j][0]+num[1]+")"+allcha[j][1]+num[2]+")"+allcha[j][2]+num[3]);
outputs="(("+(int)num[0]+allcha[j][0]+(int)num[1]+")"+allcha[j][1]+(int)num[2]+")"+allcha[j][2]+(int)num[3];
System.out.println(outputs);
return true;
}
// 以上运算类型为:((A①B)②C)③D
x=Run(Run(num[0],num[1],allcha[j][0]),Run(num[2],num[3],allcha[j][2]),allcha[j][1]);
if(x==24.0f){
//System.out.println("("+num[0]+allcha[j][0]+num[1]+")"+allcha[j][1]+"("+num[2]+allcha[j][2]+num[3]+")");
outputs="("+(int)num[0]+allcha[j][0]+(int)num[1]+")"+allcha[j][1]+"("+(int)num[2]+allcha[j][2]+(int)num[3]+")";
System.out.println(outputs);
return true;
}
//以上运算类型为:(A①B)②(C①D)
x=Run(Run(num[0],Run(num[1],num[2],allcha[j][1]),allcha[j][0]),num[3],allcha[j][2]);
if(x==24.0f){
//System.out.println("("+num[0]+allcha[j][0]+"("+num[1]+allcha[j][1]+num[2]+"))"+allcha[j][2]+num[3]);
outputs="("+(int)num[0]+allcha[j][0]+"("+(int)num[1]+allcha[j][1]+(int)num[2]+"))"+allcha[j][2]+(int)num[3];
System.out.println(outputs);
return true;
}
//以上运算类型为:(A②(B①C))③D
x=Run(num[0],Run(Run(num[1],num[2],allcha[j][1]),num[3],allcha[j][2]),allcha[j][0]);
if(x==24.0f){
//System.out.println(num[0]+""+allcha[j][0]+"(("+num[1]+allcha[j][1]+num[2]+")"+allcha[j][2]+num[3]+")");
outputs=(int)num[0]+""+allcha[j][0]+"(("+(int)num[1]+allcha[j][1]+(int)num[2]+")"+allcha[j][2]+(int)num[3]+")";
System.out.println(outputs);
return true;
}
//以上运算类型为:A③((B①C)②D)
x=Run(num[0],Run(num[1],Run(num[2],num[3],allcha[j][2]),allcha[j][1]),allcha[j][0]);
if(x==24.0f){
//System.out.println(num[0]+""+allcha[j][0]+"("+num[1]+allcha[j][1]+"("+num[2]+allcha[j][2]+num[3]+"))");
outputs=(int)num[0]+""+allcha[j][0]+"("+(int)num[1]+allcha[j][1]+"("+(int)num[2]+allcha[j][2]+(int)num[3]+"))";
System.out.println(outputs);
return true;
}
//以上运算类型为:A③(B②(C①D))
}
}
return false;
}
/*
* 把字符串的数学表达式计算出结果
*/
protected float string_float(String s0){
char s[]=new char[s0.length()];
float sum=0;//计算结果
float num[]={-1,-1,-1,-1}; //记录数学表达式中的数
int calculate_location[]={-1,-1,-1};
char calculate[]={'a','a','a'};//记录数学表达式中的运算符
int calculate_priority[]={3,2,1};//设置优先级
int abc;
for(int i=0;i<s.length;i++)
s[i]=s0.charAt(i);
for(int i=0,j=0,l=0;i<s.length;i++){//分析字符串
if(s[i]>='0'&&s[i]<='9')
{//得到数学表达式中的数
num[j]=s[i]-48;
if(i+1<s.length)
if(s[i+1]>='0'&&s[i+1]<='9')
{
num[j]=num[j]*10+s[i+1]-48;
i++;
}
j++;
continue;
}
if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/')//得到表达式中的运算符
if(calculate_location[l]==-1)
{
calculate_location[l]=i;
calculate[l]=s[i];
l++;
}
}
for(int i=0,i0=0,j=0;i<s.length;i++)
{//分析表达式的运算优先级
if(s[i]==')')
{// 先算括号里的表达式
for(i0=i;s[i0]!='(';i0--)
if(s[i0]=='+'||s[i0]=='-'||s[i0]=='*'||s[i0]=='/')
for(j=0;j<3;j++)
if(calculate_location[j]==i0)
calculate_priority[j]+=8;
s[i0]='s';
}
if(s[i]=='*'||s[i]=='/')//再算乘除
for(j=0;j<3;j++)
if(calculate_location[j]==i)
calculate_priority[j]+=4;
}
/*
* 此处的if是把刚才分析的运算优先级用一个int的变量abc记录下来,如123则表示第三个运算符
* 运算级最高,其实是第二个,最后是第一个
*/
if(calculate_priority[0]>calculate_priority[1])
{
if(calculate_priority[0]>calculate_priority[2])
calculate_priority[0]=-1;
else
calculate_priority[2]=-1;
}
else
{
if(calculate_priority[1]>calculate_priority[2])
calculate_priority[1]=-1;
else
calculate_priority[2]=-1;
}
if(calculate_priority[0]<0)
{
if(calculate_priority[1]>calculate_priority[2])
{
calculate_priority[1]=-2;
calculate_priority[2]=-3;
}
else
{
calculate_priority[1]=-3;
calculate_priority[2]=-2;
}
}
else
{
if(calculate_priority[1]<0)
{
if(calculate_priority[0]>calculate_priority[2])
{
calculate_priority[0]=-2;
calculate_priority[2]=-3;
}
else
{
calculate_priority[0]=-3;
calculate_priority[2]=-2;
}
}
else
{
if(calculate_priority[0]>calculate_priority[1])
{
calculate_priority[0]=-2;
calculate_priority[1]=-3;
}
else
{
calculate_priority[0]=-3;
calculate_priority[1]=-2;
}
}
}
abc=calculate_priority[0]*100+calculate_priority[1]*10+calculate_priority[2];
abc=-abc;
//根据刚才分析的运算级,计算出结果,保存在sum里面
switch(abc){
case 123:sum=Run(Run(Run(num[0],num[1],calculate[0]),num[2],calculate[1]),num[3],calculate[2]);break;
case 132:sum=Run(Run(num[0],num[1],calculate[0]),Run(num[2],num[3],calculate[2]),calculate[1]);break;
case 213:sum=Run(Run(num[0],Run(num[1],num[2],calculate[1]),calculate[0]),num[3],calculate[2]);break;
case 231:sum=Run(Run(num[0],num[1],calculate[0]),Run(num[2],num[3],calculate[2]),calculate[1]);break;
case 312:sum=Run(num[0],Run(Run(num[1],num[2],calculate[1]),num[3],calculate[2]),calculate[0]);break;
case 321:sum=Run(num[0],Run(num[1],Run(num[2],num[3],calculate[2]),calculate[1]),calculate[0]);break;
}
return sum;//返回结果
}
//测试区
/* public static void main(String[]args){
Check c=new Check();
Float [] test=new Float [4];
Random ran=new Random();
for(int i=0;i<4;i++)
test[i]=(float) ((int)(ran.nextFloat()*10+1));
//c.check(test);
System.out.println(test[0]+" "+test[1]+" "+test[2]+" "+test[3]+" "+c.check(test));
test[0]=5.0f;
test[1]=10.0f;
test[2]=2.0f;
test[3]=10.0f;
//c.check(test);
System.out.println(test[0]+" "+test[1]+" "+test[2]+" "+test[3]+" "+c.check(test));
}*/
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
- 132.
- 133.
- 134.
- 135.
- 136.
- 137.
- 138.
- 139.
- 140.
- 141.
- 142.
- 143.
- 144.
- 145.
- 146.
- 147.
- 148.
- 149.
- 150.
- 151.
- 152.
- 153.
- 154.
- 155.
- 156.
- 157.
- 158.
- 159.
- 160.
- 161.
- 162.
- 163.
- 164.
- 165.
- 166.
- 167.
- 168.
- 169.
- 170.
- 171.
- 172.
- 173.
- 174.
- 175.
- 176.
- 177.
- 178.
- 179.
- 180.
- 181.
- 182.
- 183.
- 184.
- 185.
- 186.
- 187.
- 188.
- 189.
- 190.
- 191.
- 192.
- 193.
- 194.
- 195.
- 196.
- 197.
- 198.
- 199.
- 200.
- 201.
- 202.
- 203.
- 204.
- 205.
- 206.
- 207.
- 208.
- 209.
- 210.
- 211.
- 212.
- 213.
- 214.
- 215.
- 216.
- 217.
- 218.
- 219.
- 220.
- 221.
- 222.
- 223.
- 224.
- 225.
- 226.
- 227.
- 228.
- 229.
- 230.
- 231.
- 232.
- 233.
- 234.
- 235.
- 236.
- 237.
- 238.
- 239.
- 240.
- 241.
- 242.
- 243.
- 244.
- 245.
- 246.
- 247.
- 248.
- 249.
- 250.
- 251.
- 252.
- 253.
- 254.
- 255.
- 256.
- 257.
- 258.
- 259.
- 260.
- 261.
- 262.
- 263.
- 264.
- 265.
- 266.
- 267.
- 268.
- 269.
- 270.
- 271.
- 272.
- 273.
- 274.
- 275.
- 276.
- 277.
- 278.
- 279.
- 280.
- 281.
- 282.
- 283.
- 284.
- 285.
- 286.
- 287.
- 288.
- 289.
- 290.
- 291.
- 292.
- 293.
- 294.
- 295.
- 296.
- 297.
- 298.
- 299.
- 300.
- 301.
- 302.
- 303.
- 304.
- 305.
- 306.
- 307.
- 308.
- 309.
- 310.
- 311.
- 312.
- 313.
- 314.
- 315.
- 316.
- 317.
- 318.
- 319.
- 320.
- 321.
- 322.
- 323.
- 324.
- 325.
- 326.
- 327.
- 328.
- 329.
- 330.
- 331.
- 332.
- 333.
- 334.
- 335.
- 336.
- 337.
Java代码片段:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class MasgDlg extends JFrame implements ActionListener {
Calculate24 bp=new Calculate24();
protected MasgDlg( Calculate24 btp,String strMsg){
this.setTitle("提示窗口");
bp=btp;
JPanel textp=new JPanel();
JPanel btnp=new JPanel();
JLabel label=new JLabel();
this.setLayout(new BorderLayout());
this.add(textp,BorderLayout.NORTH);
this.add(btnp,BorderLayout.SOUTH);
textp.add(label,BorderLayout.CENTER);
label.setText(strMsg);
this.setSize(580,100);
this.setLocation(400,300);
JButton btnOk=new JButton("确定");
JButton btnquit=new JButton("退出");
btnOk.setActionCommand("restart");
btnOk.addActionListener(this);
btnquit.setActionCommand("quit");
btnquit.addActionListener(this);
btnp.add(btnOk);
btnp.add(btnquit);
this.setVisible(true);//显示对话框
this.setAlwaysOnTop(true);
bp.btnStart.setEnabled(false);
}
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("restart")){
this.dispose();
bp.btnStart.setEnabled(true);
}
else if(e.getActionCommand().equals("quit")){
System.exit(0);
//隐藏对话框
}
}
//测试区
/*public static void main(String []args){
new MsgDlg("欢迎再次使用");
}*/
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
Java代码片段:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class MsgDlg extends JFrame implements ActionListener {
Calculate24 tempCal24;
protected MsgDlg(String strMsg,Calculate24 Cal24){
//super();
this.setTitle("提示窗口");
JPanel textp=new JPanel();
JPanel btnp=new JPanel();
JLabel label=new JLabel();
this.setLayout(new BorderLayout());
this.add(textp,BorderLayout.NORTH);
this.add(btnp,BorderLayout.SOUTH);
textp.add(label,BorderLayout.CENTER);
label.setText(strMsg);
this.setSize(580,100);
this.setLocation(400,300);
JButton btnOk=new JButton("确定");
tempCal24=Cal24;
btnOk.addActionListener(this);
btnp.add(btnOk);
this.toFront();
tempCal24.btnOk.setEnabled(false);//使确定按钮不可用
this.setVisible(true);//显示对话框
}
public void actionPerformed(ActionEvent e) {
this.dispose();//隐藏对话框
tempCal24.btnOk.setEnabled(true);//激活确定按钮
}
//测试区
/*public static void main(String []args){
new MsgDlg("欢迎再次使用");
}*/
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
Java代码片段:
import javax.swing.*;
import java.awt.event.*;
/*
* 时间显示类
*/
@SuppressWarnings("serial")
public class MyTimer extends JPanel
{
protected int usedTime = 0;//定义初始时间为0
public Timer timer;
public JLabel usedTimeLabel = new JLabel("用时:");
public JTextField timeText = new JTextField(5);
protected MyTimer()
{
timeText.setEditable(false);
timeText.setText("0分0秒");
setVisible(true);
timer = new Timer(1000,new TimerListener());
}
class TimerListener implements ActionListener//时间显示监听
{
public void actionPerformed(ActionEvent e)
{
usedTime++;
timeText.setText(usedTime/60+"分"+usedTime%60+"秒"); //显示所用时间,分秒
}
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
效果图片:
下载地址:http://down.51cto.com/data/318971#
原文链接:http://www.oschina.net/code/snippet_188162_7861
【编辑推荐】