วิธีการหมุนบล็อกใน Tetris


16

ฉันมีตารางกระดานเกมที่มีความสูง 20 แถวและกว้าง 10 คอลัมน์โดยมีจุดกำเนิด (0,0) อยู่ที่มุมซ้ายบน ฉันมี tetrimino ในการเล่นซึ่งประกอบด้วยสี่ช่วงตึก ฉันมีตำแหน่ง x, y ของแต่ละบล็อกที่สัมพันธ์กับจุดกำเนิดมุมซ้ายบน ฉันยังมีตำแหน่งของเดือยจุดที่ฉันต้องการหมุนซึ่งสัมพันธ์กับต้นกำเนิดมุมซ้ายบน

แต่ละบล็อกมีตำแหน่งจำนวนเต็มในตารางเกมบอร์ดและดังนั้นเดือยมีตำแหน่งเป็นเศษส่วนในระหว่างบล็อกเช่น (10.5,10.5)

คำถามของฉันคือฉันสามารถใช้สูตรใดในการหมุนแต่ละบล็อกรอบเดือย

ฉันได้ดูคำถามและคำตอบที่คล้ายกันอยู่แล้ว แต่ไม่พบคำตอบที่ฉันสามารถทำงานได้

ความช่วยเหลือจะได้รับการชื่นชมมาก


เป็นของ dev เกม

และถ้ามันนี่ ... แสดงให้เราเห็นโครงสร้างข้อมูลบาง

หากคุณหมุนโดยใช้หลายมุมฉากนี่ก็น่าจะเป็นพื้นฐาน แค่วาดไดอะแกรมสองสามอันแล้วคุณควรจะหาวิธีแก้ปัญหาจำนวนเต็มได้
Kerrek SB

3
ฉันไม่อยากคำนวณการหมุนจริง ๆ เพียงแค่วางทั้งสี่เวอร์ชันที่หมุนได้ในอาร์เรย์
fredoverflow

1
ฉันจะแนะนำสิ่งที่ @FredOverflow ด้วย หากคุณดูที่คำถามของฉัน (ซึ่งคล้ายกับของคุณ) คุณจะเห็นว่าฉันเก็บบล็อกไว้เพียงส่วนเดียวเพื่อการใช้งานของฉันได้อย่างไร
bummzack

คำตอบ:


21

ตรรกะการหมุน Tetris มาตรฐานเรียกว่า Super Rotation System SRS เหมาะสำหรับการเล่นระดับสูงของเตตริสทำให้มีรูปแบบมากมายสำหรับการเตะบนกำแพงและการหมุนรอบตัว

tetrominoes ทั้งหมดมีอยู่ในสี่เหลี่ยมจัตุรัสและหมุนรอบจุดศูนย์กลางของจัตุรัสนี้ยกเว้นสิ่งกีดขวาง Tetrominoes ของความกว้าง 3 (J, L, S, T, Z) ถูกวางไว้ในสองแถวบนสุดของตารางที่มีขอบเขตและ (สำหรับ J, L และ T) โดยให้ด้านแบนราบลง ฉันอยู่ในแถวกลางด้านบน

tetrominoes ทั้งหมดวางไข่ใน 2 แถวมักจะซ่อนอยู่ที่ด้านบนของสนามแข่งขัน พวกมันถูกวางไว้ที่กึ่งกลางแถวเหล่านี้โดยปัดไปทางซ้าย มันจะไม่ล็อคจนกว่าการหน่วงเวลาการล็อคจะหมดอายุ พฤติกรรมการหน่วงเวลาการล็อคที่เรียกว่า Infinity โดย บริษัท Tetris จะรีเซ็ตการหน่วงเวลาการล็อคเมื่อใดก็ตามที่มีการย้ายหรือหมุนเทรโตมิโน โดยทั่วไปฮาร์ดไดรฟ์จะถูกแมปให้สูงขึ้นซึ่งไม่มีการหน่วงเวลาล็อค

Tetrominos ในกล่องหมุนรอบตัว

มีอีกตัวแปรทั่วไปเรียกว่า ARS ซึ่งถูกใช้ในอาริเป็นประมุข: Tetrisเกม


7

สูตรทั่วไปสำหรับการหมุนรอบจุดกำเนิดคือ

xNew = x * cos(a) - y * sin(a)
yNew = x * sin(a) + y * cos(a)

สำหรับ 90 องศามันจะกลายเป็น

xNew = -y
yNew = x

ดังนั้นก่อนอื่นรับพิกัดศูนย์กลางอิฐที่ค่อนข้างตรงกับจุดหมุน:

x = xBrickCenter - xPivot
y = yBrickCenter - yPivot

จากนั้นหมุนไปรอบ ๆ จุดหมุน:

x1 = -y = yPivot - yBrickCenter
y1 = x = xBrickCenter - xPivot

แล้วเพิ่มพิกัด pivot ไปยังจุดที่หมุน:

newXBrickCenter = xPivot + x1 = xPivot + yPivot - yBrickCenter
newYBrickCenter = yPivot + y1 = yPivot - xPivot + xBrickCenter

แต่ถ้าคุณต้องการหมุนด้วยทวีคูณ 90 องศาคุณสามารถเก็บตำแหน่งอิฐสี่ชุดสำหรับแต่ละทิศทางและสลับระหว่างพวกเขาแทนที่จะหมุนจริง


0

คุณสามารถหมุนวงแหวนสี่เหลี่ยมจัตุรัสทั้งหมด (a-through-h 2 ตำแหน่ง A-through-P 4 ตำแหน่งและอื่น ๆ ) รอบ ๆ บล็อก pivot นั้น:

ABCDE MNOPA
PabcF LghaB
Oh.dG -> Kf.bC
NgfeH JedcD
MLKJI IHGFE

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.