ใช้รายการชื่อ "เส้นทาง" เพื่อจัดเก็บจุดทางที่อธิบายเส้นทางของคุณและรายการที่เชื่อมโยงสองเท่าเรียกว่า "งู" เพื่อเก็บวัตถุที่เคลื่อนไหวและเส้นทาง
วัตถุชั้นนำจะกำหนดจุดทางใหม่ในขณะที่เดินทาง วัตถุต่อไปนี้เคลื่อนที่ไปตามเส้นทางที่กำหนดโดยจุดทางเหล่านี้
แต่ละวัตถุมีเขตความปลอดภัยที่กำหนดโดยระยะทาง หากวัตถุชั้นนำหยุดทำงานวัตถุต่อไปนี้จะเคลื่อนที่ต่อไปจนกว่าพวกเขาจะสัมผัสโซนความปลอดภัยของรุ่นก่อน
ต่อไปนี้เป็นโค้ดหลอกสำหรับวิธีนำสิ่งเหล่านี้ไปปฏิบัติ โปรดทราบว่านี่อาจไม่ใช่โซลูชันที่หรูหราที่สุดในแง่ของการกระจายความรับผิดชอบและการห่อหุ้ม
class Position {
property x;
property y;
}
class WayPoint extends ListNode {
property position;
}
class Path extends List {
property WayPoints = array();
// Find out the x, y coordinates given the distance traveled on the path
function getPositionFromDistanceFromEnd(distance) {
currentWayPoint = this->first();
while(distance > 0) {
distanceBetweenWayPoints = this->getDistance(currentWayPoint, currentWayPoint->next());
if(distanceBetweenWayPoints > distance) {
position = ... // travel remaining distance between currentWayPoint and currentWayPoint->next();
return position;
} else {
distance -= distanceBetweenWayPoints;
currentWayPoint = currentWayPoint->next();
}
}
}
function addWayPoint(position) {
// Vector describing the current and new direction of movement
currentDirection = this->first() - this->second();
newDirection = position - this->first();
// If the direction has not changed, there is no need to add a new WayPoint
if( this->sameDirection(currentDirection, newDirection) {
this->first->setPosition(position);
} else {
this->add(position);
}
}
}
class Snake extends DoublyLinkedList {
property Path;
property MovingObjects = array();
}
abstract class MovingObject extends DoublyLinkedListNode {
property Snake; // shared among all moving objects of the same snake
property position;
const securityDistance = 10;
abstract function move() { }
}
class MovingObjectLeader extends MovingObject {
property direction;
function move() {
this->position += this->direction * this->Snake->speed;
this->Snake->Path->addWayPoint(this->position);
if(this->hasFollower()) {
this->follower->move();
}
}
}
class MovingObjectFollower extends MovingObject {
property distanceFromEnd;
function move() {
this->distanceFromEnd += this->Snake->speed;
// If too close to leader: stop in order to respect security distance
if(this->distanceFromEnd > this->leader()->distanceFromEnd - this->securityDistance) {
this->distanceFromEnd = this->leader()->distanceFromEnd - this->securityDistance;
}
this->position = this->Snake->getPositionFromDistanceFromEnd(this->distanceFromEnd);
if(this->hasFollower()) {
this->follower->move();
}
}
}
Path-> WayPoints ยิ่งใหญ่ขึ้นเรื่อย ๆ เกมก็จะยิ่งยาวขึ้น หาก Snake ของคุณมีอยู่พักหนึ่งคุณต้องลบ WayPoint สุดท้ายเมื่อใดก็ตามที่องค์ประกอบสุดท้ายของ Snake ผ่าน Waypoint of Path of the Second-to-Last จำไว้ว่าให้ลดระยะห่างจากทุกการเคลื่อนย้ายวัตถุของงูตามลำดับ