游戏流程:
1、系统产生四个随机数 1-13, J Q K 计算的内容是1
四个随机数字是打印在屏幕上的(可以重复) 。
2、用户输入算式,算式结果是24。
3、由电脑计算算式的结果是否正确,如果正确,继续出4个数字。根据上一步来的,每一步都会有新的算式。
4、用户退出, 输入n可以退出,或者发牌之前做用户询问,是否继续发牌.(y/n)
编写游戏类程序的思维:
(1)确定基本架构(游戏的架构:死循环中套用一个退出条件)
(2)确定全局变量
每个游戏类程序,都会有一个用户玩家名字, username全局
只要有交互的内容,Scanner ,直接把Scanner算作全局
(3)实现逻辑
5 3 2 K
(5+2+K)*3
5 5 10 4
(+
合法性:只能通过正则判断
^[(,),1-10,J,Q,K][1-10,J,Q,K,+,-,*,/]$
无法统一
0^([1-10,J,Q,K][+,-,*,/][1-10,J,Q,K][),1-10,J,Q,K]$
只要算式中有括号,很难判断合法性
数学方法: 先算括号里面,再算括号外面
先找括号里面的找出来
字符串操作中,indexOf
计算括号里面的思维
计算两种情况
1、带括号(括号是前面的)
2、不带括号
3、双括号 indexOf 从前往后查 lastIndexOf 从后往前查
查找一个匹配的内容,就不再查了
只要indexOf和lastIndexOf都查一遍,结果不等就ok
只要有两个括号,基本第二个括号后面不会出现符号
4、不带括号,先算乘除,后算加减
5、带括号(括号是中间,括号是最后)
代码1:游戏程序的基础架构
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();
if(username.trim().equals("")){
username="匿名用户";
}
//游戏死循环的限定
while (true) {
//游戏逻辑
//系统产生4个随机数,1-13 11 J 12 Q 13 K
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);
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;
case 1:
System.out.print("A"+"\t");
break;
default:
System.out.print(num+"\t");
}
}
System.out.println();
System.out.println("请输入通过加减乘除计算24的方法:");
String computer_line=scanner.nextLine();
//控制退出循环的条件
String ch=scanner.next();
if (ch.toLowerCase().equals("n")) {
break;
}
}
}
}
代码2:算24表达式的判断
public class test_indexOf {
public static void main(String[] args) {
//这个字符串长度为8,第一个值0,最后一个位置7
//注意特殊数字10,10分成两位是1和0,两位代表一个数字
// String biaoda="5*6*8/10";
// String biaoda="(5+2+K)*3";
String biaoda="2+2+2*10";
System.out.println(biaoda.indexOf("("));
//把字符串拆开,每一个是一个字符,就是char,在字符串有函数charAt(位置)
System.out.println(biaoda.indexOf(")"));
int index_first=biaoda.indexOf("(");
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);
}
public static int test_switch(char flag,int num1,int num2){
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 = start; i < end; i++) {
//这里把num1记录当前的字符
// int num1=0;
char num1_mid = biaoda.charAt(i);
//记录标志位后,只有再有一个数,就可以使用
//如果是J,Q,K就转化成1
switch (num1_mid) {
case 'J':
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:
num1 = test_switch(flag, num1, Integer.parseInt(num1_mid + ""));
}
}
return num1;
}
}
完整代码请关注我的Gitee仓库:游戏:算24实战: 游戏流程:1、系统产生四个随机数 1-13, J Q K 计算的内容是1 四个随机数字是打印在屏幕上的(可以重复) 。 2、用户输入算式,算式结果是24。 3、由电脑计算算式的结果是否正确,如果正确,继续出4个数字。根据上一步来的,每一步都会有新的算式。4、用户退出, 输入n可以退出,或者发牌之前做用户询问,是否继续发牌.(y/n)