返事を乱数で選択するバージョン。
ちょっと会話っぽくなったけど、まだ人工無脳になっていない。
Responderクラスを抽象クラスにして、それを継承してWhatResponderクラスとRandomResponderを派生。
抽象クラスとインターフェースのどちらを使うべきか理解できていないけど、とりあえず馴染みのある抽象クラスを使ってみた。
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 |
using System; using System.Windows.Forms; namespace proto { public partial class Form1 : Form { public Form1() { InitializeComponent(); } Unmo proto; abstract class Responder { private string name_; public Responder(string name) { name_ = name; } public abstract string response(string data); public string name { set { name_ = value; } get { return name_; } } } class WhatResponder : Responder { public WhatResponder(string name):base(name){} public override string response(string data) { return data + "ってなに?"; } } class RandomResponder : Responder { string[] res = new string[3] { "今日は寒いね", "チョコ食べたい", "きのう10円ひろった" }; Random rand; public RandomResponder(string name):base(name) { rand = new Random(); } public override string response(string data) { return res[rand.Next(0, 3)]; } } class Unmo { string name_; Responder responder; public Unmo(string name) { name_ = name; responder = new RandomResponder("Random"); } public string dialogue(string input) { return responder.response(input); } public string responder_name() { return responder.name; } public string name { set { name_ = value; } get { return name_; } } } private string prompt(Unmo unmo) { return unmo.name + ":" + unmo.responder_name() + ">"; } private int row_ = 0; private int linenum = 0; private void button1_Click(object sender, EventArgs e) { string linedata = ""; richTextBox1.Clear(); richTextBox1.AppendText("Unmo System prototype : start\r\n"); do { richTextBox1.AppendText(prompt(proto)); richTextBox1.Focus(); richTextBox1.Refresh(); while (linenum == row_) { Application.DoEvents(); } linedata = richTextBox1.Lines[row_-1]; linenum = row_; if(linedata != prompt(proto)) richTextBox1.AppendText(proto.dialogue(linedata.Substring(prompt(proto).Length))+"\r\n"); } while (linedata != prompt(proto)); richTextBox1.AppendText("Unmo System Prottype: End\r\n"); } private void richTextBox1_KeyPress(object sender, KeyPressEventArgs e) { if(e.KeyChar == (char)Keys.Enter) { row_ = richTextBox1.Lines.Length - 1; } } private void Form1_Load(object sender, EventArgs e) { proto = new Unmo("proto"); } } } |