Showing posts with label Word Challenge Bot. Show all posts
Showing posts with label Word Challenge Bot. Show all posts

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