มิถุนายน 17, 2019, 01:04:35 am *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: มาเขียนเกมเล่นกัน ^^  (อ่าน 20759 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
chayenkung
บุคคลทั่วไป
| |
« เมื่อ: มีนาคม 07, 2010, 10:53:23 pm »

หลายคนคงมีคำถาม หรือคงเคยเจอคำถามว่าเราเขียนโปรแกรม (C/C++) ไปทำไม ?

ก็แค่ printf, scanf, cin, cout, if else, for, while ไว้ทำโจทย์ส่งอาจารย์เท่านั้นเอง ไม่เห็นจะทำอะไรได้ ??!!

อ่ะ ใครว่าทำอะไรไม่ได้ล่ะครับ เดี๋ยวเราจะใช้คำสั่งพวกนี้มาเขียนเกมเล่นกัน 8)

แต่คงไม่ใช่เกม GTA (เดี๋ยวห้ามขาย) ไม่ใช่ Mario (ทารุณสัตว์) หรือ DotA (บุกรุกป่า) เพราะเด็กๆ ที่เล่นอาจเกิดพฤติกรรมเลียนแบบได้ ;D

แต่เกมที่เราจะสร้างขึ้นมา มันคือเกม OX ที่เราๆ คงเคยเล่นกันในกระดาษสมัยประถมนี่เอง

จะดีแค่ไหน ถ้าเกม OX มาอยู่ในคอมพิวเตอร์ ที่สำคัญสร้างขึ้นมาจากฝีมือของเราเอง  :o

เรามาเริ่มไปพร้อมๆ กันเลยดีกว่าครับ


ก่อนอื่นมากำหนดขอบเขตเกมของเรากันก่อน

- เกม OX ที่เราจะเขียน มีขนาด 3x3 ช่อง

- เลือกตำแหน่งโดยใช้ปุ่ม Q,W,E,A,S,D,Z,X,C

- ผู้เล่นเดี่ยว มีคู่ต่อสู้คือ"คอมพิวเตอร์" !!!!


ต่อไปจะอธิบายอัลกอริธึมคร่าวๆ ที่เราจะใช้ในเกม OX กันครับ

1. เริ่มแรก จะกำหนดตารางว่างเปล่าจำนวน 3x3 ช่อง (int mat[3][3]) กำหนดให้แต่ละช่องมีค่า = 0

2. สร้างตัวแปร turn เพื่อนับจำนวนเทิร์น พร้อมกำหนดตัวผู้วางหมากในแต่ละรอบ (PLAYER:turn mod 2 == 0, COM:turn mod2 != 0)

3. ให้ผู้เล่นเลือกตำแหน่งตารางที่จะวางหมาก ในช่องที่ยังว่างอยู่ (มีค่าเท่ากับ 0)

   - ในกรณีที่ PLAYER เป็นฝ่ายเลือก จะเปลี่ยนค่าในช่องนั้น ให้กลายเป็น 1
   
   - ในกรณีที่ COM เป็นฝ่ายเลือก จะเปลี่ยนค่าในช่องนั้น ให้กลายเป็น 4

(ทำไมถึงต้องกำหนดให้เป็น 1 และ 4 ลองอ่านข้อต่อไปดูครับ)

4. หลังจากวางหมากแต่ละครั้งก็จะหาผู้ชนะครับ โดยการนำช่อง 3 ช่องในตำแหน่างแนวตั้ง 3 แถว, แนวนอน 3 แถว และแนวแทยง 2

แถว มาบวกกัน  

   - หากในแถวใดแถวหนึ่งบวกกันแล้วได้เท่ากับ 3 (1+1+1) แสดงว่า PLAYER เป็นผู้ชนะ
   
   - แต่หากบวกกันแล้วได้เท่ากับ 12 (4+4+4) แสดงว่า COM เป็นผู้ชนะครับ

(สาเหตุที่เรากำหนดให้ตัวเลขเป็น 1 และ 4 ในขั้นตอนก่อนหน้า เนื่องจากเมื่อนำแต่ละแถวมาบวกกัน โอกาสที่จะเกิดกรณีผลบวกเท่า

กันจะไม่มีครับ ลองยกตัวอย่าง หากเรากำหนดเป็น 1 และ 2 โอกาสที่จะบวกในแต่ละแถวแล้วได้เท่ากับ 2 ((1+0+0), (2+0+0)) จะมี

โอกาสเกิดขึ้น)


5. หากไม่มีผู้ชนะ ให้กลับไปทำข้อ 3.  จนกว่าจะมีผู้ชนะ หรือเสมอ (ช่องเต็ม)
บันทึกการเข้า
chayenkung
บุคคลทั่วไป
| |
« ตอบ #1 เมื่อ: มีนาคม 07, 2010, 11:24:36 pm »

ต่อไปมาดูในส่วนของการเขียนโปรแกรมกันครับ   ;)

Code:
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>

int mat[3][3];

/*ฟังก์ชันสำหรับแสดงตารางออกมาครับ*/
void printmat()
{
clrscr();
cout<<"Player is X ";
cout<<endl;
cout<<endl;
for(int i=0;i<3;i++)
{
cout<<"\t\t\t";
for(int j=0;j<3;j++)
{
if(mat[i][j]==0)
cout<<"[:]";
else if(mat[i][j]==1)
cout<<"[X]";
else if(mat[i][j]==4)
cout<<"[O]";
}
cout<<endl;
}
cout<<endl;
}

/*ฟังก์ชันสำหรับเคลียร์ค่าตารางให้แต่ละช่องกลายเป็น 0*/
void reset()
{
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
mat[i][j]=0;
}
}
}

/*ฟังก์ชันสำหรับกำหนดตำแหน่งที่ PLAYER หรือ COM เลือกครับ*/
int set(int x,int y,int player)
{
if(x==-1)
{
cout<<"You can't select this poisition !!";
}
else
{
if(mat[x][y]==0)
{
if(player%2==0)
mat[x][y]=1;
else
mat[x][y]=4;
return 1;
}
else
{
cout<<"You can't select this poisition !!";
}
}
cout<<endl;
return 0;
}

/*ฟังก์ชันสำหรับหาผู้ชนะ จะคืนค่า 1 หรือ 2 กลับ เพื่อบอกว่า PLAYER หรือ COM เป็นฝ่ายชนะ และค่า 0 หากยังไม่มีผู้ชนะ*/
int checkwinner()
{
int sum=0,i,j;

/*ตรวจสอบในแนวนอน*/
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
sum=sum+mat[i][j];
}
if(sum==3)
return 1;
else if(sum==12)
return 2;
sum=0;
}

/*ตรวจสอบในแนวตั้ง*/
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
sum=sum+mat[j][i];
}
if(sum==3)
return 1;
else if(sum==12)
return 2;
sum=0;
}

/*ตรวจสอบในแนวแทยงจากซ้ายมาขวา*/
for(i=0;i<3;i++)
{
sum=sum+mat[i][i];
}
if(sum==3)
return 1;
else if(sum==12)
return 2;
sum=0;

/*ตรวจสอบในแนวแทยงจากขวามาซ้าย*/
sum=mat[0][2]+mat[1][1]+mat[2][0];
if(sum==3)
return 1;
else if(sum==12)
return 2;
sum=0;

return 0;   // ถ้าไม่มีผู้ชนะ ให้รีเทิร์น 0 กลับไป
}

int main()
{
char poi,newgame;
int end=0,x=-1,y=-1,turn=0;
int ok=0;

do
{
clrscr();
srand(time(NULL));
end=0;
turn=0;

cout<<"\t\tKeys for select poisition";
cout<<endl;
cout<<endl;
cout<<"\t\t\t[Q][W][E]";
cout<<endl;
cout<<"\t\t\t[A][S][D]";
cout<<endl;
cout<<"\t\t\t[Z][X][C]";
cout<<endl;
cout<<endl;
cout<<"Click any key to continue";
getch();

reset();
while(end==0 && turn<9) // ทำซ้ำไปเรื่อยๆ ในขณะที่ยังไม่มีผู้ชนะ และจำนวน turn < 9
{
printmat();
if(turn%2==0)  // Player
{
cout<<"Enter Poisition : ";
do
{
poi=getch();
if(poi=='q' || poi=='Q')
{
x=0;
y=0;
}
else if(poi=='w' || poi=='W')
{
x=0;
y=1;
}
else if(poi=='e'|| poi=='E')
{
x=0;
y=2;
}
else if(poi=='a'|| poi=='A')
{
x=1;
y=0;
}
else if(poi=='s'|| poi=='S')
{
x=1;
y=1;
}
else if(poi=='d'|| poi=='D')
{
x=1;
y=2;
}
else if(poi=='z'|| poi=='Z')
{
x=2;
y=0;
}
else if(poi=='x'|| poi=='X')
{
x=2;
y=1;
}
else if(poi=='c'|| poi=='C')
{
x=2;
y=2;
}
else
{
x=-1;
y=-1;
}
}while(mat[x][y]!=0 || x ==-1);
}
else // Computer's Turn
{
cout<<"COM's turn, Please wait... \n";
do
{
if(turn<9)
{
ok=0;
x=rand()%3; // ให้ COM แรนดอมตำแหน่งของช่อง
y=rand()%3;
if(mat[x][y]==0)
ok=1;
}
}while(ok==0&&turn<9);
}

if(set(x,y,turn)==1); // ถ้าสามารถเลือกตำแหน่งดังกล่าวได้
{
end=checkwinner(); // ตรวจสอบหาผู้ชนะ
turn++;  // เพิ่มค่า turn ในแต่ละรอบ
}


}
printmat();
if(end==1)
{
cout<<"^^ You Win !! ";
}
else if(end==2)
{
cout<<"T T You Lost !! ";
}
else
{
if(turn==9)
{
cout<<"Ahhhh Draw ";
}
}
cout<<endl;
cout<<endl;
getch();

cout<<"New Game (Y)?: "; // ถามผู้เล่นว่าต้องการเล่นอีกหรือไม่ ?
cin>>newgame;

}while (newgame=='Y' || newgame=='y');
return 0;
}

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

โดยไม่รู้ตัว :o

ขอบคุณทุกท่านนะครับที่ติดตามบทความนี้มาโดยตลอด ถ้าผิดพลาดประการใดก็ขอน้อมรับไว้

สุดท้ายก็อยากฝากไว้ว่าการเขียนโปรแกรมไม่ได้น่าเบื่ออย่างที่คิด แต่มันมีความสนุกและท้าทายอยู่ในตัวมันเองครับ
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #2 เมื่อ: มีนาคม 08, 2010, 07:12:35 am »

ลองเอามาเล่นดูแล้วครับ แต่สู้คอมพิวเตอร์ไม่ค่อยจะได้แงะ เดี๋ยวค่อยสู้อีกสักตั้ง

ตอนที่เอา code ไปแก้ผมติดปัญหานิดหน่อยครับ
ผมลอก code ไปคอมไพล์ด้วย Visual C++ 2008 กำหนด Project type เป็นแบบ Console Application และเลือกการสร้าง Project เป็นแบบ Empty project
ตอนคอมไฟล์มีข้อความบอกว่า:

Code:
fatal error C1083: Cannot open include file: 'iostream.h': No such file or directory
อันนี้ไม่แปลกครับเพราะยังไม่ได้ระบุการใช้ namespace เพราะฉนั้นสามารถแก้ไขได้ง่ายๆโดยการลบ #include <iostream.h> ทิ้งไปแล้วแทนที่ด้วย:
Code:
#include <iostream>
using namespace std;

ข้อความเตือนความผิดพลาดจากคอมไพล์เลอร์อีกอย่างคือ:
Code:
error C3861: 'clrscr': identifier not found
อันนี้ก็เป็นเรื่องธรรมดาอีกเช่นกัน เพราะการเขียนโปรแกรมบน Visual C++ หรือ C++ Builder แบบ Console Application ไม่สามารถเรียกใช้ dos function ได้โดยตรง
โดยปรกติการจัดการกับหน้าต่าง Console หรือหน้าต่าง dos จะต้อง handle มาแล้วจัดการไปยังตัว buffer ในการแสดงผลโดยตรง โดยการใช้ Window APIs
แต่มีทางที่ง่ายกว่านั้น คือใช้ฟังก์ชัน system() ในที่นี้ต้องการเคลียร์การแสดงผลบนจอ ให้ทำการลบ clrscr(); ออกไป แล้วแทนที่ด้วย

Code:
system("cls");


ขอบคุณ คุณ  chayenkung ครับที่ทำให้การเขียนโปรแกรมเป็นเรื่องเล่นๆไปได้
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
cpezoro
บุคคลทั่วไป
| |
« ตอบ #3 เมื่อ: มีนาคม 25, 2010, 01:51:50 pm »

โอ้ ได้ความรู้ดีครับ
ผมกำลังเขียนเกมส์แบบ exe ต้องทำไงมั่งครับ
ขอแนวทางทีครับ เขียนc++

ทำโปรแคเกี่ยวกับเกมส์ webcamอยู่ครับ
ช่วยแนะนำที
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #4 เมื่อ: มีนาคม 25, 2010, 08:04:34 pm »

อ้างถึง
ผมกำลังเขียนเกมส์แบบ exe ต้องทำไงมั่งครับ
ขอแนวทางทีครับ เขียนc++

ปรกติหลังจากการ Compile แล้วคุณจะได้ *.exe เลยครับ
ถ้าใช้ Visual C++
  • Compile แบบ Debug mode ตัว *exe จะอยู่ใน Folder ที่ชื่อ "Debug"
  • Compile แบบ Release mode ตัว *exe จะอยู่ใน Folder ที่ชื่อ "Release "

อ้างถึง
ทำโปรแคเกี่ยวกับเกมส์ webcamอยู่ครับ
ช่วยแนะนำที
เล่นเกี่ยวกับ Image processing แนะนำ OpenCV ครับ
  • พัฒนามาจากภาษาซี ใช้งานได้ทุก OS
  • ใช้งานง่าย ทำงานได้รวดเร็ว เป็นเครื่องมือที่นิยมใช้กันมาก ในวงการ Imageprocessing & Computer vision

บทความเกี่ยวกับการใช้งาน OpenCV ผมได้เขียนไว้ที่ :
http://www.shadowwares.com/Tutorials/OpenCV/html/Install_OpenCV_Part01.html


บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
lairwtiare
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 6


| |
« ตอบ #5 เมื่อ: พฤษภาคม 18, 2014, 07:50:49 pm »

 น่าสนใจดีคับ แต่คนเขียน C,C++ เริ่มหายากขึ้นทุกวันแล้วมั้ง ผมลองเอาโค๊ดไปคอมไพล์เล่นดูแล้ว คอมพ์มันไม่ค่อยเก่งเท่าไร
ก็เลยเขียน AI ช่วยให้มันเก่งขึ้นมาหน่อย เลยเอาโค๊ดฟังชั่นมาแบ่งปัน เผื่อมีคนเริ่มเขียน C,C++ ผ่านมาเห็น จะได้เป็นประโยชน์ต่อไป

เอาละมาดูโค๊ดกัน
Code:
// AI ของคอมพ์งับ
void AI(int round)
{
int cx,cy,x1,x2,x3,y1,y2,y3,ok;
cx = -1;
cy = -1;
do
{
ok = 0;
if (round == 0)
{
cx = rand()%3;
cy = rand()%3;
ok = 1;
}
else if(round == 1) // *** 1111111111111111111111111111111111111111111111111 ***
{
if(mat[1][1] == 0)// กรณีผู้เล่นไม่ได้กดจุดกึ่งกลาง ให้เข้ากดจุดกึ่งกลาง
{
cx = 1;
cy = 1;
ok = 1;
}
else // สุ่ม 0 2 6 8
{
cx = (rand()%2)*2;
cy = (rand()%2)*2;
ok = 1;
}
}
else if(round > 2) // *** 333333333333    555555555555     7777777777777777 ***
{
if(round > 4) // หาจุดเอาชนะ
{
//cout << "comp to attack \n";
for(x1=0;x1<=2;x1++)// ตรวจแนวนอน
{
for(y1=0;y1<2;y1++)
{
if (mat[x1][y1] == 4)  // เลือกตรวจเฉพาะ จุด คอมพ์ที่ลงไว้แล้วเพื่อเพิ่มความเร็วในการประมวลผล และ แก้บัค
{
for(y2=y1+1;y2<3;y2++)
{
if(mat[x1][y1] == mat[x1][y2])
{
y3 = 3 - y1 - y2;
if(mat[x1][y3] == 0)
{
cx = x1;
cy = y3;
x1=3;y1=2;y2=3; // Break Down loop
ok = 1;
}
}
}
}
}
}
for(x1=0;x1<=1;x1++)// ตรวจแนวตั้ง
{
for(y1=0;y1<=2;y1++)
{
if (mat[x1][y1] == 4)  // เลือกตรวจเฉพาะ จุดที่คอมพ์ลงไว้แล้วเพื่อเพิ่มความเร็วในการประมวลผล และ แก้บัค
{
for(x2=x1+1;x2<=2;x2++)
{
if(mat[x1][y1] == mat[x2][y1])
{
x3 = 3 - x1 - x2;
if(mat[x3][y1] == 0)
{
cx = x3;
cy = y1;
x1=10;x2=10;y1=10; // Break Down loop
ok = 1;
}
}
}
}
}
}
if (ok == 0)
{
if (mat[1][1] == 4)
{
for(x1=0;x1<=2;x1+=2)
{
for(y1=0;y1<=2;y1+=2)
{
if(mat[x1][y1] == 4)
{
x2 = 2 - x1;
y2 = 2 - y1;
if (mat[x2][y2] == 0)
{
cx = 2 - x1;
cy = 2 - y1;
x1=10;y1=10; // Loop break down
ok = 1;
}
}
}
}
}
else if (mat[0][0] == mat[2][2] || mat[0][2] == mat[2][0]) // เช็คมุมตรงข้าม
{
if(mat[0][0] == 4 || mat[0][2] == 4)
{
if(mat[1][1] == 0)
{
cx = 1;
cy = 1;
ok = 1;
}
}
}
}
}
if (ok == 0)
{
//cout << "comp to defence \n";
if(mat[1][1] == 1)                   // กรณีผู้เล่นได้จุดกึ่งกลางไป
{
if (round <= 3)
{
ok = 1;
if(mat[0][0] == 1)     // ผู้เล่นลง จุด 0 
{
if(mat[2][2] == 4) // กรณีมี 8 อยู่แล้วให้สุ่ม 2 6 ถ้าไม่มี 8 ให้ใส่ 8
{
cx = (rand()%2)*2;
cy = 2 - cx;
}
else
{
cx = 2;
cy = 2;
}
}
else if(mat[0][1] == 1)
{
if(mat[2][1] == 4) // กรณีมี 7 อยู่แล้วให้สุ่ม 0 2 6 8 ถ้าไม่มี 7 ให้ใส่ 7
{
cx = (rand()%2)*2;
cy = (rand()%2)*2;
}
else
{
cx = 2;
cy = 1;
}
}
else if(mat[0][2] == 1)
{
if(mat[2][0] == 4) // กรณีมี 6 อยู่แล้วให้สุ่ม 0 8 ถ้าไม่มี 6 ให้ใส่ 6
{
cx = (rand()%2)*2;
cy = cx;
}
else
{
cx = 2;
cy = 0;
}
}
else if(mat[1][0] == 1)
{
if(mat[1][2] == 4) // กรณีมี 5 อยู่แล้วให้สุ่ม 0 2 6 8 ถ้าไม่มี 5 ให้ใส่ 5
{
cx = (rand()%2)*2;
cy = (rand()%2)*2;
}
else
{
cx = 1;
cy = 2;
}
}
else if(mat[1][2] == 1)
{
if(mat[1][0] == 4) // กรณีมี 3 อยู่แล้วให้สุ่ม 0 2 6 8 ถ้าไม่มี 3 ให้ใส่ 3
{
cx = (rand()%2)*2;
cy = (rand()%2)*2;
}
else
{
cx = 1;
cy = 0;
}
}
else if(mat[2][0] == 1)
{
if(mat[0][2] == 4) // กรณีมี 2 อยู่แล้วให้สุ่ม 0 8 ถ้าไม่มี 2 ให้ใส่ 2
{
cx = (rand()%2)*2;
cy = cx;
}
else
{
cx = 0;
cy = 2;
}
}
else if(mat[2][1] == 1)
{
if(mat[0][1] == 4) // กรณีมี 1 อยู่แล้วให้สุ่ม 0 2 6 8 ถ้าไม่มี 1 ให้ใส่ 1
{
cx = (rand()%2)*2;
cy = (rand()%2)*2;
}
else
{
cx = 0;
cy = 1;
}
}
else if(mat[2][2] == 1)
{
if(mat[0][0] == 4) // กรณีมี 0 อยู่แล้วให้สุ่ม 2 6 ถ้าไม่มี 0 ให้ใส่ 0
{
cx = (rand()%2)*2;
cy = 2 - cx;
}
else
{
cx = 0;
cy = 0;
}
}
else ok = 0;
}
else
{
for(x1=0;x1<=2;x1++)// ตรวจแนวนอน
{
for(y1=0;y1<=1;y1++)
{
if (mat[x1][y1] == 1)  // เลือกตรวจเฉพาะ จุด ผู้เล่นที่ลงไว้แล้วเพื่อเพิ่มความเร็วในการประมวลผล และ แก้บัค
{
for(y2=y1+1;y2<=2;y2++)
{
if(mat[x1][y1] == mat[x1][y2])
{
y3 = 3 - y1 - y2;
if(mat[x1][y3] == 0)
{
cx = x1;
cy = y3;
x1=3;y1=2;y2=3; // Break Down loop
ok = 1;
}
}
}
}
}
}
for(x1=0;x1<=1;x1++)// ตรวจแนวตั้ง
{
for(y1=0;y1<=2;y1++)
{
if (mat[x1][y1] == 1)  // เลือกตรวจเฉพาะ จุดผูเล่น ที่ลงไว้แล้วเพื่อเพิ่มความเร็วในการประมวลผล และ แก้บัค
{
for(x2=x1+1;x2<=2;x2++)
{
if(mat[x1][y1] == mat[x2][y1])
{
x3 = 3 - x1 - x2;
if(mat[x3][y1] == 0)
{
cx = x3;
cy = y1;
x1=2;x2=3;y1=3; // Break Down loop
ok = 1;
}
else if(round == 3)
{
cx = (rand()%2)*2;
cy = (rand()%2)*2;
x1=2;x2=3;y1=3; // Break Down loop
ok = 1;
}
}
}
}
}
}
if (ok == 0) // ตรวจแนวทะแยง
{
for(x1=0;x1<=2;x1+=2)
{
for(y1=0;y1<=2;y1+=2)
{
if(mat[x1][y1] == 1)
{
x2 = 2 - x1;
y2 = 2 - y1;
if (mat[x2][y2] == 0)
{
cx = x2;
cy = y2;
x1=10;y1=10; // loop break down
ok  = 1;
}
}
}
}
}
}
}
else if((mat[1][1] == 4) && (ok == 0))              // กรณีคอมพ์ได้จุดกึ่งกลาง
{
for(x1=0;x1<=2;x1++)// ตรวจแนวนอน
{
for(y1=0;y1<=1;y1++)
{
if (mat[x1][y1] == 1)  // เลือกตรวจเฉพาะ จุด ผู้เล่นที่ลงไว้แล้วเพื่อเพิ่มความเร็วในการประมวลผล และ แก้บัค
{
for(y2=y1+1;y2<=2;y2++)
{
if(mat[x1][y1] == mat[x1][y2])
{
y3 = 3 - y1 - y2;
if(mat[x1][y3] == 0)
{
cx = x1;
cy = y3;
x1=3;y1=2;y2=3; // Break Down loop
ok = 1;
}
}
}
}
}
}
for(x1=0;x1<=1;x1++)// ตรวจแนวตั้ง
{
for(y1=0;y1<=2;y1++)
{
if (mat[x1][y1] == 1)  // เลือกตรวจเฉพาะ จุดผูเล่น ที่ลงไว้แล้วเพื่อเพิ่มความเร็วในการประมวลผล และ แก้บัค
{
for(x2=x1+1;x2<=2;x2++)
{
if(mat[x1][y1] == mat[x2][y1])
{
x3 = 3 - x1 - x2;
if(mat[x3][y1] == 0)
{
cx = x3;
cy = y1;
x1=2;x2=3;y1=3; // Break Down loop
ok = 1;
}
else if(round == 3)
{
cx = (rand()%2)*2;
cy = (rand()%2)*2;
x1=2;x2=3;y1=3; // Break Down loop
ok = 1;
}
}
}
}
}
}
for (x1=0;x1<3;x1+=2) // เช็คริมห่างมุม
{
for (y1=0;y1<3;y1+=2)
{
if(ok == 0)
{
if (mat[x1][y1] != 0)
{
x2 = 2-x1;
y2 = 2-y1;
if ((mat[x1][y1] == mat[x2][1]) && (mat[x2][y1] == 0))
{
cx = x2;
cy = y1;
x1=10;y1=10; // loop breakdown
ok = 1;
}
else if ((mat[x1][y1] == mat[1][y2]) && (mat[x1][y2] == 0))
{
cx = x1;
cy = y2;
x1=10;y1=10; // loop breakdown
ok = 1;
}
}
else // 2 ริมประกบมุม
{
if((mat[x1][1] == mat[1][y1]) && (mat[x1][1] != 0))
{
cx = x1;
cy = y1;
x1=10;y1=10; // loop breakdown
ok = 1;
}
}
}
}
}
if (ok == 0) // เช็คมุมตรงข้าม
{
if (mat[0][0] == mat[2][2] || mat[0][2] == mat[2][0])
{
cx = rand()%3; // สุ่ม 1 3 5 7
if(cx == 1) cy = (rand()%2)*2;
else cy = 1;
ok = 1;
}
}
}
}
}
if (ok == 0) // หาทางลงไม่ได้จิงๆ ก็มั่วไปเลย
{
cx = rand()%3;
cy = rand()%3;
ok = 1;
cout << " Oops!! , Comp more way to decision .";
}
cout << "comp think best way is :" << " X " << cx << " Y " << cy << " " << ok << round << "\n";
//getch();
}while((mat[cx][cy] != 0) || (ok == 0));
mat[cx][cy] = 4 ;
}
บันทึกการเข้า
lairwtiare
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 6


| |
« ตอบ #6 เมื่อ: พฤษภาคม 18, 2014, 08:02:14 pm »

โดยใส่ฟังก์ชั่น AI เข้าไป ก็อบจากโค๊ดผมเลย โดยใส่ไว้ก่อน ฟังก์ชั่น main เหมือนฟังก์ชั่นอื่นๆ
แล้วก็ แก้โค๊ด ในฟังก์ชั่น set นิดหน่อยตามนี้
Code:
if(mat[x][y]==0)
{
if(player%2==0)
mat[x][y]=1;
//else
//mat[x][y]=4;
return 1;
}
กลับในฟังก์ชั่น main ตามนี้
Code:
char poi,newgame;
int end=0,x=-1,y=-1,turn=0;
//int ok=0;
และ
Code:
else // Computer's Turn
{
cout<<"COM's turn, Please wait... \n";
//do
//{
if(turn<9)
{
//ok=0;
//x=rand()%3; // ให้ COM แรนดอมตำแหน่งของช่อง
//y=rand()%3;
//if(mat[x][y]==0)
// ok=1;
AI(turn); // ให้ฟังชั่นก์คิดตำแหน่งของช่อง
}
//}while(ok==0&&turn<9);
}
บันทึกการเข้า
Bicoob
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 2


| |
« ตอบ #7 เมื่อ: มิถุนายน 13, 2014, 04:08:29 pm »

จริงๆมันก็ทำไม่ยากนี่หว่า
บันทึกการเข้า

lairwtiare
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 6


| |
« ตอบ #8 เมื่อ: มิถุนายน 18, 2014, 07:53:08 pm »

แม่นแล้ว angel
บันทึกการเข้า
Hildareth
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 2


| |
« ตอบ #9 เมื่อ: กุมภาพันธ์ 25, 2019, 05:56:34 pm »

ใช้กับ Dota 2 ได้หรือเปล่าครับ
บันทึกการเข้า
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: