最近因為要寫象棋麻將 , 研究了象棋麻將的 AI
發現其實還滿簡單的
首先我們設定玩家有四個 , 自己跟三個電腦
那麼 糊牌 分為自摸,跟吃牌
所以 AI 的動作分為幾個
1.吃牌(上一個出牌的人,出的這張牌是否對我有利, 如果有利就吃)
2.抽牌(牌面上沒有牌了) -> 流局
3.抽牌 -> 糊牌 -> 自摸
4.丟牌
=============================================
所以按照上面的分析 , 初步 AI 的部份
在於按照正確的規則去玩遊戲
所以我又把糊牌的規則定義好去判斷牌是否符合我現在最有利的情況
去做丟,跟吃的部份
以規則模式去玩這樣就可以把 AI 寫出來
我的網誌清單
2013年6月30日 星期日
2013年6月27日 星期四
[Console] 象棋麻將 物件模型
因為我的一位很利害的朋友翔哥 , 寫了一個麻將 Console 版 的 Server/Client 的架構遊戲
促使我也想寫一個象棋麻將 Console 版的遊戲
但目前我還沒完成 Server/Client 的部份
我目前完成的Console架構是
1.配桌
2.玩家加入遊戲
3.桌群組管理觸發遊戲邏輯
4.發牌管理
===========================================
### 目前我的 流程有底下這幾種狀態
public enum GAME_STATUS
{
INITDATA = 1001, //初始化
PUTCHESS = 1002, //發牌機給牌
SHOWALLCAR = 1003, // 觸發所有玩家,秀出他們自己所有的牌
PLAYCHESS = 1004, // 觸發玩家開始玩牌(從有第五張牌的人開始玩
TURN = 1005, // 呼叫發牌員說換下一個人了喔
}
<加入玩家 如下 >
Table.AddPlayer(p1);
Table.AddPlayer(p2);
Table.AddPlayer(p3);
Table.AddPlayer(p4);
<開始玩牌如下>
Table.Play(); // 玩牌
Table.PutChess(); // 下一個玩家抽牌
====================================================
這個架構我目前還沒有很滿意,還會再換下一版本
但這個架構己經把玩家 跟 遊戲邏輯完全拆開了
互相不影響

促使我也想寫一個象棋麻將 Console 版的遊戲
但目前我還沒完成 Server/Client 的部份
我目前完成的Console架構是
1.配桌
2.玩家加入遊戲
3.桌群組管理觸發遊戲邏輯
4.發牌管理
===========================================
### 目前我的 流程有底下這幾種狀態
public enum GAME_STATUS
{
INITDATA = 1001, //初始化
PUTCHESS = 1002, //發牌機給牌
SHOWALLCAR = 1003, // 觸發所有玩家,秀出他們自己所有的牌
PLAYCHESS = 1004, // 觸發玩家開始玩牌(從有第五張牌的人開始玩
TURN = 1005, // 呼叫發牌員說換下一個人了喔
}
<加入玩家 如下 >
Table.AddPlayer(p1);
Table.AddPlayer(p2);
Table.AddPlayer(p3);
Table.AddPlayer(p4);
<開始玩牌如下>
Table.Play(); // 玩牌
Table.PutChess(); // 下一個玩家抽牌
====================================================
這個架構我目前還沒有很滿意,還會再換下一版本
但這個架構己經把玩家 跟 遊戲邏輯完全拆開了
互相不影響

2013年6月25日 星期二
最近翻了一下 Java Thread . 執行緒..
最近在看 Java Thread . 執行緒.. , 又在複習一下執行緒的資料
這本書的範例大部份都是以一個打字遊戲 來做範例
裡面有一個 Class 模型 讓我很感興趣 , 最近把他整理出來
如同上面這張圖他有四個 物件
/*
這個物件是被 被別的物件給觸發 ,並通知用
*/
CharacterListener
public void newCharacter(CharacterEvent ce);
/*
這個物件是事件觸發的 工具程式,用來幫助我們觸發事件
*/
CharacterEventHandler
addCharacterListener(CharacterListener cl)
removeCharacterListener(CharacterListener cl)
fireNewCharacter(CharacterSource source, int c)
CharacterSource
public void addCharacterListener(CharacterListener cl);
public void removeCharacterListener(CharacterListener cl);
public void nextCharacter();
/*
裡面包含了
CharacterSource
character
用來傳遞事件資訊用
*/
CharacterEven
public CharacterSource source;
public int character;
====================================================以上是事件的 Pattern
CharacterListener 用在顥示的物件上 來使自己被通知
CharacterSource 用來產生資料的物件上來通知 CharacterListener
當 CharacterListener 被通知時 newCharacter 會被啟動 並傳給 CharacterEvent
相關處理
然後就觸發一連串的事件
這本書的範例大部份都是以一個打字遊戲 來做範例
裡面有一個 Class 模型 讓我很感興趣 , 最近把他整理出來
如同上面這張圖他有四個 物件
/*
這個物件是被 被別的物件給觸發 ,並通知用
*/
CharacterListener
public void newCharacter(CharacterEvent ce);
/*
這個物件是事件觸發的 工具程式,用來幫助我們觸發事件
*/
CharacterEventHandler
addCharacterListener(CharacterListener cl)
removeCharacterListener(CharacterListener cl)
fireNewCharacter(CharacterSource source, int c)
CharacterSource
public void addCharacterListener(CharacterListener cl);
public void removeCharacterListener(CharacterListener cl);
public void nextCharacter();
/*
裡面包含了
CharacterSource
character
用來傳遞事件資訊用
*/
CharacterEven
public CharacterSource source;
public int character;
====================================================以上是事件的 Pattern
CharacterListener 用在顥示的物件上 來使自己被通知
CharacterSource 用來產生資料的物件上來通知 CharacterListener
當 CharacterListener 被通知時 newCharacter 會被啟動 並傳給 CharacterEvent
相關處理
然後就觸發一連串的事件
C# 文字轉Byte 方法
最近因為有用到要將文字將轉Byte 發現C# 有這麼方便的函式,特別記下來
byte[] byteArray = System.Text.Encoding.Default.GetBytes( str );
超級簡單
反過也是
string str = System.Text.Encoding.Default.GetString( byteArray );
System.Text.Encoding class
還有很多方法可以用..
byte[] byteArray = System.Text.Encoding.Default.GetBytes( str );
超級簡單
反過也是
string str = System.Text.Encoding.Default.GetString( byteArray );
System.Text.Encoding class
還有很多方法可以用..
2013年6月18日 星期二
SQL CASE WHEN 的另一種運用
有用我們想取某幾筆資料的某一個欄位值 , 可以這樣用
SELECT MAX (CASE WHEN 欄位 = 'Compiled' THEN Message_id ELSE 0 END)
, MAX(CASE WHEN 欄位 = 'Release' THEN Message_id ELSE 0 END)
, MAX(CASE WHEN 欄位 = 'Replace' THEN Message_id ELSE 0 END)
FROM 資料表
這裡的 MAX可以把不相關的資料略過集合起來
SELECT MAX (CASE WHEN 欄位 = 'Compiled' THEN Message_id ELSE 0 END)
, MAX(CASE WHEN 欄位 = 'Release' THEN Message_id ELSE 0 END)
, MAX(CASE WHEN 欄位 = 'Replace' THEN Message_id ELSE 0 END)
FROM 資料表
這裡的 MAX可以把不相關的資料略過集合起來
2013年6月16日 星期日
保留WEB 的狀態資料
常常我們在寫WEB 應用程式時 , 會遇到一個問題是
會把很多狀態保留並送到下一頁,或者送到AJAX
這時必需用JavaScript 寫一個小工具去做到這樣
怎麼做呢?
首先 先建一個物件
filter = new Object;
這時你可以對這個物件去做新增你要的資訊
filter.Act = "Add";
filter.ProductNo = "A001";
然後送出時再寫一個把這些資訊集合起來的函數
function GetState()
{
var args = '';
for (var i in this.filter)
{
if (typeof(this.filter[i]) != "function" && typeof(this.filter[i]) != "undefined")
{
args += "&" + i + "=" + encodeURIComponent(this.filter[i]);
}
}
return args ;
}
會把很多狀態保留並送到下一頁,或者送到AJAX
這時必需用JavaScript 寫一個小工具去做到這樣
怎麼做呢?
首先 先建一個物件
filter = new Object;
這時你可以對這個物件去做新增你要的資訊
filter.Act = "Add";
filter.ProductNo = "A001";
然後送出時再寫一個把這些資訊集合起來的函數
function GetState()
{
var args = '';
for (var i in this.filter)
{
if (typeof(this.filter[i]) != "function" && typeof(this.filter[i]) != "undefined")
{
args += "&" + i + "=" + encodeURIComponent(this.filter[i]);
}
}
return args ;
}
SQL SERVER 如何區分大小寫?
常常我們在使用 SQL 語法下 SELECT 時 比如要找一筆 名稱叫 sa01 時
這時 SA01 ,sA01,Sa01 都會出現 雖然很方便,但如果我們想要找大小寫符合時
在 SQL 語法裡 要怎麼下呢? , SQL SERVER 有一個叫定序的功能 可以做到這樣
Collate Chinese_Taiwan_Stroke_CS_AS 在語法後面加入這個就可以指定大小寫
使用方法如下
SELECT TOP 1000 [sno]
,[cno]
,[score]
FROM [TEST].[dbo].[sc]
where sno ='S001' Collate Chinese_Taiwan_Stroke_CS_AS
這時 SA01 ,sA01,Sa01 都會出現 雖然很方便,但如果我們想要找大小寫符合時
在 SQL 語法裡 要怎麼下呢? , SQL SERVER 有一個叫定序的功能 可以做到這樣
Collate Chinese_Taiwan_Stroke_CS_AS 在語法後面加入這個就可以指定大小寫
使用方法如下
SELECT TOP 1000 [sno]
,[cno]
,[score]
FROM [TEST].[dbo].[sc]
where sno ='S001' Collate Chinese_Taiwan_Stroke_CS_AS
2013年6月15日 星期六
2013年6月14日 星期五
WebSocket 底層連線
WebSocket 連線其實和一般的Socket 連線一樣,只是他多了驗證的機制
當 WebSocket 連線到 Server 時 , 他會送一段內容過來
這段內容大約長這樣
當 WebSocket 連線到 Server 時 , 他會送一段內容過來
這段內容大約長這樣
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbX9B653asxSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
首先他有些有分版本 像這裡 他是 Sec-WebSocket-Version: 13 版本
要注意的是 Sec-WebSocket-Key 你必需拿來做 "握手機制"
所以 dGhlIHNhbX9B653asxSBub25jZQ== 這一串碼你必需拿來
跟 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 這串 GUID 組起來 , 然後做sha hash
然後再 加密為 base64
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept:加密碼
Sec-WebSocket-Protocol: chat
再按照上面的方式送出去給客戶端即成功握手
之後就可以跟正常的socket 做溝通,不過 接 , 送 封包 websocket 也有一套規則
要按照他的規則去做才可以
2013年6月13日 星期四
JavaScript 直接點擊,直接編輯
很多時後我們做WEB 資訊系統時,編輯一筆資料常常需要按一下編輯然後換到下一頁
有時不想這麼做時,想直接編輯可不可以呢,答案是可以的 , 我做了一個範例
先在畫面上做一個顥示
<span onclick="edit(this, 'save', '101')">進貨單號100</span>
JavaScript 的部份是 ,先取得原先在此標籤上的文字,然後再建一個方塊
代入文字資料 , 然後再建一個方塊, Append 進來
<script>
function edit(obj, act, id)
{
var org = obj.innerHTML;
var txt = document.createElement("INPUT");
txt.value = org;
txt.style.width = (obj.offsetWidth + 12) + "px" ;
obj.innerHTML = "";
obj.appendChild(txt);
txt.focus();
}
</script>
有時不想這麼做時,想直接編輯可不可以呢,答案是可以的 , 我做了一個範例
先在畫面上做一個顥示
<span onclick="edit(this, 'save', '101')">進貨單號100</span>
JavaScript 的部份是 ,先取得原先在此標籤上的文字,然後再建一個方塊
代入文字資料 , 然後再建一個方塊, Append 進來
<script>
function edit(obj, act, id)
{
var org = obj.innerHTML;
var txt = document.createElement("INPUT");
txt.value = org;
txt.style.width = (obj.offsetWidth + 12) + "px" ;
obj.innerHTML = "";
obj.appendChild(txt);
txt.focus();
}
</script>
2013年6月11日 星期二
2D 加速判斷物件位置
之前一直在思考 2D 空間 判斷的準則 , 如何加速判斷
然後在網路上看到一個文章 , 是說可以把空間切個更細去判斷
然後我就實做了一套 , 確實他可以加速許多
他的做法是在一個畫面上, 把空間切個更細
然後只要去判斷那個空間裡面的物即可
程式寫法還滿簡單的,切開畫面物件,然後個別管理及加入判斷
然後在網路上看到一個文章 , 是說可以把空間切個更細去判斷
然後我就實做了一套 , 確實他可以加速許多
他的做法是在一個畫面上, 把空間切個更細
然後只要去判斷那個空間裡面的物即可
程式寫法還滿簡單的,切開畫面物件,然後個別管理及加入判斷
訂閱:
意見 (Atom)



