โปรแกรมประยุกต์อื่นๆ 259201 Computer Programming for Engineers (Week 13)
Outline ตัวอย่างเกม OX ส่วนวาดภาพ ส่วนรับอินพุต ส่วนตรวจสอบการแพ้ชนะ ส่วนสลับกันเล่น
ตัวอย่างเกม OX เริ่มต้น - ตารางเปล่า สลับกันเล่น ระบุตำแหน่ง ตรวจสอบการแพ้ชนะ วาดตารางใหม่ จนกว่าจะจบเกม O X O X
วาดตาราง Input/Output? วาดตารางอย่างไร? ตัวแปรมีกี่สถานะ? ตัวแปรแบบ 2 มิติเก็บตาราง OX ประกาศใน main Output ออกมาเป็นค่า? วาดตารางอย่างไร? ตัวแปรมีกี่สถานะ? 1 ช่องจากตัวแปร 1 ช่องจาก “|” ช่องว่าง 1 ช่องจาก “_” 1 ช่องจาก “+”
ส่วนวาดภาพ Q1: จงเขียนโปรแกรมที่มีรายละเอียดดังต่อไปนี้ ประกาศตัวแปรอาเรย์ขนาดสองมิติขนาด 3x3 กำหนดให้ค่าเริ่มต้นของตัวแปรดังกล่าวคือ 0 สุ่มค่าใดๆ ในตัวแปรดังกล่าวให้อยู่ในช่วง 0 - 2 ให้เขียนฟังก์ชันที่วาดตารางโดยนำค่าตัวแปรอาเรย์มาใช้ หากค่าในอาเรย์เป็น 1 วาด O หากค่าในอาเรย์เป็น 2 วาด X หากค่าในอาเรย์เป็น 0 วาดช่องว่าง เรียกใช้ฟังก์ชันดังกล่าว
q1.c #include<stdio.h> void print_tbl(int [3][3]); void main(void) { int table[3][3]={0,0,0,0,0,0,0,0,0}; int i, j; for (i=0; i<3; i++) for(j=0; j<3; j++) table[i][j] = rand()%3; print_tbl(table); } void print_tbl(int tbl[3][3]) { int i, j; for (i=0; i<3; i++) { for (j=0; j<3; j++) { printf(" "); if (tbl[i][j]==1) printf("o"); else if (tbl[i][j]==2) printf("x"); else if (j!=2) printf("|"); } printf("\n"); if (i!=2) printf("---+---+---\n");
ส่วนรับอินพุต การรับอินพุตจะรับผ่าน Coordinate ดังต่อไปนี้ รับทีละค่าเริ่มจากตำแหน่งแถวก่อน ตามด้วยหลัก 0,0 0,1 0,2 1,0 1,1 1,2 2,0 2,1 2,2
ส่วนรับอินพุต (Cont.) Q2: จงแก้ไขโปรแกรมจาก Q1 โดยให้เพิ่มเติมการรับอินพุตสำหรับผู้เล่น O หนึ่งครั้ง ต่อท้าย Code เดิม ดังตังอย่างต่อไปนี้ Enter O horizontal axis: 1 Enter O vertical axis: 0 ถ้าตำแหน่งดังกล่าวมี O หรือ X ไว้แล้ว ให้วนซ้ำจนกว่าผู้ใช้จะกรอกค่าถูก O X O O X
q2.c #include<stdio.h> void print_tbl(int [3][3]); void main(void) { int table[3][3]={0,0,0,0,0,0,0,0,0}; int i, j; int h, v; for (i=0; i<3; i++) for(j=0; j<3; j++) table[i][j] = rand()%3; print_tbl(table); do { printf("Enter o horizontal axis: "); scanf("%d", &h); printf("Enter o vertical axis: "); scanf("%d", &v); }while(table[h][v]==1||table[h][v]==2); table[h][v]=1; } void print_tbl(int tbl[3][3]) { int i, j; for (i=0; i<3; i++) { for (j=0; j<3; j++) { printf(" "); if (tbl[i][j]==1) printf("o"); else if (tbl[i][j]==2) printf("x"); else if (j!=2) printf("|"); } printf("\n"); if (i!=2) printf("---+---+---\n");
ส่วนตรวจสอบการแพ้ชนะ ตัวอย่างการแพ้ชนะ O X O O X X X X O O
ส่วนตรวจสอบการแพ้ชนะ (Cont.) แนวนอน แนวตั้ง แนวทะแยงมุม
ส่วนตรวจสอบการแพ้ชนะ (Cont.) Q3: จงเขียนโปรแกรมที่มีรายละเอียดดังต่อไปนี้ ประกาศตัวแปรอาเรย์ขนาดสองมิติขนาด 3x3 กำหนดให้ค่าเริ่มต้นของตัวแปรดังกล่าวคือ 0 ให้เขียนฟังก์ชันตรวจสอบการแพ้ชนะในแนวนอนที่แถวที่ 0 ส่งค่า 0 กลับหากไม่มีการแพ้ชนะ ส่งค่า 1 กลับหาก o ชนะ ส่งค่า 2 กลับหาก x ชนะ ให้สมมุติค่าเพื่อทดสอบฟังก์ชันดังกล่าวในโค๊ด
q3.c // ส่วนไหนยังไม่ใช้ สามารถ comment ไว้ก่อนได้ #include<stdio.h> void print_tbl(int [3][3]); int check_winning(int [3][3]); void main(void) { int table[3][3]={0,0,0,0,0,0,0,0,0}; int winner = 0; table[0][0]=1; table[0][1]=1; table[0][2]=1; print_tbl(table); while (winner==0) { winner = check_winning(table); } if (winner==1) printf("O win\n"); else if (winner==2) printf("X win\n"); int check_winning(int tbl[3][3]) { if (tbl[0][0]==1 &&tbl[0][1]==1 &&tbl[0][2]==1) return 1; else if (tbl[0][0]==2 &&tbl[0][1]==2 &&tbl[0][2]==2) return 2; else return 0; }
ส่วนสลับกันเล่น สร้างตัวแปรสำหรับเก็บผู้เล่นปัจจุบัน 0 สำหรับผู้เล่น o 1 สำหรับผู้เล่น x สลับกันโดยใช้การประมวลผลนิพจน์ทางตรรกศาสตร์ !0 -> 1 !1 -> 0
ส่วนสลับกันเล่น (Cont.) Q4:จงแก้ไขโปรแกรมจาก Q2 และ Q3 เพื่อให้ผู้ใช้สามารถเล่นเกม OX ได้โดยมีลักษณะต่อไปนี้ เริ่มต้นด้วยตารางว่าง สลับกันเล่นได้ โดยเริ่มจาก o ก่อน สามารถป้อนตำแหน่งการใส่ o หรือ x ได้ โดยห้ามใส่ทับตำแหน่งที่มีค่า o หรือ x หากใส่ทับให้ใส่ใหม่เรื่อยๆ สามารถตรวจสอบการแพ้ชนะในแนวนอน แถวที่ 0 ได้
q4.c #include<stdio.h> void print_tbl(int [3][3]); int check_winning(int [3][3]); void main(void) { int table[3][3]={0,0,0,0,0,0,0,0,0}; int h, v, winner = 0, player=0; print_tbl(table); while (winner==0) { if (player==0) { do { printf("Enter o horizontal axis: "); scanf("%d", &h); printf("Enter o vertical axis: "); scanf("%d", &v); } while(table[h][v]==1||table[h][v]==2); table[h][v]=1; } else { printf("Enter x horizontal axis: "); printf("Enter x vertical axis: "); } while ( (table[h][v]==1||table[h][v]==2); table[h][v]=2; } winner = check_winning(table); player=!player; printf("\n"); print_tbl(table); } if (winner==1) printf("O win!\n"); else if (winner==2) printf("X win!\n");