Upload
myles-pierce
View
217
Download
0
Embed Size (px)
DESCRIPTION
Bản chất của message (2/2) Cải tiến: Để đỡ mất thời gian, ngay khi Fifo nhận được message từ đầy đủ mọi người, sẽ public luôn chứ không cần chờ đến thời điểm TTP. A gửi message B gửi message Đến thời điểm public này A và B mới biết nội dung message của nhau
Citation preview
Triết líMulti-agent = Fifo chỉ là medium để thông qua đó container truyền message cho nhau, tập hợp các container tự phán xét kết quả theo kiểu bồi thẩm đoàn.
Fifo chỉ làm trọng tài một cách passive, nghĩa là khi có request từ container nào đó trong channel.
Để thực hiện vai trò trọng tài, Fifo cũng không tự quyết định, mà chọn đại vài container (trong channel khác, nhưng cùng game) để làm bồi thẩm đoàn. Quyết định theo nguyên tắc > 50% hoặc trung bình cộng.
Topics of research in MAS include:
1. beliefs, desires, and intentions (BDI), 2. cooperation and coordination, 3. organization, 4. communication, 5. negotiation, 6. distributed problem solving, 7. multi-agent learning. 8. scientific communities 9. dependability and fault-tolerance
Bản chất của message (1/2)
Truy về bản chất:
Q: Tại sao con gà băng qua đường? À quên, tại sao container gửi message đến Fifo?
A: Vì nó muốn tất cả các container khác nhận được message sau khoảng thời gian TTP (= time to public) nào đó.
Có 2 loại game: TTP = 0, > 0. Cho player thay đổi TTP trước khi game bắt đầu, nhưng giá trị default của TTP đã > 0 thì player chỉ có thể chọn giá trị > 0, đã > 0 thì > 0 suốt.
Lấy Glaborous làm ví dụ minh họa cho dễ hiểu:
A gửi
messa
ge
B gửi
messa
ge Đến thời điểm public này
A và B mới biết nội dung
message của nhau
Bản chất của message (2/2)
Cải tiến: Để đỡ mất thời gian, ngay khi Fifo nhận được message từ đầy đủ mọi người, sẽ public luôn chứ không cần chờ đến thời điểm TTP.
A gửi
messa
ge
B gửi
messa
ge
Đến thời điểm public
này
A và B mới biết nội
dung
message của nhau
Bản chất của timeout
Con người ta ai cũng đều bận rộn và sốt ruột => ai cũng muốn sau khi mình move, đối thủ làm ơn move nhanh nhanh giùm cái!
Nên cho player số 1 thay đổi được timeout T ngay khi trận đấu bắt đầu (mọi người có thể thương lượng thông qua chat).
Q: TTP và T khác nhau thế nào?A: TTP có thể = 0, còn T chắc chắn phải > 0. Khi TTP > 0, thì ý nghĩa của TTP và T như nhau => đặt TTP làm T.
Kết luận về TTP và T
Phân loại game theo TTP, lưu default value trên Fifo (<- tên game cũng lưu trên Fifo cho thống nhất, tránh trường hợp mỗi người đặt một kiểu)Trường hợp TTP = 0: Sau thời gian T mà không move thì sẽ bị xử thua, cho phép player 1 thay đổi giá trị của TTrường hợp TTP > 0: Lấy TTP làm T, xử lí gần giống như trênVì tồn tại latency, nên Fifo sẽ cộng thêm thời gian L vào TKhi hiển thị, thì về mặt usability, chỉ dùng thống nhất 1 từ quen thuộc là timeout.
Trạng thái game
Chỉ có 1 trong 5 trạng thái:OVER: Ván đấu kết thúc, đang tính kết quảNEWABLE: Ai click New game trước thì sẽ làm player 1NEW: Ai nhanh tay accept thì được vào chơiPLAY: Để tránh gian lận, số player đang chơi chỉ có giảm chứ không tăng, nghĩa là nếu player X đang chơi mà resign hoặc logout rồi login lại mà game vẫn chưa kết thúc, thì ngồi làm khán giả đi XDRAW: Na ná như NEW, cầu hòa
Biến
Lưu ở container:Trạng thái gameDanh sách tất cả playerDanh sách player đang chơi, có thứ tựDanh sách các move từ đầu game đến giờ
Lưu ở Fifo:
Tương tác container-Fifo
Container
Fifo
logout
disconnect
Enqueue
BroadcastonXxx
Sau khi enqueue cũng phải chờ đến khi onXxx thì mới được hành độngTrừ vài message đặc biệt, nói chung Fifo không quan tâm nội dung message là gìTrừ onDisconnect, onXxx là method trên container để Fifo gọiLogout: container cứ thế mà ngắt connection, không phải báo gì cả
onDisconnect Lấy thông tin gameLogin
Chat
NEW
PLAY
DRAW
OVER Tất cả container
Chuyển trạng thái
NEWNEWABLE
PLAYDRAW
Login
newInit
newJoin +Đủ playerplayOver
drawInit
drawAccept +Đủ player
drawRefuse
onLogout là event đặc biệt, có thể xảy ra ở tất cả trạng thái, container cần xử lí thích hợp tùy trạng thái và tùy player vừa logout có đang tham gia game hay không
newTimeoutnewLeave/logout + 0 player
Hình này vẽ state transition trên Fifo khi có tác động từ container. Trạng thái trên container luôn trễ 1 nhịp so với trên Fifo.
OVER
Tính xong kết quả
onLogout
Không có nút để logout, user chỉ cần refresh trang web, close cửa sổ... là xong=> Nên có nút (click cái là close connection) vì nhiều khi cùng cửa sổ embed vài game
onLogout(nick)
Lấy thông tin game và login
Container Fifo
getGameInfo
login
onGameInfo
onLoginMe
onLogin
getGameInfo, onGameInfo
getGameInfo:Vì chưa có kết nối, nên phải dùng connect(). Lấy thông tin game xong, connection bị ngắt ngay. Tạm thời chỉ trả về tên game, các thông tin khác (nổi tiếng được nhiều người chơi...) xem trên web.
URL:<FIFO_URL>/info
params cho connect():Version của containerID của gameVersion của gameLocale
onGameInfo:COULD_NOT_CONNECTWRONG_CLIENT_VERSION: Container cũ, nên refresh trang webWRONG_GAME_ID: Không tồn tại game với ID nàyWRONG_GAME_VERSION: Game cũ, nên refresh trang web[tên game theo locale (không có thì dùng mặc định là en-US)]
loginCần kiểm tra lại version, vì có thể đang login thì container được nâng cấp! Vì chưa có kết nối, nên phải dùng connect(). Connection bị ngắt ngay nếu thất bại, còn không thì được giữ suốt.
URL:<FIFO_URL>/<game ID><SEPARATOR><channel>
params cho connect():Version của container, gameNick, password (rỗng nếu là guest)
onLoginMe:COULD_NOT_CONNECTWRONG_CLIENT_VERSION: Container cũ, nên refreshWRONG_ID: Không tồn tại game với ID nàyWRONG_VERSION: Game cũ, nên refreshLOGIN_WRONG_CLIENT_VERSION: Những người đang trong channel dùng container cũLOGIN_WRONG_VERSION: Những người đang trong channel dùng game cũDUPLICATE_NICK: Trong channel đã có sẵn player trùng nickWRONG_NICK_OR_PASSWORD[trạng thái game, nP, TTP hoặc T, total, danh sách gốc player đăng kí chơi, danh sách move]
onLogin
onLogin(player vừa login)Nếu là guest thì nick sẽ bị gán thêm GUEST_SUFFIX là “ (guest)” để bà con biếtTạm thời chỉ có thông tin về nick, các thông tin khác (số lần thắng hòa thua... xem trên mạng <- players/<nick thay vì id>)
Chat
Container Fifo
chat
onChat
chat, onChat
chat(msg)
onChat([nick, msg])
Các hình ở dưới ứng với trạng thái ở trên container
Trạng thái OVERContainer Fifo
onResult
newInit
onNewInit
onResult: kết quả của trận đấu trước sau khi Fifo tính toán xongKhi chưa có kết quả, thì không được bắt đầu trận đấu mới, chờ đi em!OnLogout: không cần xử lí
Trạng thái NEW
Container Fifo
onNewJoin
newJoin
newLeave
onNewLeavenewTimeout
onNewTimeout
onLogout: khi xảy ra sẽ phát sinh onNewLeave
newInit, onNewInit
newInit(nPlayers, ttpOrT, total):Nếu đang ở state OVER thì dc phép
Fifo:Ghi lại thời điểm để xử lí khi có container gửi newTimeout để kiện
onNewInit(nick, nPlayers, ttpOrT, total):Ghi lại thời điểm để có thể kiện
Trạng thái PLAYContainer Fifo
playMove
onPlayMove
onPlayOver
Chỉ những player trong danh sách playNicks (không phải playNicks0) mới được gọi playMove và playOverNhững gì ảnh hưởng đến kết quả, đều phải ghi vào fifo để có thể playback y xì:Đang chơi thì leave/resignLogout: Fifo sẽ xử lí sao cho nhìn từ game, cứ tưởng chỉ là leave/resignplayOver được gửi đi nếu container thấy timeout hoặc game.onMove báo là game overKhi nhận được playOver, Fifo sẽ gửi onPlayOver và chuyển ngay sang OVER, kết quả trận đấu sẽ được thông báo sau, sau khi tính toán!
playOver
playMove(index, time, data)index: index của player trong nicks0time: thời điểm [s] tính từ lúc lần move trướcdata: nội dung nước đi
Khi gặp move không hợp lệ, sẽ báo game over ngay, lí do:
Chỉ có thể không hợp lệ do nhầm turn (tham số index), hoặc data không hợp lệ (tham số data)Data không thể nhầm, vì game phải biết luậtTurn cũng không thể nhầm, lí do:
Nếu là turn-based game, thì hiển nhiên thứ tự turn đã biết trước, không thể nhầm
Nếu là game kiểu TTP > 0, thì thứ tự turn không tính
Player nào chơi không hợp lệ tất nhiên sẽ bị xử thua
Timeout khi PLAYCó 2 kiểu:Timeout do quá thời gian cho 1 nước điTimeout do quá total time
Timeout do container và game hợp tác xử lí ngay ở từng move, Fifo không cần xử lí :)
Timeout != OVER, ví dụ có 5 player, nếu chỉ 1 player timeout thì game có thể vẫn không OVER=> cũng như playLeave, timeout cần được xử lí như move bình thường
----------------------------------------
Đối với game TTP > 0, để tránh Fifo phải dùng scheduler rất nặng, dùng giải pháp sau:Fifo: chỉ khi nhận được N move thì mới broadcastContainer: Hoặc nếu quá TTP mà không thấy move từ Fifo thì kiện, hoặc nếu sắp hết TTP thì gửi default move lên
judge(index, dt, nP, ttpOrT, total, moves)
Ban đầu, điểm được khởi tạo < 0
Qua mỗi move, điểm được update, nếu điểm >= 0 thì user này được coi là “chơi xong”
Khi judge, nếu điểm mọi người đều >= 0 thì trả luôn kết quả về
Nếu không, thằng reporter rất bậy, xử lí theo thuật toán sau:
1. Nếu game chỉ có 2 player, gán điểm của reporter = 0, player kia = 3
2. Nếu không, gán điểm của những người < 0 thành 1, reporter = 0
Chú ý: report có thể là thằng đã “chơi xong” (ngồi không quấy rối :P)
Trạng thái DRAW
Container Fifo
proposeDraw
onProposeDraw
acceptDraw
refuseDraw onAcceptDraw
onRefuseDraw
URL dùng khi kết nối
Vì ngay từ bản chất, RTMP cấu trúc theo /scope1/scope2/... nên để tránh tạo nhiều scope không cần thiết mà vẫn thỏa mãn nhu cầu, dùng mẹo sau:Chỉ dùng 1 cấp scope cho mỗi channelKhông dùng <FIFO_URL>/<game ID>/<channel>Dùng <FIFO_URL>/<game ID><SEPARATOR><channel>, vì game ID luôn là số, nên chỉ cần chọn separator không phải là số là xong
Delare game over – On game over
2 cái này không ứng với nhau
Khi 1 thằng declare game over thì game chắc chắn kết thúc, Fifo:Tạm ngưng không forward những message liên quan đến chơi gameChọn bồi thẩm đoàn, cho biết nội dung message của tất cả message từ khi new game đến thời điểm đó, rồi hỏi bồi thẩm đoàn nên phán xử ra saoDựa vào phán xử của bồi thẩm đoàn, ra quết địnhGhi quyết định về ván game vào DBGửi One game over đến tất cả container trong channel
AMF0
Hiện Red5 chưa hỗ trợ AMF3, cho nên
nc = new NetConnection();nc.objectEncoding = ObjectEncoding.AMF0;
SharedObject
Để set, phải dùng setProperty, gán hash không tác dụng:
so.setProperty("name", value);
Để get:
public function soSync(event:SyncEvent):void {var list:Array = event.changeList;for (var i:int = 0; i < list.length; i++) {
var info:Object = list[i];for (var key:Object in info) {
trace += ("i: " + i + ", " + key + ": " + info[key]); }
}}
Loader&loaded interaction (1/2)
public var varOne:String = "This is a public variable";
public function setVarOne(newText:String):void {varOne=newText;
}
You can use Application.application to get a reference to the host application. This is the top tier application so if you have nested a stack of SWF's this is the shortest way to get to the top.
parentapplication gets the immediate parent but you can also step up the hierarchy using that property.
Also check out applicationdomain and securitydomain / trustContent to ensure that your applications can talk to each other.
http://www.mail-archive.com/[email protected]/msg34758.html
Loader&loaded interaction (2/2)
<mx:SWFLoader id="myLoader" width="300" source="local.swf"complete="initNestedAppProps();"/>
private var loadedSM:SystemManager;
private function initNestedAppProps():void {loadedSM = SystemManager(myLoader.content);
}
private function test():void {lbl.text=loadedSM.application["lblOne"].text;loadedSM.application["lblOne"].text = "I was just updated";local(loadedSM.application).setVarOne("Updated varOne!");
}
http://livedocs.adobe.com/flex/2/docs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000543.html
htmlText
Dùng <br /> để xuống dòng rất chuối, dòng trắng từa lưa tùm lum tòe loe!=> Dùng <p>...</p>