首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"Ella“Java chatbot

"Ella“Java chatbot
EN

Code Review用户
提问于 2014-11-27 15:35:16
回答 3查看 19.6K关注 0票数 10

最近我对人工智能产生了兴趣,我想我会开发这个小小的聊天机器人。是否有任何建议/修改?

代码语言:javascript
复制
import java.io.*;
import java.util.*;
import java.lang.*;

public class Conversate{


    private static String name;

    public Conversate(String name){
        this.name=name;
    }



    public static int randomWithRange(int min, int max){
        int range = Math.abs(max - min) + 1;     
        return (int)(Math.random() * range) + (min <= max ? min : max);
    }


    public static void main (String []arg){
        System.out.println("Hello I'm Ella! and you are?");
        Scanner in = new Scanner(System.in);
        String namer = in.nextLine();


        namer.trim();
        if (namer.length()>15){ System.out.println("Your name is kinda long isn't it!"); }


        System.out.println("and your last name is?");
        Scanner in2 = new Scanner(System.in);
        String namer2 = in2.nextLine();

        namer2.trim();
        System.out.println("are you a boy or a girl?");
        Scanner in3 = new Scanner(System.in);
        String gender = in3.nextLine();
        char gen = 'f';
        if (gender.equalsIgnoreCase("boy") || gender.equalsIgnoreCase("man") || gender.equalsIgnoreCase("guy") || gender.equalsIgnoreCase("m") || gender.equalsIgnoreCase("male")  ){
            gen = 'm';
            System.out.println("oooo...Macho Macho!, Look at you!");
            System.out.println("ELLA BLOWS YOU A KISS!");
            System.out.println("lol!! I'm a girl.... I guess you can tell.");
            }else if (gender.equalsIgnoreCase("girl") || gender.equalsIgnoreCase("woman") || gender.equalsIgnoreCase("lady") || gender.equalsIgnoreCase("f") || gender.equalsIgnoreCase("female") ){
                gen = 'f';
                System.out.println("OH YEAH!!! GIRL POWER!!!");
            }else {
                System.out.println("Your answer is not quite clear...");
                System.out.println("I'll decide what you are");
                try{
                    Thread.sleep(3000);
                }catch (InterruptedException ex){
                    Thread.currentThread().interrupt();
                }
                System.out.println("You are a Human BeanStalk! ha ha ha ha!");
            }



        Person ppl = new Person(namer,namer2, gen);

        System.out.println("How old or young are you?");
        int ager = in3.nextInt();
        ppl.setAge(ager);


        if (ppl.known()) {
            System.out.println("HI "+namer+"! Good to see you again!");
        }else{
                System.out.println("I don't think we have met before");
                try{ 
                    ppl.savePerson("ella.txt");
                    }catch (IOException e ){
                    System.out.println(e);
                }
            }

        feelings();

        if (namer.equalsIgnoreCase("Ella")){ System.out.println("oh wow! that's my name too!"); 
        }else System.out.println("Pleased to meet you");




        System.out.println("em... "+namer +"? wouldn't you like to know how I am?");
        String resp = in.nextLine();
        if (resp.equalsIgnoreCase("No") || resp.equalsIgnoreCase("Nope") || resp.equalsIgnoreCase("n") || resp.equalsIgnoreCase("Not")){
            System.out.println("FINE! then go away!");
            System.exit(0);
        }else if (resp.equalsIgnoreCase("maybe")){
                System.out.println(namer+(" it's not a hard question is it?? ... have a good think about it for a few seconds!"));
                try{
                    Thread.sleep(10000);
                }catch (InterruptedException ex){
                    Thread.currentThread().interrupt();
                }
                System.out.println("...Good! Now I'm sure you want to know how if feel so I'll tell you!");
                }else if(resp.equalsIgnoreCase("Yes") || resp.equalsIgnoreCase("ok") || resp.equalsIgnoreCase("Sure") || resp.equalsIgnoreCase("Y") || resp.equalsIgnoreCase("yep")){

                    System.out.println("Oh you are too kind!");

                    try{
                        Thread.sleep(2000);
                        }catch (InterruptedException ex){
                        Thread.currentThread().interrupt();
                    }

                    try{ 
                        File file = new File("resp.txt");
                        BufferedReader reader = new BufferedReader(new FileReader(file));
                        String ln = reader.readLine();
                        List<String> lines = new ArrayList<String>();
                        while(ln != null){
                            lines.add(ln);
                            ln = reader.readLine();
                        }
                        Random r = new Random();
                        System.out.println(namer+" "+lines.get(r.nextInt(lines.size())));
                        }catch (IOException e){
                        e.printStackTrace();}



                    int rrepB = randomWithRange(0,2);

                    System.out.println(namer +" So how are you today?");
                    String rrsp = in.nextLine();
                    try{
                        FileWriter write = new FileWriter("resp.txt",true);
                        PrintWriter prt = new PrintWriter(write);

                        prt.printf("%s" + "%n", rrsp);
                        prt.close();
                        }catch (IOException e){
                            e.printStackTrace();
                        }

                    System.out.println ("Here's Something to think about...");
                    try{
                                Thread.sleep(3000);
                    }catch (InterruptedException ex){
                                Thread.currentThread().interrupt();
                        }

                    try{ 
                        File file2 = new File("convo.ella");
                        BufferedReader reader2 = new BufferedReader(new FileReader(file2));
                        String ln2 = reader2.readLine();
                        List<String> lines2 = new ArrayList<String>();
                        while(ln2 != null){
                            lines2.add(ln2);
                            ln2 = reader2.readLine();
                        }
                        Random r2 = new Random();
                        System.out.println(namer+", "+lines2.get(r2.nextInt(lines2.size())));
                        }catch (IOException e){
                        e.printStackTrace();}

                }

        System.exit(0);
    }
}
EN

回答 3

Code Review用户

发布于 2014-11-27 16:01:01

我现在要指出的是一些一般性的事情,这应该是一个很好的开端:

  • 虽然你有一些额外的方法,但我仍然觉得还有更多的方法。减少main()完成的工作量是很好的,特别是在可读性和维护方面。还可能需要使用额外的类(最外层的类不一定是唯一的类)。关于类的使用,您应该首先考虑这一点。如果没有额外的类来分担各种责任,扩展这个应用程序就会更加困难。否则,它看上去非常程序化,很难理解。一定要阅读良好的Java实践,以帮助充分发挥这个应用程序的潜力。
  • 这可能是在范围内获取随机数的一种更为惯用的方法: //这是在main()随机rand =新随机()中构造的;// .公共静态int randomWithRange(int,int,随机rand) {返回rand.nextInt((max - min )+ 1) + min;}(所需的importjava.util.Random。)更多的替代方案也可以找到这里
  • 你真的不需要System.exit(0)。这个部分没有循环,所以不会重复这些代码。该程序仍将优雅地退出main()
票数 8
EN

Code Review用户

发布于 2014-11-27 16:43:09

我强烈建议使用IDE进行Java开发。尝试IntelliJ或Eclipse或NetBeans。我猜您没有使用它,因为格式非常差。格式化是一个严重的问题,因为代码的读取频率远远高于所编写的代码。值得注意的是。在Eclipse中,您可以使用Control f键盘快捷方式重新格式化整个文件。结果将变得更加可读性。

从代码中删除未使用的内容。每一行代码都是一个潜在的漏洞或安全漏洞。没有目的的代码在程序中没有位置。例如,可以安全地删除Conversate构造函数和name字段。

不需要从System.in创建多个扫描器。不需要in2in3。您可以重用第一个。

这里的装饰是毫无意义的:

String = in.nextLine();namer.trim();

.trim()方法返回一个新的经过修剪的String对象。原始字符串没有被修改( Java中的字符串是不可变的,它们不能更改)。新的字符串被扔掉了。很可能你想这么做:

代码语言:javascript
复制
String namer = in.nextLine().trim();

在此代码中:

String gen = in3.nextLine();char = 'f';if (gender.equalsIgnoreCase(“男孩”)\x\x{e}\x{

重复执行equalsIgnoreCase是效率低下的。最好将输入小写一次,这样您就可以使用简单的equals了。但还是要打很多字。一个更好的解决方案是构建一个可接受名称的Set,并检查gender是否包含在Set中。

例如,在类的顶部定义这些集合:

代码语言:javascript
复制
private static Set<String> GIRLY = new HashSet<String>(Arrays.asList(
        "girl", "woman", "lady", "f", "female", "chick"
));

private static Set<String> BOYISH = new HashSet<String>(Arrays.asList(
        "buy", "man", "guy", "m", "male", "dude", "bloke", "chap", "kid"
));

然后在代码中,你可以这样处理性别:

代码语言:javascript
复制
String gender = in3.nextLine().trim().toLowerCase();
char gen = 'f';
if (BOYISH.contains(gender)) {
    gen = 'm';
    // ...
} else if (GIRLY.contains(gender)) {
    gen = 'f';
    // ...
票数 8
EN

Code Review用户

发布于 2015-02-03 01:03:59

除了前面提到的要点(特别是关于不需要使用多个扫描器)之外,我建议您在处理多个情况时使用交换机语句。

如果你担心像"man“和”男孩“这样的等价物,janos提供了一个很好的解决方案,我仍然会使用开关,或者你也可以通过简单地交替使用断点和事先更改字母大小写来解释它们。

例如,这两个冗长的、水平上不整洁的检查。

if (gender.equalsIgnoreCase("boy") || gender.equalsIgnoreCase("man") || gender.equalsIgnoreCase("guy") || gender.equalsIgnoreCase("m") || gender.equalsIgnoreCase("male")) { // boy stuff } else if ender.equalsIgnoreCase("girl") || gender.equalsIgnoreCase("woman") || gender.equalsIgnoreCase("lady") || gender.equalsIgnoreCase("f") || gender.equalsIgnoreCase("female")) { // girl stuff }

可以是

代码语言:javascript
复制
 switch(gender.toLowerCase()) {
            case "boy":
            case "guy":
            case "man":
            case "male":
            case "m":
                gen = 'm';
                // Guy messages
            break;
            case "girl":
            case "lady":
            case "woman":
            case "female":
            case "f"
                gen = 'f';
               // Girl messages
            break;
            default:
                // Message about the user being an alien
        }
票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/71008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档