「Rubyでつくる人工無脳」を参考に、プロトタイプをC#に移植してみた。
もともとは、コンソールアプリだったのをWindowsアプリにしたので、結構無理やりになった。
内容的には、人工無脳までいかなくて、単に入力されたtextに”ってなに?”を加えて返すだけ。
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 |
using System; using System.Windows.Forms; namespace proto { public partial class Form1 : Form { public Form1() { InitializeComponent(); } Unmo proto; class Responder { private string name_; public Responder(string name) { name_ = name; } public string response(string input) { return input + "ってなに?"; } public string name { set { name_ = value; } get { return name_; } } } class Unmo { string name_; Responder responder; public Unmo(string name) { name_ = name; responder = new Responder("Waht"); } 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"); } } } |
Responderクラスのresponseメソッドをそれなりの処理に書き換えてやれば、人工無脳になる。
移植するのは簡単にいくかと思っていたけど、結構手間がかかりそう。