在 JavaScript 中旋转矩形阵列
Rotating a rectangular array in JavaScript
我正在尝试制作俄罗斯方块游戏。我正在尝试将二维变量数组旋转 90 度(或 -90 度)的函数。
例如,给定一个数组:
"-T-",
"TTT"
它会输出:
"T-",
"TT",
"T-"
我试过这个功能:
function rotateN90(a){
var temp = [];
for(var x = 0; x<a[0].length; x++){
temp.push("");
for(var y = 0; y<a.length; y++){
temp[x] += a[y][x];
}
}
return temp;
}
但它没有给出预期的结果。虽然它确实将第一个 T 形块示例旋转了一次 -90 度,但之后它恢复到原始状态。
请帮忙!
(PS:我用的是KA的处理环境,所以不能用库或者ES6)
class Array2D extends Array {
constructor(width, height, array) {
super();
this.width = width;
this.height = height;
for(let i = 0; i < width*height; i++) {
this[i] = array ? array[i]:0;
}
}
set(x, y, value) {
this[x+y*this.width] = value;
}
get(x, y) {
return this[x+y*this.width];
}
static swap(array2d) {
const result = new Array2D(array2d.height, array2d.width);
for(let x = 0; x < array2d.width; x++) {
for(let y = 0; y < array2d.height; y++) {
result.set(y, x, array2d.get(x, y));
}
}
return result;
}
static flip(array2d) {
const result = new Array2D(array2d.width, array2d.height);
for(let x = 0; x < array2d.width; x++) {
for(let y = 0; y < array2d.height; y++) {
result.set(x, array2d.height-1-y, array2d.get(x, y));
}
}
return result;
}
static spin(array2d) {
const swapped = Array2D.swap(array2d);
return Array2D.flip(swapped);
}
}
const a2d = new Array2D(2, 2, [1, 1, 1, 0]);
console.log(Array2D.spin(Array2D.spin(a2d)));
这应该可以完成,只是稍微改变了格式。
因为可汗学院不允许使用 class 符号,所以这里是修改后的解决方案
//technically this one is a little unnessecary, but I like the organization
function create2D(width, height, array) {
var arr = [];
arr.width = width;
arr.height = height;
for(var i = 0; i < width*height; i++) {
arr[i] = array ? array[i]:0;
}
return arr;
}
function set(array, x, y, value) {
array[x+y*array.width] = value;
}
function get(array, x, y) {
return array[x+y*array.width];
}
function swap(array2d) {
var result = create2D(array2d.height, array2d.width);
for(var x = 0; x < array2d.width; x++) {
for(var y = 0; y < array2d.height; y++) {
set(result, y, x, get(array2d, x, y));
}
}
return result;
}
function flip(array2d) {
var result = create2D(array2d.width, array2d.height);
for(var x = 0; x < array2d.width; x++) {
for(var y = 0; y < array2d.height; y++) {
set(result, x, array2d.height-1-y, get(array2d, x, y));
}
}
return result;
}
function spin(array2d) {
return flip(swap(array2d));
}
var a1 = create2D(2, 2, [1, 1, 1, 0]);
var a2 = spin(spin(a1));
console.log(a2);
下面的代码是将一个mxn大小的数组旋转-90度。
function rotateN90(a){
var temp = new Array(a[0].length); // number of columns
var i=0;
for (i = 0; i < temp.length; i++) {
temp[i] = [];
}
for(i=0;i<a.length;i++){
for(let j = 0; j<a[0].length;j++){
temp[j][i]= a[i][a[i].length-1-j];
}
}
return temp;
}
如果您的数组是:
[[1, 2,3],[4, 5, 6]]
它会旋转-90度,返回的数组是
[[3, 6],[2, 5],[1, 4]]
这个答案适用于翻转 90 和翻转 -90
left
参数中的真实值会翻转它 -90
left
参数中的错误值会翻转它 +90
//1 to rotate left, 0 to rotate right
function rotate(arr,left){
var newArr=[]
arr.forEach(function(a){newArr.push(a.toString())})
arr=newArr //we gonna do some wild stuff so this is to not mess with the original array given to function
arr=arr.map(function(a){return a.split``})
var newArr=new Array(arr[0].length)
for(var i=0;i<newArr.length;i++){newArr[i]=[]}
arr.forEach(function(a,i){
a.forEach(function(b,j){
newArr[j][i]=b
})
})
if(left){
newArr=newArr.map(function(a){return a.join``})
return(newArr)
}
//else(right)
newArr.map(function(a){a.reverse()})
newArr=newArr.map(function(a){a.join``})
return(newArr)
}
//example 1 (-90 degrees)
console.log("example 1(-90 degrees)",rotate(["-T-","TTT"],1))
//same example but you can use truthy or falsy values not JUST 1 or 0
console.log("example 1(-90 degrees) with another truthy value",rotate(["-T-","TTT"],{a:true}))
//example 2(+90 degrees)
console.log("example 2(+90 degrees)",rotate(["-T-","TTT"],0))
我正在尝试制作俄罗斯方块游戏。我正在尝试将二维变量数组旋转 90 度(或 -90 度)的函数。
例如,给定一个数组:
"-T-",
"TTT"
它会输出:
"T-",
"TT",
"T-"
我试过这个功能:
function rotateN90(a){
var temp = [];
for(var x = 0; x<a[0].length; x++){
temp.push("");
for(var y = 0; y<a.length; y++){
temp[x] += a[y][x];
}
}
return temp;
}
但它没有给出预期的结果。虽然它确实将第一个 T 形块示例旋转了一次 -90 度,但之后它恢复到原始状态。
请帮忙!
(PS:我用的是KA的处理环境,所以不能用库或者ES6)
class Array2D extends Array {
constructor(width, height, array) {
super();
this.width = width;
this.height = height;
for(let i = 0; i < width*height; i++) {
this[i] = array ? array[i]:0;
}
}
set(x, y, value) {
this[x+y*this.width] = value;
}
get(x, y) {
return this[x+y*this.width];
}
static swap(array2d) {
const result = new Array2D(array2d.height, array2d.width);
for(let x = 0; x < array2d.width; x++) {
for(let y = 0; y < array2d.height; y++) {
result.set(y, x, array2d.get(x, y));
}
}
return result;
}
static flip(array2d) {
const result = new Array2D(array2d.width, array2d.height);
for(let x = 0; x < array2d.width; x++) {
for(let y = 0; y < array2d.height; y++) {
result.set(x, array2d.height-1-y, array2d.get(x, y));
}
}
return result;
}
static spin(array2d) {
const swapped = Array2D.swap(array2d);
return Array2D.flip(swapped);
}
}
const a2d = new Array2D(2, 2, [1, 1, 1, 0]);
console.log(Array2D.spin(Array2D.spin(a2d)));
这应该可以完成,只是稍微改变了格式。 因为可汗学院不允许使用 class 符号,所以这里是修改后的解决方案
//technically this one is a little unnessecary, but I like the organization
function create2D(width, height, array) {
var arr = [];
arr.width = width;
arr.height = height;
for(var i = 0; i < width*height; i++) {
arr[i] = array ? array[i]:0;
}
return arr;
}
function set(array, x, y, value) {
array[x+y*array.width] = value;
}
function get(array, x, y) {
return array[x+y*array.width];
}
function swap(array2d) {
var result = create2D(array2d.height, array2d.width);
for(var x = 0; x < array2d.width; x++) {
for(var y = 0; y < array2d.height; y++) {
set(result, y, x, get(array2d, x, y));
}
}
return result;
}
function flip(array2d) {
var result = create2D(array2d.width, array2d.height);
for(var x = 0; x < array2d.width; x++) {
for(var y = 0; y < array2d.height; y++) {
set(result, x, array2d.height-1-y, get(array2d, x, y));
}
}
return result;
}
function spin(array2d) {
return flip(swap(array2d));
}
var a1 = create2D(2, 2, [1, 1, 1, 0]);
var a2 = spin(spin(a1));
console.log(a2);
下面的代码是将一个mxn大小的数组旋转-90度。
function rotateN90(a){
var temp = new Array(a[0].length); // number of columns
var i=0;
for (i = 0; i < temp.length; i++) {
temp[i] = [];
}
for(i=0;i<a.length;i++){
for(let j = 0; j<a[0].length;j++){
temp[j][i]= a[i][a[i].length-1-j];
}
}
return temp;
}
如果您的数组是: [[1, 2,3],[4, 5, 6]]
它会旋转-90度,返回的数组是 [[3, 6],[2, 5],[1, 4]]
这个答案适用于翻转 90 和翻转 -90
left
参数中的真实值会翻转它 -90
left
参数中的错误值会翻转它 +90
//1 to rotate left, 0 to rotate right
function rotate(arr,left){
var newArr=[]
arr.forEach(function(a){newArr.push(a.toString())})
arr=newArr //we gonna do some wild stuff so this is to not mess with the original array given to function
arr=arr.map(function(a){return a.split``})
var newArr=new Array(arr[0].length)
for(var i=0;i<newArr.length;i++){newArr[i]=[]}
arr.forEach(function(a,i){
a.forEach(function(b,j){
newArr[j][i]=b
})
})
if(left){
newArr=newArr.map(function(a){return a.join``})
return(newArr)
}
//else(right)
newArr.map(function(a){a.reverse()})
newArr=newArr.map(function(a){a.join``})
return(newArr)
}
//example 1 (-90 degrees)
console.log("example 1(-90 degrees)",rotate(["-T-","TTT"],1))
//same example but you can use truthy or falsy values not JUST 1 or 0
console.log("example 1(-90 degrees) with another truthy value",rotate(["-T-","TTT"],{a:true}))
//example 2(+90 degrees)
console.log("example 2(+90 degrees)",rotate(["-T-","TTT"],0))