Lập trình AI 2048 bằng cách sử dụng Khung hiện có


17

EDIT: Gần đây, câu hỏi của tôi đã được đề xuất như là một bản sao của 2048 Bot Challenge . Tôi muốn nhấn mạnh rằng câu hỏi này khác với câu hỏi đó và sẽ yêu cầu các câu trả lời phải được suy nghĩ khác với câu hỏi đó. 2048 Bot Challenge đã yêu cầu người dùng tạo một bot và nó sẽ được chạy trong một giờ, với điểm số cao nhất là điểm số của người dùng. Ngoài ra, nó có giới hạn là 555 byte. Thử thách của tôi chạy mã ít thường xuyên hơn, chỉ 3 lần. Điểm của bạn được tính bằng cách sử dụng điểm trung bình của ba lần đó và chia cho chiều dài ký tự của mã golf của bạn. Câu hỏi của tôi khuyến khích các mục trở nên "thông minh hơn", và không cố gắng và đạt điểm cao nhất bằng vũ lực.

-

EDIT: Phương thức get đã được thay đổi thành getTile, để tránh xung đột với từ khóa JS get. Ngoài ra, một phần điểm cao đã được thêm vào.

Gần đây, tôi đã tạo một trang web cho phép trò chơi phổ biến 2048 được kiểm soát bằng JavaScript. Trang web của tôi được liên kết ở đây:

http://thatcoolidea.com / 2048

Làm sao:

Một biên tập viên Ace được đặt ở trên bảng. Bạn đặt mã trong đó, mã này được chạy một lần cứ sau 250 ms, hoặc 4 lần mỗi giây. Đây được gọi là một chu kỳ.

Sử dụng các phương pháp sau để kiểm soát bảng. Bạn không thể sử dụng các phím mũi tên.

up();            //move up
down();          //move down
left();          //move left
right();         //move right

move(integer);   //integer is a direction. 0:up,1:right,2:down,3:left

getTile(y,x);        //gets the value of the tile in position y,x on the board. See diagram

Bản đồ của bảng cho phương pháp get.

Các biến sau đây được xác định để thuận tiện cho bạn:

eother        //boolean, alternates every cycle
frozen        //integer, counts how many cycles the board has remained stationary
lastDir       //integer, indicates the last direction that was tried to move in
              //uses same format as the move method above.
startup       //boolean, will always be true when the game first starts
              //you can change it as you wish
a
b             //a b and c are all persistant variables, they do not change each cycle
c             //any other variables defined in the cycle will be reset every time

Quy tắc:

  • Không ngẫu nhiên, bạn phải sử dụng logic. (Vâng, tôi biết mã ví dụ sử dụng ngẫu nhiên.)
  • Không móc vào các chức năng trò chơi hoặc gian lận theo những cách khác
  • Nói chung, cố gắng chỉ gọi một phương thức di chuyển trong mỗi chu kỳ. Không sao nếu bạn sử dụng nhiều hơn, nhưng nó vặn với hình ảnh động
  • Hội đồng quản trị phải bắt đầu trong trạng thái ngẫu nhiên, không sửa đổi trạng thái trước trò chơi
  • Bạn phải cung cấp cả phiên bản mã không nén và đánh gôn trong bài viết của mình.
  • Bạn phải cung cấp một liên kết đến trang web đã tải phiên bản mã không nén của mã của bạn, được phân phối qua PasteBin (Ví dụ: ... thatcoolidea.com/2048?i=pH18GWtu tải mã ví dụ.)

Ghi điểm:

  • Mã của bạn sẽ được ghi điểm bởi tôi.
  • Phần A trong số điểm của bạn là trung bình 3 lần chạy mã, làm tròn xuống.
  • Phần B của điểm số của bạn là độ dài ký tự của mã golf của bạn.
  • Điểm cuối cùng của bạn là Phần A chia cho Phần B

Người chiến thắng sẽ có mã của họ bất tử làm mã ví dụ trên trang web, nếu họ chọn và thừa nhận trong một nhận xét trong mã.

Chúc may mắn! Hy vọng bạn thích thử thách.

Điểm cao hiện tại 225,22 - Tủ đông - người dùng3217109


10
Thực tế là bạn đã viết một khung cho năm 2048 khá tuyệt vời và rất thuận tiện cho loại thử thách này, nhưng tôi không thấy nó thực sự ảnh hưởng đến bất kỳ chiến lược nào đã được tìm thấy trong thử thách AI 2048 hiện tại của chúng tôi.
Martin Ender

3
Vâng, tôi sẽ nói rằng của tôi là khác nhau, đơn giản là vì bạn được yêu cầu sử dụng một cơ sở mã sẽ giống nhau cho mỗi lần thực hiện. Điều này thân thiện với người dùng hơn nhiều và tôi không nghĩ nó sẽ tạo thành một bản sao.
Sam Weaver

2
Các câu hỏi khác trông khá chết. Chỉ có bốn câu trả lời và giới hạn thời gian là một giờ, vì vậy tôi sẽ trả lời vì điều này trông thực sự tuyệt vời.
krs013

@samweaver thêm một ghi chú vào đầu câu hỏi của bạn để giải thích lý do tại sao câu trả lời từ câu hỏi khác sẽ không hợp lệ / cạnh tranh cho câu hỏi của bạn, sau đó tạo một bài đăng meta để xem xét kỹ lưỡng.
rdans

Nếu bạn không thể làm điều đó, bạn có thể sẽ cần phải thay đổi thử thách của mình để mở lại, ví dụ: quy tắc / tính điểm / hạn chế
2014 lúc 21 giờ 13 phút

Câu trả lời:


6

Chìm / Shaker, 65 byte

Đây là của tôi . Nó mù quáng và đơn giản như họ đến.

if(startup){startup=false;a=0}b=(a++)%4;move(frozen>2?0:b==0?2:b)

Không nén (ish) ...

if(startup){startup=false;a=0;}
b=(a++)%4;
move(frozen>2?0:b==0?2:b)

Tất cả những gì nó làm là lặp đi lặp lại, phải, xuống, trái, v.v. và đánh lên một lần nếu nó bị kẹt. Nó không phải lúc nào cũng làm rất tốt, nhưng đôi khi nó sẽ nhận được 512 giây. Điểm cao của tôi trong quá trình kiểm tra là 7520.


Tôi đang bắt đầu quá trình ghi bàn ngay bây giờ! Cảm ơn cho mục đầu tiên!
Sam Weaver

Điểm cuối cùng: 67,6! Chạy 1: 3980 Chạy 2: 4080 Chạy 3: 5128 Tôi thực sự thích điều này, tôi không hình dung bạn có thể đạt được số điểm cao như vậy với một bot nhỏ như vậy.
Sam Weaver

Cảm ơn đã thiết lập nó! Tôi nghĩ nó khá tuyệt Thật buồn khi mọi người đã phản ứng theo cách này cho đến nay. Người dùng SO có xu hướng rất tiêu cực đối với các câu hỏi trùng lặp, thường là vì lý do tốt.
krs013

Tại sao cảm ơn bạn! Tôi đánh giá cao sự hỗ trợ! Dự án này bắt nguồn từ khi một người bạn và tôi thức khuya làm việc một đêm và muốn xem ai có thể tạo ra bot tốt hơn. Tôi đã tìm kiếm thông qua mã, nhưng tôi không thể tìm ra cách nào để làm tốt nó. Tôi đã xây dựng điều này với các phương thức trợ giúp để làm cho nó dễ dàng hơn nhiều!
Sam Weaver

3

Đèn giao thông - 23 21 byte

move(frozen&2|eother)

Đây là liên kết.

Điều này sẽ di chuyển xen kẽ lên và phải, ngoại trừ khi bảng vẫn đứng yên cho hai lần di chuyển cuối cùng, trong trường hợp đó nó sẽ di chuyển xuống và trái tương ứng.

Bản gốc, chức năng tương đương chức năng của tôi dài 23 byte và đạt 182,72:

move((frozen&2)+eother)

Điều này khá giống với những gì tôi làm khi tôi chơi nhanh mà không thực sự nhìn vào bảng.
tôi và con mèo của tôi

Công việc tuyệt vời Chạy 1: 2208 Chạy 2: 1216 Chạy 3: 2336 23 byte Điểm cuối cùng: 182,72
Sam Weaver

2

Vòng xoáy - 37 21 17 byte - Điểm: 211,22

Tôi quyết định đi theo cách tiếp cận "ít hơn là nhiều hơn". Mã của tôi là một thiết kế đơn giản cố gắng đi lên, phải, xuống, trái ... Tôi sẽ làm việc trên một AI học tập để thấy một cách tối ưu hơn để tiếp cận câu đố.

a=a|0;move(a++%4)

Trình tối ưu hóa đã giúp rút ngắn quá trình akhởi tạo.

Sam đã giúp rút ngắn việc akhởi tạo, loại bỏ var.

Ung dung?

var a=a|0;
a++;
move(a%4);

Điểm số cao nhất của tôi với AI này là 5120.

Tủ đông - 12 byte - Điểm: 225,22

Bot này đã ưu tiên di chuyển. Nó cố gắng đi lên. Nếu nó có thể 'đi lên, nó đi đúng. Nếu nó không thể đi đúng, nó sẽ xuống. Nếu nó không thể đi xuống, nó đi bên trái.

move(frozen)

Giải thích về James Bond

Mã được mã hóa giải mã để nói:

HTMLActuator.prototype.updateScore=function (score) {score*=9989800000;
  this.clearContainer(this.scoreContainer);

  var difference = score - this.score;
  this.score = score;

  this.scoreContainer.textContent = this.score;

  if (difference > 0) {
    var addition = document.createElement("div");
    addition.classList.add("score-addition");
    addition.textContent = "+" + difference;

    this.scoreContainer.appendChild(addition);
  }
}

Trình tối ưu hóa nên đánh golf mã giải mã của mình. Điều này có thể đã được #Optimized.


Bạn phải thực sự xác định aquá. Vì vậy, nên được thêm vào trong chiều dài mã.
Tối ưu hóa

Thật không may, phần phụ trợ bảo tồn các biến thông qua các bộ đặt lại, vì vậy bạn có thể xác định / khởi tạo amột lần và quên nó đi, nhưng nếu bạn đóng tab / cửa sổ và quay lại nó, tôi không nghĩ nó sẽ hoạt động nữa. Đây là lý do tại sao tôi phải thêm bit if (khởi động) vào của tôi.
krs013

1
bạn có thể sử dụng var a=a|0;move(a++%4)- 21 byte
Trình tối ưu hóa

Cảm ơn bạn! Tôi chưa bao giờ sử dụng javascript trước đây, vì vậy tôi sẽ phạm sai lầm như vậy ...
Zylviij

Thật ra, A không cần xác định. A được định nghĩa trong phần phụ trợ, vì vậy bạn có thể tham chiếu nó bằng cách sử dụng amà không cần thực hiệnvar a
Sam Weaver

1

Móc áo - 20 byte

Điểm chính thức: 224,87 - Vị trí thứ 2 bằng 0,35 điểm

Bot này sử dụng cách tiếp cận xuống, trái, xuống, phải, nhưng với tính năng bất thường là nó sẽ không bao giờ di chuyển lên. Tôi không chắc làm thế nào để chấm điểm các trường hợp nó bị treo và không hoàn thành, hoặc liệu thực tế điều đó xảy ra có làm cho nó bất hợp pháp hay không. Đây là, mặc dù:

b=b|0;move(b++%4||2)
OR
move(startup++%4||2)

Mẫu khởi tạo nhờ @Optimizer.

Trong 3 lần chạy thử nghiệm của tôi, nó đạt được điểm số 4304, 6352 và 4232, trung bình là 4956. Tôi sẽ cập nhật khi chạy thử nghiệm chính thức.


Phiên bản thay thế bị treo (27 byte):

b=b|0;move(b++%4||b%997&&2)

Không cần phải rời khỏi một hang, điểm số sẽ chỉ được đo ở đó như thể trò chơi đã kết thúc.
Sam Weaver

Làm thế nào để người cuối cùng thoát khỏi hangs?
krs013

@ krs013 Người cuối cùng sẽ di chuyển lên một lần sau mỗi chu kỳ 4 * 997, vì vậy nếu lên là cách duy nhất để di chuyển, nó sẽ di chuyển lên.
isaacg

Gotcha. Tôi tự hỏi nếu nó là một cái gì đó như thế; Tôi đoán là tôi đã không đợi đủ lâu.
krs013

Điểm cuối cùng: 224,87, công việc tuyệt vời!
Sam Weaver
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.