拍24(优化版)

流程

1、系统产生四个随机数1-13 J,Q,K 计算的内容是1

        2、用户输入算式,算是结果为24

        3、由电脑计算结果是否正确,如果正确,继续出4个数字

根据上一步来的,每一步都会有新算式。

        4、用户退去,输入Q可退出

或者发派遣做用户询问,是否继续发牌(Y/N)

循环结构

找到循环变量,循环变量还需要初始化,判断出循环条件。

可以用户确认发牌作为循环控制量,如果循环发牌变量为N,可退出。

for(char s='y';s!='n';){

}

用char接收 nextchar 很可能报错

以后遇到游戏类的编程,循环外层直接套一个死循环

while(true){

String ch=Scanner.next();

if(ch.equals("y")){

}}

这样节省空间

全局变量:

玩家名称username

只要有交互的内容Scanner,直接把Scanner做全局

(3)实现逻辑

代码如下:

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

import java.util.Scanner;

public class MyGame {

    public static void main(String[] args) {

        //全局变量  username表示用户名, scanner输入设备

        String username;

        Scanner scanner = new Scanner(System.in);

        //制作游戏界面

        System.out.println("************************");

        System.out.println("  游戏:  算24");

        System.out.println("            版本:v1.0");

        System.out.println("************************");

        //这里输入先回车,不接收数值,再输入用户名

        scanner.nextLine();

        //再提示用户输入用户名

        System.out.println("请输入玩家的用户名:");

        username=scanner.nextLine();

        //nextLine()用户会输入一堆空格,没有用户名,直接回车,这种情况违法

        if(username.trim().equals("")){

            username="匿名用户";

        }

        //游戏死循环的限定

        while (true) {

            //游戏逻辑

            //系统产生4个随机数,1-13 11 J  12 Q 13 K

            //这四值只要用户可以看到,就ok,系统根据用户输入的算式来判断结果

            //可以简单化,直接输出数字到屏幕,输出4遍随机,这里可以用循环,确定循环次数

            //每循环一次,打印一次结果

            for(int i=0;i<4;i++){

                //数字可能出现11 12 13,出现11 12 13转换J Q K,把变量接收,判断是否是11 12 13

                int num=(int)Math.random()*13+1;

                //判断num是否是11 12 13,固定选择用switch

//                char ch;

                switch(num){

                    case 11:

//                        ch='J';

                        //保证出现的四个牌在一行,使用print,后面\t拉开距离

                        System.out.print("J"+"\t");

                        break;

                    case 12:

                        System.out.print("Q"+"\t");

                        break;

                    case 13:

                        System.out.print("K"+"\t");

                        break;

                    default:

                        System.out.print(num+"\t");

                }

            }

            //运行到这里,四个数字打印到屏幕。但是没换行

            System.out.println();

            //换行后给用户进行提示

            System.out.println("请输入通过加减乘除计算24的方法:");

            //接收用户输入的算式,用户输入算式可能会无意间敲上空格,nextLine接收所有

            String computer_line=scanner.nextLine();

            //需要把字符串做运算,重要在于如何处理算式,防止程序报错,判断输入算式的合法性

            //控制退出循环的条件

            String ch=scanner.next();

            //可能会有大写或小写的问题 ,这里统一转换成小写进行比较

            if (ch.toLowerCase().equals("n")) {

                break;

            }

        }

    }

}

test_indexOf.java

public class test_indexOf {

    public static void main(String[] args) {

        //这个字符串长度为8,第一个值0,最后一个位置7

        //注意特殊数字10,10分成两位是1和0,两位代表一个数字

        //作业:

        //考虑1\没有括号,2\有1个括号

        //3\两个括号

        //(5+3)*(1+2)

        //2+2+2*10

        //其它情况

//        String biaoda="5*6*8/10";

//        String biaoda="(5+2+K)*3";

        String biaoda="2+2+2*10";

        System.out.println(biaoda.indexOf("("));

        //indexOf输出字符串中的第0个位置,可以输出右括号在字符串的位置,这个位置从0开始

        //把字符串拆开,每一个是一个字符,就是char,在字符串有函数charAt(位置)

        System.out.println(biaoda.indexOf(")"));

        //这里把(开始位置定义变量,把)结束位置定义变量,中间的可以进行有效性判断和计算

        int index_first=biaoda.indexOf("(");

//        if(index_first==-1){

//            index_first=-1;

//        }

        int index_last=biaoda.indexOf(")");

        if(index_last==-1){

            //字符串有长度函数length()

            index_last=biaoda.length();

        }

        //和差积商的计算结果有一值放在循环外

        int num1=0;

        //把记录的flag做一个全局,给flag一个没有的符号初始化

        char flag='|';

        //全局有传有收

        num1=test_for(index_first+1,index_last,num1,biaoda,flag);

        if(index_last<biaoda.length()){

            num1=test_for(index_last+1,biaoda.length(),num1,biaoda,flag);

        }

        //再计算括号外面的结果

        //循环计算结束,打印全局的num1

        System.out.println(num1);

    }

    //函数需要根据flag来做事情,所以传入flag,凡是出现变量报错,证明这段函数需要变量,再把变量做参数传入,

    //函数中缺少计算的量,采用传参就可以

    //这个函数中有主函数中的全局,num1是主函数的全局,只要有全局,把全局返回

    //默认返回是void,是空,把void改成返回全局的int

    public static int test_switch(char flag,int num1,int num2){

//        System.out.println("---------------------");

//        System.out.println(num2);

        //如果num2传入一个0,证明num2之前的数字1,num1已加过一个1

        switch(flag){

            case '|':

                //证明没有操作

                if (num2==0) {

                    num1 += 9;

                }else{

                    num1=num2;

                }

                break;

            case '+':

                //加减乘除=后面的数值还是需要变化,不是固定的1

                if (num2==0){

                    num1+=9;

                }else{

                    num1+=num2;

                }

                break;

            case '-':

                if (num2==0){

                    num1-=9;

                }else{

                    num1-=num2;

                }

                break;

            case '*':

                //num2是0,不能做乘法

                if(num2!=0){

                    num1*=num2;

                }else{

                    num1*=10;

                }

                break;

            case '/':

                //num2,不能做除法

                if(num2!=0){

                    num1/=num2;

                }else{

                    num1/=10;

                }

        }

        //如果有全局,在计算中还有全局变量参与,最后返回全局

        return num1;

    }

    //复制后,错的标红的作输入变量,

    //函数里:如果大括号没有错误,看一下返回值

    public static int test_for(int start,int end,int num1,String biaoda,char flag) {

//        for(int i=index_first+1;i<index_last;i++){

        for (int i = start; i < end; i++) {

//            System.out.println(biaoda.charAt(i));

            //()内的字符全部取出,碰到数字记录,一个加法的和是由被加数和加数决定的

            //这是记录加数和被加数的;也可以sum和num的关系,num是记数的,sum是求和的

            //charAt(i)输出的字符可能是J ,Q,K。如果直接接收整型不合适,这里用一个中间变量

            //这里把num1记录当前的字符

//            int num1=0;

            char num1_mid = biaoda.charAt(i);

            //记录操作的标志位,放在循环里面,每次循环flag定义一次,每次循环flag变化,不能让flag发生变化,

            //记录的操作在遇到第二个操作数之前都是有效的。所以flag应该是全局

            //记录标志位后,只有再有一个数,就可以使用

            //如果是J,Q,K就转化成1

            switch (num1_mid) {

                case 'J':

                    //把后面的switch复制到每一个switch里面,这段代码才能一直有效

                    //这里简化操作,把这段不断重复,影响结构的代码提出来,变成一个函数,函数名不能是main,前面的内容一致

                    //注意test_switch有结果返回,有结果返回就要接收,使用全局来接收

                    num1 = test_switch(flag, num1, 1);

//                    num1+=1;

                    break;

                case 'Q':

                    num1 = test_switch(flag, num1, 1);

//                    num1+=1;

                    break;

                case 'K':

                    num1 = test_switch(flag, num1, 1);

//                    num1+=1;

                    break;

                case '+':

                    //当加减乘除任一开始操作时,只有一个数存在,不能做任何运算,只能等另一个数过来,才能运算

                    //遇到这类问题,你把这个符号当作标志位

                    flag = '+';

                    break;

                case '-':

                    //只记录,不能计算

                    flag = '-';

                    break;

                case '*':

                    flag = '*';

                    break;

                case '/':

                    flag = '/';

                    break;

                default:

//                    System.out.println(Integer.parseInt(num1_mid+""));

                    num1 = test_switch(flag, num1, Integer.parseInt(num1_mid + ""));

                    //把char型加上一个字符,只不过这个字符是""

//                    num1+=Integer.parseInt(num1_mid+"");

            }

            //一个一个打印,看错误的原因

//            System.out.println(num1);

            //如果碰到加减乘除,就把这两个数计算

        }

        return num1;

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值