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

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

ครั้งก่อนได้แนะนำการเขียนเกมง่ายๆ อย่างเกม OX ซึ่งคิดว่าหลายคนคงเข้าใจหลักการ และคุ้นเคยกับ C Programming กันแล้วพอสมควร

คราวนี้เลยอยากชวนเพื่อนๆ พี่ๆ น้องๆ ลุงๆ ป้าๆน้าๆ อาๆ มาลองเขียนเกมง่าย เล่นกันอีกซักเกมนึง...

เป็นเกมเรียงตัวเลข 8 ตัวในตารางสี่เหลี่ยมจตุรัสเก้าช่อง (3x3)

คิดว่าหลายๆ คนคงเคยเล่นเกมนี้กันเมื่อตอนเด็กๆ

ซึ่งก็ไม่แน่ใจว่าเกมนี้ชื่อสากลโลกเขาเรียกกันว่าเกมอะไร (ก็คงจะเรียก "เกมเรียงตัวเลข" นั่นแหละ)

ใครนึกไม่ออกก็ลองดูภาพครับ



(ภาพตัวอย่างเป็นขนาด 4x4 ซึ่งยากไป ^^)

ก่อนอื่นขอพูดถึงอัลกิริธึมของเกมที่เราจะเขียนกันคร่าวๆ ก่อน

1. เนื่องจากผมจะสร้างเกมขนาด 9 ช่อง ดังนั้นจึงใช้อาเรย์ขนาด 3x3 แทนช่องทั้งหมดของเกม

2. แรนด้อมตัวเลข 1-8 ไม่ซ้ำกันลงในอาเรย์จำนวน 8 ช่องแรก และเลข 0 ลงในอาเรย์ช่องสุดท้าย

3. รอรับปุ่มที่ผู้เล่นจะต้องกดเพื่อเลื่อนตัวเลขที่อยู่ติดกับช่องว่าง

    โดยผมจะใช้ปุ่ม w สำหรับเลื่อนตัวเลขขึ้นบน, s สำหรับลงล่าง, a สำหรับไปซ้าย และ d สำหรับไปขวา

4. เกมจะจบต่อเมื่อตัวเลขทั้ง 8 ตัวได้เรียงกันถูกต้อง

ฟังดูไม่ยากใช่ไหมครับ งั้นลองมาดูโค้ดกันเลยดีกว่า

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

int mat[3][3]; // สร้างอาเรย์ขนาด 3x3

void printmat() // พิมพ์ตารางออกทางจอภาพ
{
clrscr();
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]!=9)
cout<<"["<<mat[i][j]<<"]";
else
cout<<"[ ]";
}
cout<<endl;
}
cout<<endl;
}

void reset() // รีเซ็ทตัวเลข
{
int count=1;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
mat[i][j]=count;
count++;
}
}
}

int check() // ตรวจสอบความถูกต้อง
{
int count=1;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(mat[i][j]!=count)
return 0;
count++;

}
}
return 1;
}


int main()
{
int randnum,ok=0,buff=0,poix,poiy;
int allnum[10],x,y,end=0;
char arrow;
time_t t;
srand((unsigned)time(&t));
reset();
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
x=rand()%3;
y=rand()%3;
buff = mat[i][j];
mat[i][j]=mat[x][y];
mat[x][y]=buff;
}
}

for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(mat[i][j]==9)
{
x=i;
y=j;
}
}
}

do
{
printmat();
cout<<"Press A W D S:";
arrow=getch();

if(arrow=='s')
{
if(x!=0) // not top
{
mat[x][y]=mat[x-1][y];
mat[x-1][y]=9;
x=x-1;
}
}

else if(arrow=='w')
{
if(x!=2) // not buttom
{
mat[x][y]=mat[x+1][y];
mat[x+1][y]=9;
x=x+1;
}
}

else if(arrow=='d')
{
if(y!=0) // not left
{
mat[x][y]=mat[x][y-1];
mat[x][y-1]=9;
y=y-1;
}
}

else if(arrow=='a')
{
if(y!=2) // not top
{
mat[x][y]=mat[x][y+1];
mat[x][y+1]=9;
y=y+1;
}
}

end=check();

}while (end==0);

printmat();
cout<<"^^ Congratuation !! "<<endl<<endl;

return 0;
}







โค้ดนี้เป็นโค้ดที่ผมได้เขียนขึ้นเป็นตัวอย่าง โดยใช้ iostream.h แทน stdio.h สำหรับ C++ ครับ

อาจจะงงว่าทำไมใช้ cin, cout ซึ่งจริงๆ แล้วก็ไม่ได้ต่างจาก scanf และ printf แต่ลองเขียนให้ดูในอีกแบบนึง

ใครที่สนใจก็สามารถลองนำไปคอมไพล์แล้วเล่นดูได้ครับ หรือจะนำไปพัฒนาต่อยอดเป็นขนาด 4x4, 5x5 ก็ได้ไม่ว่ากัน

แล้วพบกันใหม่ครับ ขอบคุณที่ติดตาม



บันทึกการเข้า
lairwtiare
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 6


| |
« ตอบ #1 เมื่อ: พฤษภาคม 19, 2014, 08:33:56 am »

รอภาค 3  rolleyes
บันทึกการเข้า
Nrador007
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 2


| |
« ตอบ #2 เมื่อ: ตุลาคม 11, 2016, 09:46:14 am »

รอทุกภาคเลยครับ ทำออกมาเรื้อยๆนะครับ
บันทึกการเข้า

หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: