วันพุธที่ 28 สิงหาคม พ.ศ. 2556

Riversi/Othello Board with Pieces

Full Othello Board

นี่เป็นการสร้างตารางเล่นโอเทลโล่ โดยการใช้โค้ดบางอย่างมาดัดแปลง เพื่อให้เข้ากับเกม อันดับแรก ผมสร้างตัวแปรชนิดต่างๆ สำหรับการเก็บข้อมูล เช่น ตัวแปร x สำหรับการเก็บข้อมูลในแกน X, ตัวแปร y สำหรับการเก็บข้อมูลในแกน Y, Array 2 มิติ เพื่อการแทนค่าในโอเทลโล่ เป็นต้น ตัวแปรเหล่านี้ ผมกำหนดให้เป็นตัวแปรชนิด Global Variable เพื่อให้แทนค่าได้ทั้งฟังก์ชั่น ฟังก์ชั่นส่วนใหญ่ที่ผมสร้างขึ้น ผมกำหนดให้อยู่ใน setup ในฟังก์ชั่นหลักตัวนี้ ผมสร้างเงื่อนไขหลายอย่าง ไม่ว่าจะเป็นลูป หรือเงื่อนไขธรรมดา ไม่ว่าจะเพื่อการสร้างหรือการนับ และการออกแบบรูปทรงต่างๆ ของหมาก รวมทั้งการตกแต่งด้วยสีสันเพื่อให้สังเกตได้ง่าย สามารถกำหนดจำนวนของหมาก และแถวได้ตาม Array 2 มิติ

Processing Code

int x = 50;  /*กำหนดตัวแปรชนิด Global Variable สองตัวเพื่อให้แทนค่าได้ทุกฟังก์ชั่นในโปรแกรม*/
int y = 50;
float [][] Otello = {
  {
    random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2)
  }
  , {
      random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2)
  }
  , {
      random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2)
  }
  , {
      random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2)
  }
  , {
      random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2)
  }
  , {
      random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2)
  }
  , {
      random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2)
  }
  , {
      random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2)
  }
  , {
      random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2)
  }
  , {
      random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2)
  }
  , {
      random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2)
  }
  , {
      random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2), random(0, 2)
  }
};  /*กำหนด Array 2 มิติ โดยให้ตัวเลขแต่ละตัวออกมาแทนค่าได้ตามเงื่อนไขในการวนลูปที่เรากำหนดขึ้น ในนี้ ตัวเลขแต่ละตัวในวงเล็บนี้ถูกกำหนดให้นำออกมาใช้แบบสุ่มตามหลักทศนิยม หรือฟังก์ชั่น float พร้อมกับฟังก์ชั่นในการสุ่มเลือก หรือ random() เราจะสังเกตได้ว่า สีของวงกลมที่ใช้แทนเบี้ยนั้นมีการเปลี่ยนไปเรื่อยทุกการใช้งานทีละครั้ง ยิ่งเรากำหนดตัวเลขมากขึ้น การเปลี่ยนสีก็ยิ่งนานขึ้น*/
int i = 0;  /*กำหนเพื่อการนับ*/  
int j = 0;
void setup() {  /*ฟังก์ชั่นหลักในการตั้งค่าโดยไม่มีการวนซ้ำ*/ 
  size(600, 600);  /*กำหนดความกว้างและสูงของพื้นที่ หรือ size(width, height)*/
  background(255, 251, 126);  /*ฟังก์ชั่นที่ใช้ในการเติมสีให้กับพื้นหลังโดยสีที่ใส่ไปนี้คือ สีเหลืองอ่อน สามารถกำหนดได้ตามค่าของแม่สี หรือเครื่องหมาย #*/
  while (x < 600) {  /*ในกรณีที่ x น้อยกว่า 600 จึงจะทำการเข้าวนลูปได้*/ 
    strokeWeight(3);  //ฟังก์ชั่นที่ใช้ในการกำหนดน้ำหนักของเส้นโดยใส่ตัวเลขลงไปในวงเล็บ
    line(x, 0, x, 600);  /*ถ้าเงื่อนไขข้างบนไม่เป็นจริง จะวาดเส้นที่กำหนดด้วยฟังก์ชั่น line(x1, y1, x2, y2)*/
    x = x+50;  //ค่า x จะมีค่าเพิ่มขึ้นทีละ 50 ในเงื่อนไขนี้ หากเป็นจริง
  }
  while (y < 600) {  /*ในกรณีที่ y น้อยกว่า 600 จึงจะทำการเข้าวนลูปได้*/ 
    line(0, y, 600, y);  /*ถ้าเงื่อนไขข้างบนไม่เป็นจริง จะวาดเส้นที่กำหนดด้วยฟังก์ชั่น line(x1, y1, x2, y2)*/
    y = y+50;  //ค่า y จะมีค่าเพิ่มขึ้นทีละ 50 ในเงื่อนไขนี้ หากเป็นจริง
  }
  x = 25;  //กำหนดให้ค่าของตัวแปรทั้งสองนี้ใหม่ และยังคงเป็นจำนวนเต็ม เพื่อนำมาใช้กับลูปถัดไป
  y = 25;
  while(i < Otello.length){  /*ในกรณีที่ i น้อยกว่าความยาวของ OX หรือ 12 จึงจะทำการเข้าวนลูปได้*/ 
    while(j < Otello[i].length){  /*ในกรณีที่ j น้อยกว่าความยาวของ OX หรือ 12 จึงจะทำการเข้าวนลูปได้*/ 
      if(Otello[i][j] <= 1){  /*เงื่อนไขที่ว่า OX [i][j] มีค่าเท่ากับ 1 หรือไม่ ถ้าใช่จะสร้างวงกลมตามที่กำหนดด้วยฟังก์ชั่นวาดวงรี หรือ ellipse(x, y, width, height) พร้อมกำหนดใส่สีดำ หรือสีขาว*/ 
        fill(0);  //สีดำ
      } else {  /*ฟังก์ชั่นที่ใช้กำหนดอีกเงื่อนไขหนึ่ง*/
        fill(255);  //สีขาว
      }
      strokeWeight(2);  //ฟังก์ชั่นที่ใช้ในการกำหนดน้ำหนักของเส้นโดยใส่ตัวเลขลงไปในวงเล็บ
      ellipse(x, y, 40, 40);  //วาดวงกลมสองชั้นเพื่อทำเป็นเบี้ยในกระดานเล่นเกม
      ellipse(x, y, 20, 20);
      x = x+50;  //ค่า x จะมีค่าเพิ่มขึ้นทีละ 50 ในเงื่อนไขนี้ หากเป็นจริง
      j = j+1;  //ค่า j จะมีค่าเพิ่มขึ้นทีละ 1 ในเงื่อนไขนี้ หากเป็นจริง
    }
    j = 0;    //กำหนดให้ค่าของตัวแปรทั้งหมดนี้ใหม่ หลังจากที่ผ่านลูปชั้นก่อนนี้มา หากเป็นจริงจะสิ้นสุดการวนลูป หากไม่เป็นจริง จะยังคงทำการวนลูปซ้ำต่อไป
    x = 25;
    y = y+50;  //ค่า y จะมีค่าเพิ่มขึ้นทีละ 50 ในเงื่อนไขนี้ หากเป็นจริง
    i = i+1;  //ค่า i จะมีค่าเพิ่มขึ้นทีละ 1 ในเงื่อนไขนี้ หากเป็นจริง
  }
}

Canvas


วันอังคารที่ 27 สิงหาคม พ.ศ. 2556

Our Game & Watch



Turtle Bridge

            Turtle Bridge เป็นวิดีโอเกมยี่ห้อ Game & Watch แบบจอกว้างที่ถูกวางแผงในปี ค.ศ. 1982 โดยบริษัท Nintendo ในเกมนี้ ผู้เล่นต้องนำตัวละครจากอีกฝั่งหนึ่งของทะเลสาบข้ามไปยังอีกฝั่งหนึ่งโดยการกระโดดข้ามกระดองเต่าที่โผล่ขึ้นมาจากน้ำ ถ้าผู้เล่นกระโดดข้ามเต่าตัวหนึ่งผิดจังหวะ ผู้เล่นจะต้องกลับไปที่จุดเริ่มต้น ความจริงที่ว่า เต่าจะรับตัวละครข้ามไปให้ถึงอีกฝั่งหนึ่งของทะเลสาบนั้น คือที่ที่ชื่อของเกมเกิดขึ้น
            เนื้อหาภายในกล่องของเกมประกอบด้วยหน่วยยูนิตของ Game & Watch, แบตเตอรี่รุ่น LR43, กระดาษบอกคำเตือน, สติ๊กเกอร์แบตเตอรี่, และในฉบับพิมพ์ครั้งแรกนั้น ยังมีกระดาษบอกข้อผิดพลาดซึ่งเตือนผู้เล่นถึงข้อผิดพลาดในแผ่นพับคำแนะนำของเกมซึ่งภายหลังถูกแก้ในรูปแบบสำหรับอนาคต หมายเลขต้นแบบสำหรับเกมคือ TL-28 เกมถูกขายได้ประมาณ 500,000 ชุดทั่วโลก มันยังไม่เป็นที่รู้จักแน่ชัดว่า รูปแบบขนาดของเกมเคยถูกวางแผงหรือไม่ มีรูปแบบของ Bosch ของเกมประมาณ 200 ถึง 500 ชุดที่ถูกวางแผงผ่านการสนับสนุนเท่านั้น
            รูปแบบดั้งเดิมและตัวผู้เล่นที่ถูกพัฒนาขึ้นใหม่คล้ายกับมาริโอถูกปล่อยในวิดีโอเกมยี่ห้อ Game Boy Color หรือ Game & Watch Gallery 3 โดยสรุปแล้ว ผู้พัฒนา และผู้วางแผงคือ บริษัท Nintendo ถูกวางแผงในวันที่ 1 กุมภาพันธ์ ปี ค.ศ. 1982 ยี่ห้อ Game & Watch และเป็นประเภทปริศนา
            ในอันดับแรกของการสร้างเกม ต้องรวบรวม และสร้างฟังก์ชั่นต่างๆ ที่ใช้ในการสร้างพื้นหลังฉาก เป็นอย่างแรก โดยฟังก์ชั่นที่ใช้ในการสร้างพื้นหลังนี้ มีดังนี้ 
1. DrawSea() หรือฟังก์ชั่นสำหรับการสร้างทะเล 
2. DrawTwoShores() หรือฟังก์ชั่นสำหรับการสร้างฝั่งสองฝั่งในเกม 
3. DrawTurtles() หรือฟังก์ชั่นสำหรับการสร้างเต่า 
4. TurtlesOnMenu() หรือฟังก์ชั่นสำหรับสร้างเต่าบนหน้าจอเมนู และหน้า Game Over
5. TwoShoresOnMenu() หรือฟังก์ชั่นสร้างฝั่งสองฝั่งบนหน้าจอเมนู
ต่อมา เราต้องสร้างฟังก์ชั่นที่ใช้สำหรับการสร้างตัวคนแบกของ สำหรับในเกมนี้ เรากำหนดให้ผู้เล่นถือของจากอีกฝั่งหนึ่งไป โดยกล่องที่อยู่ด้านบนนั้นยังคงติดอยู่กับตัว ผู้เล่นจะต้องข้ามเต่าไปอย่างระมัดระวัง เวลาที่เต่าดำน้ำ ตัวเต่านั้นจะมีสีแดงทั้งตัว แต่เวลาขึ้น จะมีสีเขียวอ่อนแทน เวลาที่เต่ายังคงมีสีปกติ คือยังข้ามไปได้ เมื่อไปกลับได้ครบ 1 รอบ คะแนนจะเพิ่มขึ้นทีละ 10 คะแนน ผู้เล่นสามารถเล่นไปได้เรื่อยๆ ตราบเท่าที่ยังไม่ตายในเกม ฟังก์ชั่นที่ใช้สำหรับตัวผู้เล่นนั้น เช่น DrawPlayer() หรือฟังก์ชั่นสำหรับการสร้างตัวผู้เล่น, DrawBox() หรือฟังก์ชั่นสำหรับการสร้างกล่อง, DisplayButtons() หรือฟังก์ชั่นสำหรับการสร้างปุ่มกดในการเลือกการเคลื่อนไหวระหว่าง Smooth และ Step, IsDead() หรือฟังก์ชั่นที่กำหนดเงื่อนไขในกรณีที่แพ้, และ keyPressed() หรือฟังก์ชั่นสำหรับปุ่มกดในการเล่น

ในการเล่นเกมนั้น เวลาเปิดมาจะมีหน้าจอให้เลือกระหว่างปุ่ม Smooth และ Step สามารถเลือกเล่นจากแบบไหนก่อนก็ได้ โดยในการเล่นแบบ Smooth นั้น จะเป็นการเล่นแบบเร็ว แต่แบบ Step จะค่อยๆ ไปทีละช้าๆ ในการควบคุมตัวละครนั้น เราจะใช้ปุ่มลูกศรซ้าย และขวา ตามฟังก์ชั่นที่กำหนดไว้ เพียงสองปุ่มนี้เท่านั้น
ในฟังก์ชั่นทุกอันที่ใช้นั้น มีเพียง DrawTurtles();, IsDead();, และ KeyPressed(); เท่านั้นที่มีการกำหนดเงื่อนไขไว้ภายใน เพื่อให้เป็นการควบคุมการเคลื่อนไหวของเต่าแบบสุ่ม การหยุดเกมเวลาที่ผู้เล่นตาย และการควบคุมการเคลื่อนไหวของตัวละครโดยใช้ปุ่มลูกศรซ้ายและขวา ตามลำดับ การเคลื่อนไหวของเต่าจะเป็นไปตามพิกัดในแกน Y การหยุดเกมเวลาที่ผู้เล่นตายคือ กรณีที่ผู้เล่นก้าวพลาดตกลงไปในน้ำ โดยหน้าจอจะเปลี่ยนเป็นหน้าที่มีข้อความว่า “Game Over” ขึ้นมา ส่วนการนับคะแนน หรือ Highscore นั้นจะอยู่ในฟังก์ชั่น KeyPressed(); แต่ปรากฏเป็นข้อความ หรือแค่ตัวเลขบนจอ โดยทำงานในฟังก์ชั่น text(); ซึ่งระบุให้ทำงานใน void draw การนับคะแนนนี้ นอกจากมีในหน้าระหว่างการเล่นแล้ว ยังปรากฏเป็นข้อความบนหน้า Game Over ว่า Your Score : ………. ในตอนแรก ถ้ายังไม่มีการเล่น คะแนนของผู้เล่นนั้นจะยังคงอยู่ที่ 0 คะแนน นอกจากนี้ ฟังก์ชั่นที่สร้างขึ้นส่วนใหญ่ล้วนทำงานในฟังก์ชั่นหลักสำหรับการวาดนี้

ตัวอย่างของเกม