我知道這款遊戲已經出一陣子了
前天看有人叫 chatGPT 修正文心一言寫壞的 2048,今天就突然想自己寫一個了
F12 貼上程式碼然後輸入程式碼操作
Game 物件下:
reset 開啟新的遊戲,也可以輸入字串做種子碼使用
up down lert right 控制移動方向,沒辦法移動時他會告訴你
save 和 load 可以儲存和載入進度(但不會儲存在 localStorage)
const Game = {}
const MoveFunc = [
(l,i)=>l+i*4,//U
(l,i)=>l*4+i,//L
(l,i)=>l+(3-i)*4,//D
(l,i)=>l*4+(3-i)//R
]
MoveFunc.up = MoveFunc[0];
MoveFunc.down = MoveFunc[2];
MoveFunc.left = MoveFunc[1];
MoveFunc.right = MoveFunc[3];
function random() {
with(Game){
a |= 0; b |= 0; c |= 0; d |= 0;
var t = a - (b << 27 | b >>> 5) | 0;
a = b ^ (c << 17 | c >>> 15);
b = c + d | 0;
c = d + t | 0;
d = a + t | 0;
return (d >>> 0) / 4294967296;
}
}
function cyrb128(str) {
let h1 = 1779033703, h2 = 3144134277,
h3 = 1013904242, h4 = 2773480762;
for (let i = 0, k; i < str.length; i++) {
k = str.charCodeAt(i);
h1 = h2 ^ Math.imul(h1 ^ k, 597399067);
h2 = h3 ^ Math.imul(h2 ^ k, 2869860233);
h3 = h4 ^ Math.imul(h3 ^ k, 951274213);
h4 = h1 ^ Math.imul(h4 ^ k, 2716044179);
}
h1 = Math.imul(h3 ^ (h1 >>> 18), 597399067);
h2 = Math.imul(h4 ^ (h2 >>> 22), 2869860233);
h3 = Math.imul(h1 ^ (h3 >>> 17), 951274213);
h4 = Math.imul(h2 ^ (h4 >>> 19), 2716044179);
return [(h1^h2^h3^h4)>>>0, (h2^h1)>>>0, (h3^h1)>>>0, (h4^h1)>>>0];
}
function fillChar(c,l){
c = String(c);
return c+' '.repeat(Math.max(l-c.length,0));
}
function consoleWrite(message=''){
var s = '';
for(var i=0; i<16; i+=4){
s += Game.x.slice(i,i+4)
.map( x=> x?x:'' )
.map( x=>fillChar(x,5) )
.join(',') + '\n'
}
console.log( s + 'step: ' + Game.s + '\n' + message )
}
function move(posFunc, simulate=false ){
if(Game.g) return false;
var available = false;
for(var line = 0; line<4; line++ ){
var map = [];
var data = [];
var dataI = 0;
for(var i = 0; i<4; i++ ){
var p=posFunc(line,i);
map.push(p);
var v = Game.x[p];
if(v){
if(data[dataI] == v){
data[dataI] += v;
} else {
data.push(v);
dataI = data.length -1;
}
}
}
available ||= data.length < 4 && map.some((s,i)=>Game.x[s]!==data[i]?data[i]:null);
if(simulate) continue;
for(var i = 0; i<4; i++ ){
Game.x[map[i]] = data[i]?data[i]:null;
}
}
return available;
}
function check(){
var emptyCount = 0;
Game.x.forEach( w=>{ if(!w) emptyCount++ } )
if(!emptyCount) return null;
return emptyCount;
}
function insert(){
var emptyCount = check();
if(!emptyCount) return null;
var emptyIndex = Game.x.map((_,i)=>i).filter(i=>!Game.x[i])
var insertIndex = Math.floor( emptyCount * random() );
Game.x[emptyIndex[insertIndex]] = 2;
return insertIndex;
}
Game.up = function(){
var message;
if( move( MoveFunc.up ) ){
insert();
Game.s++;
if(!check()&&!MoveFunc.some( f=>move(f,true) )){
Game.g = true;
message = 'Game Over';
}
}else{
if(Game.g) message = 'Game Over';
else message = 'Can\'t move';
}
consoleWrite(message);
}
Game.down = function(){
var message;
if( move( MoveFunc.down ) ){
insert();
Game.s++;
if(!check()&&!MoveFunc.some( f=>move(f,true) )){
Game.g = true;
message = 'Game Over';
}
}else{
if(Game.g) message = 'Game Over';
else message = 'Can\'t move';
}
consoleWrite(message);
}
Game.left = function(){
var message;
if( move( MoveFunc.left ) ){
insert();
Game.s++;
if(!check()&&!MoveFunc.some( f=>move(f,true) )){
Game.g = true;
message = 'Game Over';
}
}else{
if(Game.g) message = 'Game Over';
else message = 'Can\'t move';
}
consoleWrite(message);
}
Game.right = function(){
var message;
if( move( MoveFunc.right ) ){
insert();
Game.s++;
if(!check()&&!MoveFunc.some( f=>move(f,true) )){
Game.g = true;
message = 'Game Over';
}
}else{
if(Game.g) message = 'Game Over';
else message = 'Can\'t move';
}
consoleWrite(message);
}
Game.reset = function(seed){
if(seed===''||!seed) seed = Math.random();
var ss = cyrb128(String(seed));
Game.a = ss[0];
Game.b = ss[1];
Game.c = ss[2];
Game.d = ss[3];
Game.s = 0; //step
Game.x = [
null,null,null,null,
null,null,null,null,
null,null,null,null,
null,null,null,null
]
insert();
insert();
consoleWrite('New Game');
}
Game.save = function(){
consoleWrite('Game saved');
Game.S = [Game.s,...Game.x,Game.a,Game.b,Game.c,Game.b,Game.g];
return Game.S;
}
Game.load = function(data){
if(!data) data = Game.S;
if(!data) return;
Game.a = data[17];
Game.b = data[18];
Game.c = data[19];
Game.d = data[20];
Game.g = false; //Game Over
Game.s = data[0]; //step
Game.x = [
data[1],data[2],data[3],data[4],
data[5],data[6],data[7],data[8],
data[9],data[10],data[11],data[12],
data[13],data[14],data[15],data[16]
]
if(Game.g) consoleWrite('Game Over');
else consoleWrite('Game loaded');
}