November 18, 2011

Word Challenge Bot

จากบทความที่แล้ว ผู้เขียนได้สร้างบอทตัวแรก ที่สามารถพิมพ์ Keyboard แบบ Auto ได้ คราวนี้จึงได้ไอเดีย นำมาดัดแปลงสร้างบอทที่มีความฉลาดมากกว่านั้นนิดหน่อย ด้วยการทำบอทเกม Word Challenge ของค่าย Playfish ใน Facebook (แต่ปัจจุบัน เกมนี้ได้ปิดตัวลงเป็นที่เรียบร้อยแล้ว T T)


โดยคร่าวๆ เกมนี้จะให้อักษรภาษาอังกฤษเรามี 6 ตัว แล้วก็จัดเรียงเป็นคำศัพท์ภาษาอังกฤษ ที่มีความยาวตั้งแต่ 3-6 ตัวอักษร และแข่งกับเวลาด้วย ดังนั้นถ้าพิมพ์คำศัพท์ได้เยอะหรือรู้คำศัพท์มากๆก็จะดี ด้วยเหตุนี้ผู้เขียนจึงนำเอาคำสั่ง SendKeys ใน C# มาประยุกต์ใช้ให้พิมพ์คำศัพท์แบบ Auto รวมกับการหา Database ที่รวบรวมคำศัพท์เอาไว้มากๆ (ก็หาจากกูเกิ้ลนั่นแหละ -.-")

รูปร่างหน้าตาของบอทของผู้เขียน

ผู้เขียนไม่ใช่คนแรกที่เป็นคนทำบอทตัวนี้ แต่ที่ผู้เขียนทำขึ้นมานั้นก็เพราะอยากพัฒนาทักษะการเขียนโปรแกรมเท่านั้นเอง วิธีการใช้บอทตัวนี้ก็คือ เมื่อเราได้อักษรภาษาอังกฤษมา 6 ตัวแล้ว ให้เราพิมพ์ใส่ลงไปในช่องว่างในโปรแกรมจากนั้นกดปุ่ม LET GO รอนับถอยหลัง 3 วินาที โปรแกรมจะทำการ Search คำศัพท์ที่ประกอบไปด้วยตัวอักษรอย่างน้อย 3 ตัวใน 6 ตัวนั้นใน Database จากนั้นก็ใช้คำสั่ง SendKeys ในการพิมพ์แบบ auto ซึ่งในแต่ละชุดตัวอักษรจะใช้เวลาไม่เกิน 5 วินาที แค่นี้เราก็สามารถทำคะแนนสูงๆได้อย่างสบายๆแล้วล่ะ

หลังจากที่ใช้บอทเล่นดู ก็เป็นแบบนี้

คะแนนห่างจากที่สองเยอะเหมือนกันนะ

ล่าสุดเข้าไปเล่น ก็เจอภาพนี้ น่าเศร้าใจ T T

ตัวอย่าง Code ของการเขียนบอท
ส่วนหัวของโปรแกรมที่จำเป็น :
using System.IO;
using System.Collections;
using System.Threading;
การประกาศตัวแปรภายใน Class :
public string[] dic = new string[44943]; 
// 44943 is a number of data in database
public string s;
public ArrayList print = new ArrayList();
ส่วนเริ่มต้น เมื่อทำการ Load Form :
StreamReader data;
data = File.OpenText(@".\data.txt"); //data.txt is database file
string st = data.ReadLine();
int i = 0;
while (st != null)
{
        dic[i] = st;
        st = data.ReadLine();
        i++;
}
data.Close();
action หลังจากกดปุ่มเริ่มต้นทำงาน :
s = textBox1.Text; //textBox1.Text is an area to input 6 alphabets.
if (s.Length == 6)
{
        for (int k = 0; k < dic.Length; k++)
        {
             int temp = 0;
             for (int i = 0; i < dic[k].Length; i++)
                  if (s.Contains(Char.ToLower(dic[k][i])))
                        temp += 1;
             if (temp == dic[k].Length)
             {
                  print.Add(dic[k]);
             }
        }
        Thread.Sleep(3000);
        foreach (string i in print)
        {
             SendKeys.Send(i);
             SendKeys.Send("{ENTER}");
        }
        print.Clear();
        textBox1.Text = "";
}
หมายเหตุ : algorithm ที่ใช้ในการ search ยังมีบัคอยู่เล็กน้อย แต่สามารถอนุโลมได้ :P

No comments:

Post a Comment