ไปที่เนื้อหา


รูปภาพ

สัพเพเหระกับ C++


  • กรุณาลงชื่อเข้าใช้เพื่อตอบกระทู้
มี 5 โพสต์ตอบกลับกระทู้นี้

#1 AssertionFailed

AssertionFailed

    Exclusive Member

  • Exclusive Programmer
  • 10116 โพสต์

โพสต์เมื่อ 03 April 2007 - 06:40:14 AM

เล่น RTK 10 เพิ่งจบไป
ก็เลยเกิดอาการคิดถึง สามก๊ก
มันก็ทำให้คิดถึง ts
ก็เลยแวะไปดูตาม ts official site ของประเทศต่างๆ เพื่อติดตามความเคลื่อนไหว
เช่นของมาเลย์ ก็เจอข่าวไม่ค่อยดี เพราะรวมเซิร์ฟ (นั่นก็หมายถึงคนเล่นน้อย อาจไปไม่รอด)
แล้วไปเจอของปินส์ ไปเจอพาดหัวโตๆ "อีกไม่นานเกินรอจะให้เล่นฟรีตลอดไป" นี่แหละที่อาจให้ต้องมาเล่น ts อีกครั้ง

เพราะที่จีนเขาก็ทดลองให้เล่นฟรีมานานแล้ว แต่มีการเปลี่ยนระบบหลายอย่าง(เพื่อทดแทนกับคำว่า ฟรี)
ถ้าจำไม่ผิด(ถึงจำถูก ก็ไม่แน่ใจ) ขุนจับไม่ได้ ขุดตีไม่ได้ อะไรประมาณนี้แหละ (แต่มีขาย ก็ใชัิเงินจริงหน่ะแหละ)
ฟังเขามาอีกที ไม่ได้ลองเอง เพราะกลัวเทพ เจอแต่ละคำถามมีเฮ มีหวังได้นั่งร้องโฮ กะคุณยาย

แต่เรื่องเหล่านี้ไม่ใช่ปัญหา ถ้ามี พลังบอท 555 (และก็เป็นเหตุ ที่ให้ต้องแวะมาที่บอร์ดนี้)
ถ้าเงื่อนไขเป็นจริง ก็อยากลองกลับมาทำบอทอีกสักครั้ง
เวลาที่ผ่านไป ก็รู้สึกสกิลจะเพิ่มขึ้น ไปดูโค้ดเก่าๆ ของตัวเอง ช่างน่าหัวเราะซะเหลือเกิน
ช่วงนี้เลยขอ ซึมชับอะไรๆ แถวๆ นี้ ไปก่อนละกัน
จากที่อ่านมาทุกกระทู้ คนแก่ๆ แถวนี้ยังอยู่ tongue.gif คงได้อาศัยความรู้จากเหล่าท่านอาวุโสอีกนาน

ไหนๆ ก็แวะมา ขอพิมพ์อะไรเล่นๆ ช่วงนี้ของพิมพ์อะไรๆ เล่นๆ ขำๆ ฆ่าเวลาไปก่อนละกัน

#2 AssertionFailed

AssertionFailed

    Exclusive Member

  • Exclusive Programmer
  • 10116 โพสต์

โพสต์เมื่อ 03 April 2007 - 07:28:38 AM

พลัง oop ของ c++ ก็มีเหมือนกันนะจะบอกให้ มาเริ่มกันเลย

1. Abstraction
ตามศัพท์ก็หมายถึง "นามธรรม" (ตรงข้ามกับ รูปธรรม) ก็คือสิ่งที่จับต้องไม่ได้ทั้งหลาย เช่น ความคิด
ในที่นี้หมายถึง ความสามารถของภาษาที่สร้างสิ่งสมมติขึ้นมาให้สามารถ เป็นหรือทำงาน เหมือนดังว่าเป็นสิ่งมีชีวิตชนิดหนึ่ง
(ถ้าเข้าใจคำศัพท์ จะเข้าใจแนวคิดมากขี้น อ่านดิกฯ ช่วยได้เหมือนกันลองดู)
เช่นว่า กิน เป็น นามธรรม (หมายถึงอะไร นึกเอาเอง) คนก็กิน สัตว์ก็กิน แต่แตกต่างกัน
เราเขียนบอท มักต้องมีฟังก์ชัน connect() เหมือนกัน
แต่โค้ดจริงๆ มักต่างกัน
(นี่ก็เป็นความหมายนึง ที่แฝงอยู่ในคำว่า abstraction ความเหมือนที่แตกต่าง)
คุณสมบัติข้อนี้ ก็เพื่อให้ง่ายต่อการแก้ปัญหา

เช่นเราสร้างบอท ให้ทำงานเหมือนสิ่งมีชีวิตกัน

class Bot
{
public:
  int nHP; //สิ่งมีชีวิตมีคุณสมบัติ เฉพาะตัวเช่น อายุ เพศ บอทก็มีเหมือนกัน
  int Connect();//สิ่งมีชีวิตมีทวาร คือประตูเชื่อมต่อกับสิ่งภายนอก เช่น หู ตา บอทก็มีเหมือนกัน
private:
  bool isDie();//สิ่งมีชีิวิตมีกระบวนการทำงานภายใน เช่นกระเพาะทำงาน บอทก็มีเหมือนกัน
};


อธิบายเพิ่มเติม ที่ว่า ง่ายต่อการแก้ปัญหา ง่ายยังไง
เมื่อเราจำลองการทำงานเหมือนสิ่งมีชีวิต
เราก็สามารถอธิบายง่ายๆ ได้ว่า ขั้นตอนของบอททำงานอย่างไรบ้าง ก็คือเิริ่มด้วย connect() แล้วก็ ... ตามลำดับ
ด้วยความเป็น acstraction เวอร์ชันนี้ เราเขียนการทำงานภายในของ connect() แบบนึง
เวอร์ชันหน้า เราเขียนอีกแบบนึง แต่บอทเราก็ยังทำงานได้ โดยไม่ต้องไปแก้ส่วนอื่นๆ ที่ไม่เกี่ยวข้อง
เพราะบอทเราติดต่อภายนอกด้วย connect() เหมือนเดิม(ลองนึกภาพโปรแกรมของเราทำงานเป็นส่วนๆ)
อีกอย่างเราสามารถรันบอทได้หลายๆ ตัวพร้อมกัน เพราะบอทแต่ละตัวก็มีคุณสมบัติที่เป็นส่วนตัวของมัน
บอทตัวนี้ก็มี nHP อีกตัวก็มี nHP แต่มีค่าไม่เท่ากัน (เหมือนกันแต่ไม่เหมือนกัน)
และข้อดีอื่นๆ (ไม่อธิบายละ อ่านหนังสือเอาเอง 555)


#3 AssertionFailed

AssertionFailed

    Exclusive Member

  • Exclusive Programmer
  • 10116 โพสต์

โพสต์เมื่อ 03 April 2007 - 08:06:28 AM

2. Encapsulation
ตามศัพท์ en-=ทำให้,capsule=ยา( laugh.gif ),-ation=การ,ความ(ทำให้เป็นคำนาม)
รวมๆ ก็หมายถึง การทำให็เป็นยา laugh.gif ทับศัพท์ละกันนะ น่าจะเข้าใจง่าย ก็คือการ ทำให้เป็นแคปซูล
ยาที่เป็นแคปซูลเป็นยังไง
สิ่งที่เราเห็นก็เป็นกลมๆ ยาวๆ เป็นสีๆ สีเดียวมั่ง สองสีมั่ง บ้างก็มีรสหวาน
ถ้าเราแกะออกดู ก็มักจะมีตัวยาอะไรไม่รู้ เป็นผงๆ อยู่ด้านใน ถ้าลองเอาแต่ลิ้นดู ส่วนใหญ่จะมีรสขม
แค่นี้ก็พอทำให้เรานึกถึงประโยชน์ของการทำเป็นแคปซูลได้
ทำให้เรากินง่าย ยามีรสขม กินตรงๆ คงแย่ ใส่แคปซูลเคลือบรสหวาน โอ้ว สบาย
ทำให้เรากินได้ตามขนาด ถ้าบอกต้องกิน 100 มิลลิกรัม เป็นผง กินยังไง ใส่เป็นแคปซูล นับง่ายๆ
จำแนกได้ง่าย ยาอาจเป็นผงสีขาวเหมือนกันหมด แต่เป็นแคปซูล แยกเป็นสี หรือพิมพ์ตัวหนังสือใส่ด้วย เราก็รู้ได้ง่าย ว่าเป็นยาอะไร

การเขียนโปรแกรมก็เหมือนกัน

class Bot
{
public:
   int Connect();
   int DisConnect();
   int Send();
   int Recv();
   int GetHP();
protected:
   int m_nHP;
   int Walk();
private:
  socket m_s;
};


ในส่วน public ก็เหมือนกับ ส่วนภายนอกของแคปซูล เราเรียกว่า interface
เป็นส่วนที่ติดต่อกับภายนอก ผู้ที่นำไปใช้ไม่จำเป็นต้องรู้ว่าภายในมันทำงานยังไง แค่รู้วิธีนำไปใช้ก็พอ
ในส่วน proteced กับ private เป็นส่วนที่เราต้องการปิดไว้ ไม่ให้คนภายนอกรู้
ฉะนั้น Encapsulation ก็คือความสามารถ ที่เราสามารถเลือกได้ว่า จะเปิดหรือปิดตรงไหนบ้าง
ประโยชน์ที่เห็นได้ชัดๆ ก็คือ ลดความยุ่งยากซับซ้อน

เอาหละจบห้วนๆ แค่นี้ ตามระเบียบ พอเป็นแนวทาง
เรียนหนังสือเขายังแบ่งเป็นชั้นๆ แต่ละชั้นเรียนเป็นปี
นี่กะจะอ่านไม่กี่บรรทัด แล้วเข้าระดับเทพ มันก็เวอร์เกินหละ

#4 AssertionFailed

AssertionFailed

    Exclusive Member

  • Exclusive Programmer
  • 10116 โพสต์

โพสต์เมื่อ 03 April 2007 - 08:29:34 AM

3. Inheritance
แนวคิดนี้เข้าใจได้ไม่ยาก
ลอกนึกภาพลูกกับพ่อแม่
ลูก จะมีบางอย่างที่เหมือนพ่อ บางอย่างที่เหมือนแม่ บางอย่างไม่เหมือนใครเลย
บางอย่างพ่อแม่มี แต่ลูกไม่มี

การเขียนโปรแกรมก็เหมือนกัน

class Bot
{
public:
   int Connect();
   int DisConnect();
   int Send();
   int Recv();
   int GetHP();
protected:
   int m_nHP;
   int Walk();
private:
  socket m_s;
};

class TSBot:public Bot
{
private:
   void SendItem();
};

class YGBot:public
{
public:
   void Warp();
};


ทั้ง TSBot และ YGBot ต่างสืบทอดมาจาก Bot
ดังนั้นมันจึงสามารถใช้ความสามารถในส่วน public กับ protected ของ Bot ได้
แต่ไม่สามารถใช้ในส่วน private ได้

และ TSBot ก็แตกต่างกับ YGBot
เพราะ TSBot มี SendItemp แต่ YGBot ไม่มี
ในขณะที่ YGBot มี Warp() แต่ TSBot ไม่มี
ดัวอย่าง อีกสักนิด เผื่อไม่เข้าใจ


TSBot ts;
YGBot yg;

ts.Send(); //ok ได้มาจาก Bot
yg.Connect();//ok ได้มาจาก Bot
yg.Warp();//ok
ts.Warp();//Error! ฟังก์ชันนี้ไม่มีใน TSBot


ประโยชน์ที่เห็นชัดๆ จากข้อนี้ก็คือการย่นระยะเวลาในการพัฒนาโปรแกรม
ในเมื่องานบางอย่างมันก็ทำงานเหมือนกัน เราไม่จำเป็นต้องมานั่งเขียนใหม่
ใช้การสิบทอดเอา เหมือนอย่างบอท ไม่ว่าบอทเกมไหน ก็มีการ connect(), disconnect(), send() และ recv()

เอาหล่ะพอแค่นี้ก่อน รอกระทู้ข้างๆอัพเดท แล้วค่อยตามไป
ช่วงนี้ถ้าใครโชคร้ายบังเอิญมาอ่าน สงสัยแล้วอยากถามก็เิชิญครับ นอกเรื่องก็ได้นะ


#5 AssertionFailed

AssertionFailed

    Exclusive Member

  • Exclusive Programmer
  • 10116 โพสต์

โพสต์เมื่อ 03 April 2007 - 08:58:13 AM

อ้อ เขาพูดเรื่องการตั้งชื่อด้วยนิ biggrin.gif
งั้นก็ต่ออีกนิด

c++ ไม่มีกฏตายตัว ตั้งไง ก็ไม่อายใคร
แต่บางทีก็นิยมตั้งชื่อคลาสขั้นต้นด้วย C อาจจะเป็นอิทธิพลของ MFC

ที่ว่าไม่มีกฏ หมายถึง ไม่กำหนดให้มีตัวอะไรเฉพาะนะครับ
แต่การตั้งชื่อก็ใช้กฏสากลที่นิยมกัน ก็คือ สื่อความหมาย อ่านแล้ว ก็สามารถบอกได้ว่า เป็นอะไร
เช่น

//ควรตั้งชื่อค่าคงที่เป็นพิมพ์ใหญ่

#define TSBOT 1
#define YGBOT 2

const unsigned int USERID=11257;

//ชื่อคลาส ชื่อฟังก์ชัน ควรขึ้นต้นด้วยพิมพ์ใหญ่
//ชื่อคลาสมักเป็นคำนาม ฟังก์ชันเป็นคำกิริยา

class UserData
{
};

void  DisConnect();


//ชื่อตัวแปร ขึ้นต้นด้วยพิมพ์เล็ก และมักขึ้นต้นด้วยตัวย่อบอกประเภทตัวแปร

bool bEnd;
short* psLevel;
int nCode;//บ้างก็นิยมใช้ i บ้างก็แล้วแต่การนำไปใช้เช่นใช้ n สำหรับตัวแปรที่บอกจำนวน ส่วนตัวผมไม่ค่อยใช้ i เพราะมันมองไม่ค่อยเห็น


//ถ้าเป็นสมาชิกของคลาส (data member) มักขึ้นต้นด้วย m_

class Info
{
bool m_bRunning;
DWORD _dwExp;//บางที่ก็ใชแค่ underscore แต่ไม่ควรใช้ double underscore เพราะมักจะสงวนไว้สำหรับคอมไพเลอร์
LONG lMoney_;//แบบนี้ก็มี แต่มันมองไม่ค่อยเห็นผมเลยไม่นิยม
};


//ถ้าเป็นตัวแปรแบบ global ก็มักขึ้นต้วย g หรือ g_
int g_nStatus;
float gfPosX;


จะเห็นว่าเราสามารถเลือกได้หลายรูปแบบ ไม่มีรูปแบบไหนผิด
ข้อสำคัญอยู่ตรงที่ ถ้าเลือกแบบไหนแล้ว ก็ควรใช้แบบเดียวกันตลอดโปรแกรม

#6 JackY

JackY

    หนี Microsoft ไม่พ้นซักทีเรา

  • Exclusive Programmer
  • 10072 โพสต์
  • Location:ซอกเล็กๆในหัวใจเธอ

โพสต์เมื่อ 16 June 2007 - 12:28:49 PM

แหะๆๆ แขวะเราเป่าเนี่ย มาโพสไว้แล้วไม่มีเวลามาต่อ หุหุ หลายๆท่านที่ติดตามอยู่อดใจรอนิดนึงนะฮะ




0 สมาชิกกำลังอ่านกระทู้นี้

0 สมาชิก, 0 ผู้เยี่ยมชม, 0 ผู้ใช้งานที่ซ่อนตัว