摘要: Phing是什么?Phing是一個(gè)基于Apache Ant的項(xiàng)目代碼構(gòu)建系統(tǒng).你可以用她做傳統(tǒng)的構(gòu)建系統(tǒng)能做的任何事情,比如GNU make,并且Phing使用簡(jiǎn)單的XML構(gòu)建文件和可擴(kuò)展的”任務(wù)”使之成為易于使用和極具可擴(kuò)展性的框架.因?yàn)镻hing是基于Ant的,所以本手冊(cè)部分內(nèi)容是摘自Ant手冊(cè).Phing & Binarycloud :歷史Phing源自Bin...
閱讀全文
數(shù)據(jù)庫(kù)備份是很重要的。如果定期做好備份,這樣就可以在發(fā)生系統(tǒng)崩潰時(shí)恢復(fù)數(shù)據(jù)到最后一次正常的狀態(tài),把損失減小到最少。
以前在FREEBSD系統(tǒng)里面都先把MYSQL停掉,然后直接用tar命令直接把數(shù)據(jù)庫(kù)文件打包,下載到本地。如果要恢復(fù)數(shù)據(jù)庫(kù),也是直接上傳,用tar解壓,然后設(shè)置下權(quán)限就可以用了。
現(xiàn)在在windows下,本來(lái)用PHPmyadmin管理數(shù)據(jù)庫(kù)是很好,但是本地的服務(wù)器,死活連不上數(shù)據(jù)庫(kù),新版的2.11的我都不知道怎么配置,汗死!用MySQL Control Center 等客戶端軟件也不行,暈死了! 無(wú)奈,只好用mysqldump 來(lái)備份了!
因?yàn)闆](méi)有好好的準(zhǔn)備 ,以為mysqldump 是 MYSQL解析器里面的命令-_-!! 死活運(yùn)行不起來(lái)。
使用了之后,才發(fā)現(xiàn)。。原來(lái),MYSQL的備份可以這么美的。哈哈。。(漸遠(yuǎn)!)
好了,收集了一些mysqldump命令的語(yǔ)法,先學(xué)學(xué)!
用mysqldump對(duì)MySQL數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)備份與恢復(fù)
MySQLl提供了一個(gè)mysqldump命令,我們可以用它進(jìn)行數(shù)據(jù)備份,下面假設(shè)要備份yejihao_agent這個(gè)數(shù)據(jù)庫(kù):
#mysqldump -u root -p yejihao_agent > yejihao_agent.sql
按提示輸入密碼,這就把yejihao_agent數(shù)據(jù)庫(kù)所有的表結(jié)構(gòu)和數(shù)據(jù)備份到y(tǒng)ejihao_agent.sql了,因?yàn)橐傔M(jìn)行備份工作,如果數(shù)據(jù)量大會(huì)占用很大空間,這時(shí)可以利用gzip壓縮數(shù)據(jù),命令如下:
#mysqldump -u root -p yejihao_agent | gzip > yejihao_agent.sql.gz
系統(tǒng)崩潰,重建系統(tǒng)時(shí),可以這樣恢復(fù)數(shù)據(jù):
#mysql -u root -p yejihao_agent < yejihao_agent.sql
從壓縮文件直接恢復(fù):
#gzip < yejihao_agent.sql.gz | mysql -u root -p yejihao_agent
/*************************************/
命令解釋
/************************************/
導(dǎo)出要用到MySQL的mysqldump工具,基本用法是:
shell> mysqldump [OPTIONS] database [tables]
如果你不給定任何表,整個(gè)數(shù)據(jù)庫(kù)將被導(dǎo)出。
通過(guò)執(zhí)行mysqldump --help,你能得到你mysqldump的版本支持的選項(xiàng)表。
注意,如果你運(yùn)行mysqldump沒(méi)有--quick或--opt選項(xiàng),mysqldump將在導(dǎo)出結(jié)果前裝載整個(gè)結(jié)果集到內(nèi)存中,如果你正在導(dǎo)出一個(gè)大的數(shù)據(jù)庫(kù),這將可能是一個(gè)問(wèn)題。
mysqldump支持下列選項(xiàng):
--add-locks
在每個(gè)表導(dǎo)出之前增加LOCK TABLES并且之后UNLOCK TABLE。(為了使得更快地插入到MySQL)。
--add-drop-table
在每個(gè)create語(yǔ)句之前增加一個(gè)drop table。
--allow-keywords
允許創(chuàng)建是關(guān)鍵詞的列名字。這由表名前綴于每個(gè)列名做到。
-c, --complete-insert
使用完整的insert語(yǔ)句(用列名字)。
-C, --compress
如果客戶和服務(wù)器均支持壓縮,壓縮兩者間所有的信息。
--delayed
用INSERT DELAYED命令插入行。
-e, --extended-insert
使用全新多行INSERT語(yǔ)法。(給出更緊縮并且更快的插入語(yǔ)句)
-#, --debug[=option_string]
跟蹤程序的使用(為了調(diào)試)。
--help
顯示一條幫助消息并且退出。
--fields-terminated-by=...
--fields-enclosed-by=...
--fields-optionally-enclosed-by=...
--fields-escaped-by=...
--fields-terminated-by=...
這些選擇與-T選擇一起使用,并且有相應(yīng)的LOAD DATA INFILE子句相同的含義。
LOAD DATA INFILE語(yǔ)法。
-F, --flush-logs
在開(kāi)始導(dǎo)出前,洗掉在MySQL服務(wù)器中的日志文件。
-f, --force,
即使我們?cè)谝粋€(gè)表導(dǎo)出期間得到一個(gè)SQL錯(cuò)誤,繼續(xù)。
-h, --host=..
從命名的主機(jī)上的MySQL服務(wù)器導(dǎo)出數(shù)據(jù)。缺省主機(jī)是localhost。
-l, --lock-tables.
為開(kāi)始導(dǎo)出鎖定所有表。
-t, --no-create-info
不寫入表創(chuàng)建信息(CREATE TABLE語(yǔ)句)
-d, --no-data
不寫入表的任何行信息。如果你只想得到一個(gè)表的結(jié)構(gòu)的導(dǎo)出,這是很有用的!
--opt
同--quick --add-drop-table --add-locks --extended-insert --lock-tables。
應(yīng)該給你為讀入一個(gè)MySQL服務(wù)器的盡可能最快的導(dǎo)出。
-pyour_pass, --password[=your_pass]
與服務(wù)器連接時(shí)使用的口令。如果你不指定“=your_pass”部分,mysqldump需要來(lái)自終端的口令。
-P port_num, --port=port_num
與一臺(tái)主機(jī)連接時(shí)使用的TCP/IP端口號(hào)。(這用于連接到localhost以外的主機(jī),因?yàn)樗褂?nbsp;Unix套接字。)
-q, --quick
不緩沖查詢,直接導(dǎo)出至stdout;使用mysql_use_result()做它。
-S /path/to/socket, --socket=/path/to/socket
與localhost連接時(shí)(它是缺省主機(jī))使用的套接字文件。
-T, --tab=path-to-some-directory
對(duì)于每個(gè)給定的表,創(chuàng)建一個(gè)table_name.sql文件,它包含SQL CREATE 命令,和一個(gè)table_name.txt文件,它包含數(shù)據(jù)。 注意:這只有在mysqldump運(yùn)行在mysqld守護(hù)進(jìn)程運(yùn)行的同一臺(tái)機(jī)器上的時(shí)候才工作。.txt文件的格式根據(jù)--fields-xxx和--lines--xxx選項(xiàng)來(lái)定。
-u user_name, --user=user_name
與服務(wù)器連接時(shí),MySQL使用的用戶名。缺省值是你的Unix登錄名。
-O var=option, --set-variable var=option設(shè)置一個(gè)變量的值。可能的變量被列在下面。
-v, --verbose
冗長(zhǎng)模式。打印出程序所做的更多的信息。
-V, --version
打印版本信息并且退出。
-w, --where='where-condition'
只導(dǎo)出被選擇了的記錄;注意引號(hào)是強(qiáng)制的!
"--where=user='jimf'" "-wuserid>1" "-wuserid<1"
最常見(jiàn)的mysqldump使用可能制作整個(gè)數(shù)據(jù)庫(kù)的一個(gè)備份:
mysqldump --opt database > backup-file.sql
但是它對(duì)用來(lái)自于一個(gè)數(shù)據(jù)庫(kù)的信息充實(shí)另外一個(gè)MySQL數(shù)據(jù)庫(kù)也是有用的:
mysqldump --opt database | mysql --host=remote-host -C database
由于mysqldump導(dǎo)出的是完整的SQL語(yǔ)句,所以用mysql客戶程序很容易就能把數(shù)據(jù)導(dǎo)入了:
shell> mysqladmin create target_db_name
shell> mysql target_db_name < backup-file.sql
就是
shell> mysql 庫(kù)名 < 文件名
轉(zhuǎn)至游戲大觀 http://www.gamelook.com/?p=1616
簡(jiǎn)介
Boomzap是一個(gè)完全虛擬的工作室。我們沒(méi)有辦公室,每個(gè)人都使用彈性工作時(shí)間在家工作。我們的團(tuán)隊(duì)包括了十多個(gè)全職員工,以及來(lái)自世界各地的兼職員工,如美國(guó),日本,馬來(lái)西亞,新加坡,俄羅斯,菲律賓。他們其中的大多數(shù)人一年只見(jiàn)過(guò)一次面,甚至很多核心的團(tuán)隊(duì)成員都從未彼此見(jiàn)過(guò)面。更不可想象的是,我們當(dāng)中的很多成員都過(guò)著具有移動(dòng)性的生活:例如我本人經(jīng)常在西雅圖,新加坡和橫濱之間穿梭。我們從2005年開(kāi)始就一直用這種方式工作,并取得了令人滿意的成效。
我曾經(jīng)多次被問(wèn)起我們是怎么成功的使用這種工作方式的,我很樂(lè)意分享這其中的經(jīng)驗(yàn)。雖然本文可能更適合于想我們這樣的小型的偏外包行的工作室,但是傳統(tǒng)大型工作室的管理者們應(yīng)該也能從中獲得一些有用的信息。首先我想說(shuō)明一下為什么我們會(huì)采用目前這種工作方式,這種在家工作的分布式辦公模式有什么優(yōu)勢(shì):
接觸到世界各地最好的開(kāi)發(fā)者:我們能雇傭全球任何地方的任何人,而不用擔(dān)心辦公地點(diǎn)和護(hù)照等問(wèn)題。我們的員工不必遠(yuǎn)離他們的居住地,遠(yuǎn)離他們的交際圈,來(lái)和我們一起工作。事實(shí)上,我們有些員工正是居住在十分偏遠(yuǎn)的地方,為我們工作,他們的家距離最近的游戲公司也有上百英里。
更低的勞動(dòng)力成本+更低的生活成本=快樂(lè)的開(kāi)發(fā)者(Lower Labor Costs + Cost of Living Adjustments = Happy Developers):因?yàn)閬喼薜男交I水平比北美要低,所以我們的人力成本很有競(jìng)爭(zhēng)力。但是我們并沒(méi)有把這當(dāng)成是雇傭廉價(jià)勞動(dòng)力的機(jī)會(huì),我們沒(méi)有根據(jù)當(dāng)?shù)氐氖杖胨蕉档蛦T工的薪水,而是統(tǒng)一按照新加坡的薪籌水平來(lái)支付員工工資,不管員工在哪個(gè)國(guó)家。可能對(duì)于美國(guó)和英國(guó)的開(kāi)發(fā)者來(lái)說(shuō)這不是最好的策略,但是對(duì)于俄羅斯,馬來(lái)西亞,菲律賓這些地方的員工來(lái)說(shuō),他們得到的薪籌在當(dāng)?shù)貞?yīng)該算是最好的。這樣我們就能夠聘用到這些地區(qū)最好的開(kāi)發(fā)者,并讓他們覺(jué)得非常開(kāi)心。
更低的日常開(kāi)銷:我們不用為辦公地點(diǎn),電腦,用電,咖啡機(jī)甚至是便箋紙而花錢。當(dāng)然我們的確會(huì)花一些錢來(lái)幫助員工們購(gòu)置開(kāi)發(fā)設(shè)備,但是要知道他們是游戲開(kāi)發(fā)者,即使我們不幫他們購(gòu)買,他們自己家里通常會(huì)擁有他們所能買得起的最好計(jì)算機(jī)。我們只是避免了傳統(tǒng)辦公室里的重復(fù)開(kāi)銷,并用這些省下來(lái)的錢來(lái)更好的補(bǔ)償我們的員工罷了。
自由高效地安排工作和生活:我們的工作方式允許團(tuán)隊(duì)中的每個(gè)人自己安排工作時(shí)間,將工作效率最大化。這不僅節(jié)省了很多通常會(huì)被浪費(fèi)掉的時(shí)間,例如成員之間的交流時(shí)間等,也讓員工們能夠有更多的時(shí)間去做一些在傳統(tǒng)公司中不可能做到的事,例如上函授學(xué)校,在學(xué)校教書等等。這種自由度所能為員工帶來(lái)的好處和快樂(lè)是其它任何傳統(tǒng)工作方式都無(wú)法比擬的,是無(wú)法簡(jiǎn)單用時(shí)間和金錢來(lái)衡量的。
工作與生活的平衡+金錢=忠誠(chéng)無(wú)私的員工:簡(jiǎn)單來(lái)說(shuō),這種工作方式最終的結(jié)果就是我們的員工非常樂(lè)意為Boomzap工作。任何管理者都知道留住優(yōu)秀的員工是公司成長(zhǎng)的關(guān)鍵因素之一,我們的這種工作方式就是不僅讓我們能從世界各地招聘到最好的員工,而且能留住他們。事實(shí)上,從2005年至今,我們還沒(méi)有一個(gè)員工主動(dòng)離職。
這些聽(tīng)起來(lái)很不錯(cuò),不是嗎?是的,確實(shí)很不錯(cuò)。但是其中的奧秘在于你能像管理一個(gè)傳統(tǒng)工作室那樣去管理一個(gè)虛擬的分布式的工作室。我們的具體管理策略很難在這里詳細(xì)表述,所以在此我僅僅列出我們管理一個(gè)虛擬開(kāi)發(fā)工作室的最重要的10條策略。簡(jiǎn)單來(lái)說(shuō),這些策略雖然對(duì)于我們來(lái)說(shuō)很適用,但是你需要根據(jù)你的團(tuán)隊(duì)具體情況,你們的工作流程,團(tuán)隊(duì)結(jié)構(gòu)來(lái)綜合考慮這些是否適用于你們。
10條戒律
#1: 我們從不記錄工作時(shí)間
我管理Boomzap所遇到的第一個(gè)問(wèn)題就是:“你怎么知道他們是否在工作?”回答很簡(jiǎn)單:“無(wú)所謂。”我知道一個(gè)專業(yè)的開(kāi)發(fā)者在40個(gè)小時(shí)一周的工作時(shí)間中能夠完成多少工作。每周一我將這些工作分配下去,期望它在周末的時(shí)候能被完成。如果完成了,我不在乎他們花了多少時(shí)間去完成它。如果沒(méi)完成,他們就得周末繼續(xù)工作來(lái)確保它的完成。事實(shí)上,我非常希望他們能在40小時(shí)內(nèi)完成我分配的任務(wù),然后用剩余時(shí)間去做自己高興做的任何事。
關(guān)于這個(gè)問(wèn)題的經(jīng)濟(jì)帳很簡(jiǎn)單:如果你想鼓勵(lì)你的員工更高效的工作,你就不能把“工作時(shí)間”固定下來(lái),因?yàn)槿绻ぷ鲿r(shí)間成為了常量,工作質(zhì)量和數(shù)量就會(huì)反而成為變量。在傳統(tǒng)工作室中,“工作時(shí)間”是固定不變的常量,對(duì)于高效完成工作的最好獎(jiǎng)勵(lì)就是你會(huì)獲得更多的工作安排。更糟糕的情況是,在傳統(tǒng)模式下,較差的員工所遺留下來(lái)的工作要交給較好的員工來(lái)做,因?yàn)檩^好的員工在相同時(shí)間內(nèi)能完成更多的事情。這樣你在不經(jīng)意間就給了較差的員工一個(gè)獎(jiǎng)勵(lì):少做些事,剩下的讓較好的員工去做吧。這真的很糟糕。
相反在Boomzap,我們把工作質(zhì)量和數(shù)量當(dāng)作常量,然后允許員工自己用時(shí)間來(lái)衡量自己的工作效率:他們有一個(gè)任務(wù)列表和一個(gè)最低標(biāo)準(zhǔn),然后自己安排時(shí)間去完成這些任務(wù)。如果他們能更快更好地完成任務(wù),他們所獲得的獎(jiǎng)勵(lì)就是有更多的剩余時(shí)間用來(lái)休息。如果他們不能完成任務(wù),很快他們就會(huì)發(fā)現(xiàn)自己周末經(jīng)常需要加班。在這種模式中,不具備效率的員工自然會(huì)被淘汰,因?yàn)樗麄冇刑嗟墓ぷ餍枰影嗳ネ瓿伞M瑫r(shí),效率高的員工會(huì)發(fā)現(xiàn)自己擁有了更多的自由支配時(shí)間——自由支配時(shí)間就是對(duì)員工的一種很好的獎(jiǎng)勵(lì)。每天都能讓你的好員工獲得獎(jiǎng)勵(lì),這可是很不錯(cuò)的魔咒哦。
#2: 我們會(huì)做Daily Build(每日構(gòu)建)
在一個(gè)你不能在大廳里游走,查看每個(gè)人都在做什么,并給他們分配任務(wù)的虛擬工作室中,你需要一種至關(guān)重要的機(jī)制,來(lái)檢查人們每天都在做什么,并對(duì)他們的工作給予反饋。為了解決這個(gè)問(wèn)題,我們有一套非常嚴(yán)格的Daily Build策略。每一天結(jié)束的時(shí)候,我們會(huì)構(gòu)建一個(gè)包含了所有最新美術(shù)資源和設(shè)計(jì)要素的游戲版本。我們根據(jù)這個(gè)最新的游戲版本來(lái)評(píng)價(jià)這一天的工作。這也是我們用來(lái)評(píng)價(jià)工作的唯一標(biāo)準(zhǔn)。我對(duì)員工的工作反饋當(dāng)中有90%都是直接來(lái)自于這個(gè)daily build。我確保員工每天能拿到這份反饋意見(jiàn),這樣他們就能知道他們十分在朝著正確的方向前進(jìn)。這樣的daily build以及反饋過(guò)程是我們這個(gè)公司的生命血液。如果我們的daily build走向失敗,那么整個(gè)項(xiàng)目也就走向失敗了。
#3: 我們將全職員工和基于項(xiàng)目的特別員工混合編制在一起
有些工作只要有足夠多的初級(jí)員工就能做得很好,有些工作交給擅長(zhǎng)這方面的人來(lái)做,能做得更快更好,沒(méi)必要使用你最好的資源來(lái)做所有的工作。問(wèn)題是你很難用固定不變的薪水來(lái)長(zhǎng)時(shí)間留住初級(jí)員工和專才。所以我們的策略是留住那些高級(jí)的通才,并讓他們來(lái)做游戲中的核心設(shè)計(jì)和架構(gòu)工作,然后將大量的內(nèi)容制作外包給那些專門做這方面的人,以及我們雇傭的一些工作室。因?yàn)樵谌魏螘r(shí)候我們的項(xiàng)目當(dāng)中都有超過(guò)一半的成員是來(lái)自于我們雇傭的一次性合同工,這些人員是我們能夠根據(jù)需要隨時(shí)變更的,或者是根據(jù)需要縮減項(xiàng)目組成員,而不必裁減任何我們的員工。這對(duì)于現(xiàn)金流的控制及其有用。
關(guān)鍵在于我們外包的目的不是在于減少成本——事實(shí)上我們的很多合同工的成本比正式員工還要高——我們外包的目的是將我們工作室的空閑時(shí)間風(fēng)險(xiǎn)轉(zhuǎn)移出去。舉例來(lái)說(shuō),我們會(huì)將所有的網(wǎng)頁(yè),聲音,大量的手繪背景,人物肖像等工作外包出去。這些工作都是熟練工們可以高效高質(zhì)量完成的工作,并且都是只在項(xiàng)目開(kāi)發(fā)中的某些特定階段才需要的。當(dāng)我們需呀他們的時(shí)候,我們支付比正常水平高的報(bào)酬給他們,而當(dāng)我們不需要他們的時(shí)候,不用為了“解雇他們”而付出任何開(kāi)銷。
#4: 我們是否雇傭他為全職員工主要取決于他的性格
我們的工作方式對(duì)于成熟的,主動(dòng)的,富于自律精神的人來(lái)說(shuō)是最好不過(guò)的。但可惜的是很多優(yōu)秀的程序員,美術(shù)和策劃并不適合在家里依照自己的作息時(shí)間表來(lái)工作。你必須及其小心地進(jìn)行測(cè)試,不要雇傭那些不適合這種方式的人。
我們的做法是對(duì)于每一個(gè)要加入我們工作室的成員,先進(jìn)行一個(gè)月的考核,然后給他3個(gè)月的試用期。即使是我們很熟悉的開(kāi)發(fā)者也是如此。第一個(gè)月的考核主要是考核對(duì)方的專業(yè)能力,判斷他是否有能力完成這個(gè)工作。3個(gè)月的試用期里則是對(duì)他性格和自我管理能力的綜合考察。有幾次我們縮短了對(duì)一些人的3個(gè)月的試用期,隨后我們便后悔了。此后我們?cè)僖膊浑S便縮短試用期,對(duì)于不是很熟悉的人,我們甚至?xí)娱L(zhǎng)3試用期。
這里的底線是,如果你將要讓你的員工以這種方式工作,你必須要認(rèn)識(shí)到有一些人——甚至包括一些十分優(yōu)秀的程序員——就是無(wú)論如何也無(wú)法適應(yīng)這種工作方式的。但是對(duì)于那些獨(dú)立自主,善于自我激勵(lì)的人,這種工作方式能起到很好的作用。
一些人將這種現(xiàn)象解釋為“虛擬工作室不能雇傭那些年輕的沒(méi)有經(jīng)驗(yàn)的開(kāi)發(fā)者”,我們不同意這個(gè)看法。我們的一些最好的員工恰恰是那些年輕的,很有動(dòng)力的實(shí)習(xí)者。而那些無(wú)法適應(yīng)這種方式的人往往是一些接受過(guò)專業(yè)訓(xùn)練的,有長(zhǎng)期的傳統(tǒng)游戲工作室經(jīng)驗(yàn)的人。這里最重要的不是經(jīng)驗(yàn)而是工作動(dòng)力和個(gè)人品質(zhì)。
#5: 我們用“基于項(xiàng)目的聯(lián)盟結(jié)構(gòu)”來(lái)取代權(quán)威
另一個(gè)我經(jīng)常被問(wèn)起的關(guān)于Boomzap結(jié)構(gòu)的問(wèn)題是:“你不能跟他們會(huì)面和交談,那你到底怎么管理這些人呢?”用一個(gè)制作人的說(shuō)法來(lái)問(wèn)就是:“你怎么保證團(tuán)隊(duì)中的人所做出來(lái)的東西就是你想要的呢?”回答很簡(jiǎn)單,我們不保證。公司中的每個(gè)員工都被分配在一個(gè)特定的項(xiàng)目中。他們知道他們所在的項(xiàng)目是什么,在項(xiàng)目里他們有很大的自由和權(quán)利。我們的策劃所做的是高度抽象化的設(shè)計(jì),就像我們的任務(wù)一樣。我們不對(duì)我們的員工做細(xì)致的管理,并不是因?yàn)槲覀冇憛捈?xì)致的管理,僅僅是因?yàn)橐龅郊?xì)致管理,光是大量的郵件就夠你受的了。相反的,我們建立3到4個(gè)人的小組,我們?cè)试S他們按照自己的意愿去做游戲。我們對(duì)他們的管理非常松散,給了他們足夠的自由度,讓他們能夠自己做決定。
這種方法相對(duì)于傳統(tǒng)的集中管理式的工作室來(lái)說(shuō),更像是一堆獨(dú)立項(xiàng)目所組成的聯(lián)盟。每個(gè)小組都有獨(dú)立的權(quán)利可以對(duì)設(shè)計(jì)做出很大的改動(dòng),而不必去問(wèn)總部這樣做是否合適,由此而減少了大量的溝通成本。這種方法對(duì)于一個(gè)項(xiàng)目能力很強(qiáng)的團(tuán)隊(duì)來(lái)說(shuō),可以收到很好的效果,而對(duì)于項(xiàng)目能力較弱的團(tuán)隊(duì)來(lái)說(shuō),由于缺少了整體把握,可能會(huì)導(dǎo)致項(xiàng)目失敗。所以了解你的員工的能力很重要。
有一句話是這么說(shuō)的,接受那些并不是你所期望的,但是被完成得很好的工作,是成功的關(guān)鍵。在傳統(tǒng)游戲工作室里,最常見(jiàn)的情況是整個(gè)項(xiàng)目組耗費(fèi)了大量的時(shí)間,僅僅是為了實(shí)現(xiàn)其中某一個(gè)人的夢(mèng)想,然后他們就在這無(wú)止盡的追求中反復(fù)修改,返工,試圖讓游戲更接近他的想法。請(qǐng)將項(xiàng)目托付和授權(quán)給你的項(xiàng)目組成員,客觀地去取舍那些不是你想要的但是做得很好的東西。這樣做有兩大好處:1)你的組員們會(huì)由衷地感到高興,因?yàn)樗麄冏约鹤龅臇|西能被最終放在游戲里面,而不必為了別人的想法去改變什么;2)有些時(shí)候那些你不想要的東西的確會(huì)比你腦子里的想法要更好一些。
記住,將項(xiàng)目托付給組員的同時(shí),要將責(zé)任也托付給他們。如果你想要你的組員們真正地對(duì)自己的工作負(fù)起責(zé)任來(lái),你就不能老是低估他們的工作,總是強(qiáng)迫他們按照你的意愿去返工。“這是不是我想要的?”這個(gè)并不是問(wèn)題。你最好這樣問(wèn)自己:“這是不是玩家所喜歡的東西?”
#6: 我們雇傭那些會(huì)做實(shí)事的管理者
我們這種工作方式的一大優(yōu)點(diǎn)是你無(wú)法隱藏那些對(duì)項(xiàng)目沒(méi)有貢獻(xiàn)的成員。那些潛伏傳統(tǒng)大型工作室里,老是做一些“過(guò)程優(yōu)化”和“促進(jìn)會(huì)議”工作的中層管理者們?cè)谝粋€(gè)虛擬的工作室里就找不到這樣的事可做。我們也一點(diǎn)兒也不因此而想念他們。團(tuán)隊(duì)中的每個(gè)人,甚至包括公司組建者,都會(huì)在項(xiàng)目里承擔(dān)一定的工作,例如腳本編輯,測(cè)試,關(guān)卡設(shè)計(jì)等。因?yàn)槲覀冊(cè)u(píng)價(jià)一個(gè)員工的唯一標(biāo)準(zhǔn)就是他的工作有多少被包含在了我們的游戲中。正因?yàn)槲覀兊墓芾碚弑黄纫c項(xiàng)目的技術(shù)層面打交道,他們會(huì)對(duì)團(tuán)隊(duì)中的每一個(gè)成員在做什么都了如指掌,對(duì)某項(xiàng)工作到底要花多少人力來(lái)完成也會(huì)更加清楚。這樣對(duì)項(xiàng)目所帶來(lái)的好處是不言而喻的。
#7: 我們依賴于3P:PowerPoint, Prototypes(游戲原型), Photoshop
我希望我不是第一個(gè)告訴你這話的人,但是的的確確是沒(méi)有人會(huì)閱讀設(shè)計(jì)文檔。事實(shí)上,當(dāng)我以前在一個(gè)比較大型的工作室上班的時(shí)候,我就養(yǎng)成了一個(gè)習(xí)慣,我會(huì)在那些超過(guò)50頁(yè)的設(shè)計(jì)文檔中的某處插入一句話:“誰(shuí)看到這句話我就給他5美元。”然而10年來(lái)從沒(méi)有一個(gè)人來(lái)找我要過(guò)這5美元。這是個(gè)真實(shí)的故事。有問(wèn)題的是,業(yè)界找到了一種方法來(lái)改變這種狀況,開(kāi)會(huì),開(kāi)大量的會(huì)議。然而作為一個(gè)虛擬工作室,我們不能像他們那樣大量開(kāi)會(huì),我們甚至都不能彼此見(jiàn)面,因此我們只能想出另一種解決方法。
首先,我們用一個(gè)很短的PowerPoint演示稿來(lái)作為游戲的最初設(shè)計(jì)。這個(gè)PowerPoint文檔中全是圖片,掃描的手繪圖,從其他游戲中引用的截圖,google中搜索到的各種圖片。是的,一個(gè)沒(méi)有文字的文檔。這個(gè)文檔基本上是游戲中所有狀態(tài)畫面的設(shè)計(jì)草案,描繪出這個(gè)游戲大致的樣子以及它的玩法。接下來(lái),我們讓程序員基于這份文檔做出一個(gè)粗糙的游戲原型,原型中的圖片就用PowerPoint文檔中的圖片,沒(méi)有合適圖片的就用灰色方塊來(lái)替代。這個(gè)游戲原型,加上我們每天對(duì)于它的反饋和改進(jìn)記錄,就構(gòu)成了我們的“策劃案”。過(guò)了一段時(shí)間之后,當(dāng)這個(gè)游戲原型變得真正好玩起來(lái)了,我們的美術(shù)就從這個(gè)原型游戲的截圖開(kāi)始,在Photoshop中設(shè)計(jì)它的畫面,然后給出游戲mockup版本所需的所有圖形資源。
當(dāng)這些都完成之后,我們就進(jìn)入完整開(kāi)發(fā)階段。通常會(huì)有一個(gè)人坐下來(lái),利用現(xiàn)有的PowerPoint文檔和游戲原型,列出一些列簡(jiǎn)單的任務(wù)列表,表明要讓這個(gè)原型變成最終產(chǎn)品,還有哪些工作是需要去做的,這樣的一些列表加上PowerPoint文檔和與游戲原型,3者就構(gòu)成了一個(gè)更接近于策劃案的“策劃案”。我們的大多數(shù)游戲都只有不超過(guò)20頁(yè)的文檔,而且我們還在考慮這20頁(yè)是否太多了點(diǎn)。
#8: 我們使用“制作人兼程序(Producer-Programmers)”
我們開(kāi)發(fā)中的另一個(gè)強(qiáng)大的秘密就是,我們的每一個(gè)項(xiàng)目都由一個(gè)制作人兼程序來(lái)負(fù)責(zé)。他是一個(gè)具備較高專業(yè)技能的程序員,不僅要完成游戲的核心代碼,而且要從整體上來(lái)把握這個(gè)產(chǎn)品,把握這個(gè)游戲里面的所有方方面面。我們以這樣的結(jié)構(gòu)來(lái)搭建項(xiàng)目組有幾個(gè)原因,最重要的一個(gè)原因就是:這樣一來(lái),與美術(shù)和音樂(lè)制作者打交道的人就是那個(gè)要把這些資源加入到游戲中的人。這樣就減少了很多溝通環(huán)節(jié),減少了很多由于溝通而帶來(lái)的誤差。而且這樣一來(lái)制作人就可以直接去實(shí)現(xiàn)和測(cè)試自己的新想法,而不是當(dāng)制作人有了新的想法后,要先去給程序員解釋,然后再由程序員來(lái)實(shí)現(xiàn)。
#9: 我們創(chuàng)建了一套“簡(jiǎn)明可靠(Idiot-proof)”的工作流程
傳統(tǒng)開(kāi)發(fā)工作室經(jīng)常需要消耗大量的“溝通時(shí)間”來(lái)幫助美術(shù),策劃和音樂(lè)制作者將他們的工作內(nèi)容集成到游戲中去。因?yàn)槲覀儧](méi)法讓兩三個(gè)人圍坐在一張桌子周圍來(lái)解決這類問(wèn)題,也因?yàn)樽屛覀兊某绦騿T來(lái)撰寫詳細(xì)的資源集成文檔是一種浪費(fèi)和幼稚,我們會(huì)花很長(zhǎng)的時(shí)間來(lái)開(kāi)發(fā)相應(yīng)的自動(dòng)化工具,確保所有這些資源能很簡(jiǎn)單地被加入到游戲中。
我們最大的工具就是Excel,我們用它來(lái)編寫各種資源腳本,例如精靈列表,聲音文件列表,關(guān)卡設(shè)計(jì)變量,物體變量,國(guó)際化字符串等等。每個(gè)Excel表格中會(huì)有一個(gè)很大的“導(dǎo)出”按鈕,用來(lái)導(dǎo)出資源腳本,任何人都不能隨意修改其中的內(nèi)容。請(qǐng)記住,自動(dòng)化意味著所有的錯(cuò)誤都是系統(tǒng)錯(cuò)誤,都是可以快速定位和解決的。同時(shí)因?yàn)樗械娜硕寄芎苋菀椎亻喿xExcel表格,并填充里面的變量,大多數(shù)人都能清楚地知道如何將他們手頭的資源集成到游戲中,這些過(guò)程都不需要程序員來(lái)干預(yù)。
我們的關(guān)卡設(shè)計(jì)工具也是很簡(jiǎn)單的。它們都是符合“所見(jiàn)即所得”思路的編輯器,可以直接從游戲中開(kāi)啟,僅用鼠標(biāo)即可完成大多數(shù)操作。這讓我們的設(shè)計(jì)人員能高效地設(shè)計(jì)和測(cè)試游戲中的關(guān)卡。因?yàn)闆Q定哪些Excel表格會(huì)被游戲引擎處理的人同時(shí)也是導(dǎo)出Excel表單和關(guān)卡編輯器數(shù)據(jù)的人,這個(gè)過(guò)程保證了絕對(duì)的簡(jiǎn)明可靠。
#10: 我們只雇傭技術(shù)型的美工
最后需要說(shuō)明的是,事實(shí)上我們沒(méi)有多少全職的美術(shù)人員。我們會(huì)將大量的美術(shù)工作外包出去,尤其是各種花紋,背景,肖像,故事插圖等等。所有這些都能迅速地被那些外包團(tuán)隊(duì)完成,然后返給我們,我們僅需要少量的工作將這些資源整合到游戲中即可。我們團(tuán)隊(duì)中的美術(shù)都是技術(shù)型的,他們對(duì)于我們的開(kāi)發(fā)工具和相關(guān)技術(shù)比較了解,例如字體,動(dòng)畫物體,粒子,用戶界面等。這樣我們不僅可以不用在團(tuán)隊(duì)中維持那些概念美術(shù),而且也避免了讓我們?nèi)ソ荒切┡R時(shí)合同工使用我們的工具。
虛擬工作室的9個(gè)關(guān)鍵工具
下面這些是我們的虛擬工作室中實(shí)際使用的用以幫助我們開(kāi)發(fā)的工具。這個(gè)部分不是幫下面這些工具打廣告,只是這些工具跟我們的所有人都合作愉快。你可能知道更好的選擇,但我只是告訴你我們的選擇:
1. CVS: 如果你在開(kāi)發(fā)中還沒(méi)有使用任何版本控制系統(tǒng),那么遲早你會(huì)發(fā)現(xiàn)自己將大量的人力浪費(fèi)在了解決無(wú)休止的文件錯(cuò)亂,版本錯(cuò)亂的問(wèn)題中。在傳統(tǒng)工作室中是如此,在虛擬工作室中這顯得更加重要。你使用何種工具并不重要,但你一定要至少使用一種。我們用的是CVS,但這只是我們的選擇。任何你覺(jué)得方便的工具都可以。
2. Basecamp: 我們項(xiàng)目中使用的一個(gè)小巧的在線團(tuán)隊(duì)合作工具。每月只需25美元,就能讓我們創(chuàng)建無(wú)限量的工程,讓發(fā)行商合作伙伴能直接看到我們的日常項(xiàng)目管理情況,創(chuàng)建項(xiàng)目進(jìn)度的簡(jiǎn)單報(bào)表。方便地發(fā)布每天的新版本和項(xiàng)目日志。每當(dāng)有新消息發(fā)布時(shí)還能自動(dòng)發(fā)送通知郵件,你能通過(guò)回復(fù)郵件來(lái)自動(dòng)將你的反饋發(fā)布到網(wǎng)站上。很酷。
3. MSN Messenger: 我們的工作室與MSN息息相關(guān)。我們要求所有員工在工作時(shí)保持MSN在線。他們還必須設(shè)置“如果我在xx分鐘內(nèi)不活動(dòng),則自動(dòng)顯示成離開(kāi)”,這樣我們就能知道我們是否能跟他們交談。我們還要求他們?cè)贛SN中設(shè)置個(gè)性簽名來(lái)表明他們目前正在做什么。因此如果他們要去看醫(yī)生,就寫上“看醫(yī)生,3點(diǎn)回來(lái)”,或者當(dāng)他們?cè)谧鲰?xiàng)目中的任務(wù)中時(shí),就會(huì)寫上“繪制背景圖片”之類的。這樣每個(gè)人都知道其他人都在做什么,而不必總?cè)ゴ驍_別人。如果有人需要安靜思考,那他就把自己的狀態(tài)設(shè)置為“忙碌”。我們有條嚴(yán)格的規(guī)定“不要輕易去打擾正在忙碌中的人,除非有特別緊急的事”。所以如果有人想集中精力思考代碼,或者解決難題,他們就可以避免被打擾而分散精力。但如果真的有緊急情況會(huì)影響到其他人的工作進(jìn)度,我們依然能夠及時(shí)聯(lián)系到他。
4. SkypeIn 和 SkypeOut: 除了經(jīng)常使用免費(fèi)的Skype語(yǔ)音電話之外,我們還是用SkypeOut來(lái)呼叫真實(shí)電話。戴著耳麥來(lái)使用的話就比用手機(jī)要方便,能解放雙手,而且價(jià)格很便宜,打到全世界各地都是2美分一分鐘,接近于免費(fèi)。更方便的是你能設(shè)定一個(gè)真實(shí)電話號(hào)碼作為你的SkypeIn號(hào)碼,讓別人通過(guò)真實(shí)電話來(lái)呼叫你的Skype賬號(hào),對(duì)方會(huì)感覺(jué)就像在打本地電話一樣。我們的工作室SkypeIn號(hào)碼設(shè)在西雅圖,因?yàn)槲覀兊拇蠖鄶?shù)雇員生活在那里,撥打本地號(hào)碼會(huì)讓他們感到無(wú)比親切。你還能設(shè)定SkypeIn號(hào)碼的轉(zhuǎn)呼,這樣當(dāng)你指定的號(hào)碼無(wú)人接聽(tīng)的時(shí)候還能轉(zhuǎn)呼到任何其它電話上,包括你的手機(jī)。它還帶有一個(gè)語(yǔ)音郵箱!最終的效果是,無(wú)論你身在何處,身在美國(guó)的人能免費(fèi)呼叫你,你也能以兩美分一分鐘的價(jià)格呼叫任何人。這樣,你的電子通訊交流問(wèn)題就解決了。
5. Earth Class Mail: 怎樣才能方式你的合作伙伴將支票和合同寄錯(cuò)地址?首先,強(qiáng)迫他們采用電子文檔進(jìn)行往來(lái)。Automated Clearing House(美國(guó)的一種基于電子自動(dòng)清算系統(tǒng))是免費(fèi)使用的,大多數(shù)合同都能被掃描并轉(zhuǎn)換成pdf格式。對(duì)于那些覺(jué)得有必要親自去寫支票和傳統(tǒng)信件的Luddites(惟恐失業(yè)而反對(duì)用機(jī)器生產(chǎn)者),你可以在Earth Class Mail里建立一個(gè)郵箱,他們會(huì)將郵寄給你的真實(shí)信件的信封掃描,然后給你發(fā)送一封電子郵件通知。然后你對(duì)這封信下達(dá)指令,你可以轉(zhuǎn)發(fā)這封信,粉碎它,或者打開(kāi)它并掃描信件內(nèi)容。這并不是免費(fèi)服務(wù),但是對(duì)于那些少量的你必須去接收的紙質(zhì)信件來(lái)說(shuō),這種服務(wù)是很便宜的。他們?cè)谌蓝加蟹?wù)點(diǎn)。要小心:當(dāng)你設(shè)置這個(gè)郵箱的時(shí)候,一定要選擇non-PO-box類型,因?yàn)橛袝r(shí)候郵遞員不會(huì)投遞PO郵箱。
6. MyFax: 在地球上,如果你擁有一臺(tái)打印機(jī),那你就沒(méi)有理由去購(gòu)買一臺(tái)傳真機(jī)。只要在MyFax設(shè)置一個(gè)賬號(hào),就能讓所有發(fā)送給你的傳真變成電子郵件發(fā)送給你。它不僅簡(jiǎn)單干凈又便宜,更能重要的是,它能讓你不管身在何處,都能擁有一個(gè)固定不變的,在美國(guó)的,完全免費(fèi)的傳真號(hào)碼。
7. PayPal: 我想我沒(méi)必要再告訴你如果你需要付款給全球各地的人,PayPal是你唯一的選擇。我們使用它支付薪水給所有的美國(guó)和歐洲員工,這樣不僅能立刻到賬,還能生成一個(gè)很棒的支付記錄。而且因?yàn)槟隳芤远喾N形式為PayPal賬戶充值,你可以利用這點(diǎn)來(lái)形成一個(gè)短期的信用卡效果,用以緩解一定的資金短缺問(wèn)題。
注:因?yàn)镻ayPal在某些國(guó)家的手續(xù)費(fèi)過(guò)高,我們已經(jīng)決定放棄使用它了。我們正在尋找一種替代方案,但是目前我們還在繼續(xù)使用它。請(qǐng)根據(jù)您的具體情況考慮。
8. Your Mailing List Provider: 如果你在管理者一個(gè)休閑游戲工作室,你會(huì)有大量的電子郵件往來(lái)。有很多解決方案,但是最超值的是YMLP.com。它有一個(gè)很好的工具用于從各種來(lái)源中導(dǎo)入地址簿,還能直接從我們的網(wǎng)站中收集新的聯(lián)系人地址。最重要的是即使你不能使用自己的筆記本電腦,也能從任何地方獲取完整的郵件列表。你也能方便地分配郵件列表職責(zé),從而讓不同的人同時(shí)維護(hù)這個(gè)郵件列表,每個(gè)人都能擁有對(duì)問(wèn)題的詳細(xì)討論記錄。
9. 移動(dòng)性的裝備: 最后但也是很重要的一點(diǎn),每次在購(gòu)買新設(shè)備的時(shí)候,考慮它的移動(dòng)性。我的家用工作站是一臺(tái)Acer筆記本,自帶內(nèi)置攝像頭和一塊小型可折疊的第二屏幕。我還擁有一臺(tái)USB供電的便攜式袖珍掃描儀,一個(gè)迷你打印機(jī)和一個(gè)耳麥用于Skype。所有這些都能塞進(jìn)一個(gè)小手提箱里(雖然我不是機(jī)場(chǎng)安全崗里的時(shí)髦青年)。我能在3分鐘內(nèi)打包我的所有設(shè)備然后帶著他們前往任何地方。任何擁有一臺(tái)桌子和Internet連接的地方都能作為我的辦公室。提示:只有對(duì)于不太常用的東西才選擇非USB供電的款式。這在跨洋履行中很有用,能讓你的筆記本變成一個(gè)電源轉(zhuǎn)換器,為所有周邊設(shè)備提供電力。
總結(jié)
我并不期望我們的運(yùn)作方式能適合所有其他人,但是我可以向你保證:這種方式對(duì)我們很有效。我希望你能從這里找到有用的東西,更希望你能聯(lián)系我,告訴我你的想法,以及你們是怎么解決跟我們類似的問(wèn)題的。
下面是關(guān)于這篇文章的討論:
問(wèn):你們從這多多不同國(guó)家雇傭人員,怎么處理各地的法律問(wèn)題呢?你們的公司需要在所有這些國(guó)家都注冊(cè)嗎?
答:不是,我們?cè)诿绹?guó)和新加坡有注冊(cè),所以在這兩個(gè)地方我們雇傭正式員工,而在其他地方我們只雇傭合同工(采用的合同只覆蓋到了商業(yè)游戲開(kāi)發(fā)的相關(guān)條款)。
問(wèn):你們?cè)趺刺幚韱T工將開(kāi)發(fā)完成的游戲泄露給盜版者這樣的威脅?
答:就跟常規(guī)公司一樣處理。如果是無(wú)意的,我們就嚴(yán)厲責(zé)備并警告他。如果是故意的,就解雇他。不知道美國(guó)或者英國(guó)公司還有什么不同的解決方式,除了訴訟他(浪費(fèi)時(shí)間)或者報(bào)告警察。
問(wèn):我還注意到了Boomzap所開(kāi)發(fā)的是一些“微型”游戲。
答:更準(zhǔn)確的說(shuō)法是“休閑”游戲。我們的團(tuán)隊(duì)的確也能大到包含10-12個(gè)人,但是我不會(huì)用這樣的團(tuán)隊(duì)去開(kāi)發(fā)像戰(zhàn)爭(zhēng)機(jī)器,刺客信條這樣的游戲。并不僅僅是因?yàn)槟銜?huì)面臨眾多管理和控制問(wèn)題,單單是將10-12GB的海量數(shù)據(jù)在Internet上頻繁傳輸,就會(huì)對(duì)項(xiàng)目造成巨大的延誤作用。我們的團(tuán)隊(duì)一般是3-7個(gè)人,包括處理圖像和聲音外包的人。
問(wèn):你們說(shuō)你們會(huì)做Daily Build,但是你們?cè)趺炊x“一天的結(jié)束”呢,因?yàn)槟銈兊膱F(tuán)隊(duì)成員可能遍布在各個(gè)時(shí)區(qū)。
答:每個(gè)項(xiàng)目里我們都會(huì)指派一個(gè)程序員作為構(gòu)建管理員(Build-master),團(tuán)隊(duì)中的所有其他人都要在他指定的最后期限內(nèi)提交自己的工作成果,然后他就會(huì)在每天自己工作完成之后構(gòu)建一個(gè)當(dāng)天的版本。實(shí)際的構(gòu)建時(shí)間可以根據(jù)項(xiàng)目組各成員的工作時(shí)間,大家一起商量指定一個(gè)時(shí)間。
問(wèn):這方法只能在你有很強(qiáng)的管理能力的情況下才能起作用,這也是為什么團(tuán)隊(duì)規(guī)模不能很大的原因,如果你的管理層次變得更為復(fù)雜,而傳統(tǒng)面對(duì)面的管理方法又用不上的話,這種方法就肯定不行了。當(dāng)每個(gè)成員都具有責(zé)任心的時(shí)候,這樣的團(tuán)隊(duì)行為才更像是一個(gè)商業(yè)行為。總之這種方法有好有壞。
答:有個(gè)方法可以緩解這種情況,就像我剛剛提到的,相對(duì)于一般游戲公司,我們傾向于雇傭更專業(yè)一些的人,這很有用。我們當(dāng)中有很多人都有妻子和兒女,在虛擬工作室里工作讓我們能更容易地照顧我們的孩子。你也能通過(guò)組建更小的團(tuán)隊(duì)來(lái)解決這個(gè)問(wèn)題,10-12個(gè)人的組織會(huì)在虛擬環(huán)境中變得有些模糊,同時(shí)擁有3個(gè)5-8人的團(tuán)隊(duì),每個(gè)團(tuán)隊(duì)擁有自己的確定權(quán),這樣會(huì)更好一些。最后,你必須雇傭優(yōu)秀的制作人,他會(huì)花費(fèi)大量時(shí)間去玩這個(gè)游戲,跟團(tuán)隊(duì)成員討論這個(gè)游戲,并且直接參與游戲開(kāi)發(fā)過(guò)程(是的,這意味著他們要制作關(guān)卡,測(cè)試,優(yōu)化等。所有我們的制作人都會(huì)身兼策劃的角色)。
問(wèn):從我個(gè)人觀點(diǎn)來(lái)看,這種商業(yè)模式其實(shí)是“坐享游戲業(yè)界的成功果實(shí)”,因?yàn)槟銈儧](méi)有培訓(xùn),不能幫助員工提升自己的水平。
答:從某種程度上來(lái)說(shuō)是對(duì)的。但事實(shí)上我們擁有一個(gè)非常強(qiáng)大的實(shí)習(xí)計(jì)劃,并且我本人也是一直教授游戲開(kāi)發(fā)課程的。我本人還是新加坡一些大學(xué)和研究機(jī)構(gòu)的顧問(wèn),所有有機(jī)會(huì)能接觸到一些非常有潛力的對(duì)游戲開(kāi)發(fā)感興趣的學(xué)生。沒(méi)能讓他們加入進(jìn)來(lái)真是可惜。
對(duì)于我的學(xué)生,我們提供他們每周20小時(shí)的兼職打工機(jī)會(huì),直到他們畢業(yè)。事實(shí)上在過(guò)去的兩年中我們有兩個(gè)游戲的策劃是由這樣的內(nèi)部實(shí)習(xí)生來(lái)完成的。
項(xiàng)目要能順利執(zhí)行其實(shí)并不簡(jiǎn)單,如果又渉及多個(gè)單位合作,困難程度又大增。取得PMP或IPMP認(rèn)證,只是證明個(gè)人具備了
項(xiàng)目管理的基本功夫,距離實(shí)際運(yùn)用其實(shí)還有很大的一段距離。
以下是一位項(xiàng)目經(jīng)理的工作日志片段,我們從他的工作日志來(lái)看項(xiàng)目經(jīng)理的工作:
//編者注:(不知啥原因,這段缺少,百度也沒(méi)找到)
以上只是項(xiàng)目經(jīng)理工作的片段,相信每個(gè)項(xiàng)目經(jīng)理應(yīng)該都有自已悲慘的故事,程度恐怕只有過(guò)之而無(wú)不及。項(xiàng)目經(jīng)理到底應(yīng)該有那些看家本領(lǐng)呢?
一個(gè)稱職的項(xiàng)目經(jīng)理應(yīng)該要其備以下的能力:
1. 要易于溝通
筆者在2002年時(shí)曾經(jīng)親自問(wèn)過(guò)美國(guó)的一位項(xiàng)目管理專家-Dr. William Wells(曾任美國(guó)阿波羅登月計(jì)劃的計(jì)劃主持人),問(wèn)他一位項(xiàng)目經(jīng)理最需要具備的功夫是什幺。那時(shí)他的回答是「一位項(xiàng)目管理最需具備的有三件事,第一是溝通,第二是溝通,第三還是溝通」。
請(qǐng)您回想一下,在執(zhí)行項(xiàng)目時(shí),你花費(fèi)最多時(shí)間在什么部份?跟領(lǐng)導(dǎo)報(bào)告工作進(jìn)度、跟客戶介紹產(chǎn)品及說(shuō)明工作成果、跟項(xiàng)目成員交待工作、跟單位內(nèi)的其它人員爭(zhēng)取支持、跟合作廠商協(xié)調(diào)配合事項(xiàng)...對(duì)項(xiàng)目經(jīng)理來(lái)說(shuō),一天內(nèi)大部份的時(shí)間幾乎都是在跟人溝通。
溝通,可以很簡(jiǎn)單,也可以很復(fù)雜。對(duì)于部份人來(lái)說(shuō),反正溝通就是把我的意見(jiàn)表達(dá)出來(lái)嗎,有什么難的。可是在項(xiàng)目過(guò)程中有那幺多的人與項(xiàng)目有關(guān),因此要考量的,不僅是把意見(jiàn)表達(dá)出來(lái)而已,而在于「在什么樣的時(shí)間,運(yùn)用什么樣的方式,將什么樣的信息,傳達(dá)給什么樣的人」。
很多項(xiàng)目經(jīng)理都是屬于「被動(dòng)式的項(xiàng)目經(jīng)理」。就是「你先說(shuō)你要什么項(xiàng)目信息,我想辦法去弄這些信息出來(lái)給你」。因此,信息整理的工作基本上是沒(méi)有列入工作管制的,只能夠見(jiàn)招拆招,抱著應(yīng)付的心態(tài)來(lái)面對(duì)信息的供應(yīng)。
如果換個(gè)比較主動(dòng)的角度來(lái)看,項(xiàng)目經(jīng)理先了解每個(gè)與項(xiàng)目有關(guān)的人想要知道什么,這些信息一定有重復(fù)的地方,然后將這些信息做個(gè)整理歸類,不等你開(kāi)口要,我就先提供給你,讓你對(duì)項(xiàng)目沒(méi)有疑惑,化被動(dòng)為主動(dòng)。這些信息整理歸類的動(dòng)作,直接就納入在項(xiàng)目經(jīng)理的工作管制之中,這樣對(duì)項(xiàng)目經(jīng)理而言,也沒(méi)有任何的「意外」。
講起來(lái)簡(jiǎn)單,做起來(lái)其實(shí)也不難,二個(gè)小時(shí)就可以做好溝通計(jì)劃,幾個(gè)步驟掌握住就好:
(1) 認(rèn)識(shí)項(xiàng)目干系人
(2) 分析項(xiàng)目干系人的信息需求
(3) 依照信息需求找出信息種類
(4) 將信息種類歸類
(5) 決定信息傳遞的周期
(6) 決定信息傳遞方式
(7) 搜集信息
(8) 傳遞信息
(9) 檢討信息傳遞成效
2. 要想的周全
項(xiàng)目經(jīng)理有點(diǎn)像魔術(shù)師。事前先考慮要表演那些魔術(shù),然后將道具準(zhǔn)備好,跟助手、燈光及舞臺(tái)配合,先仿真演練幾遍,指示每個(gè)人互動(dòng)方法,并且事先想到如果發(fā)生問(wèn)題時(shí)如何處置;確認(rèn)都沒(méi)有問(wèn)題后,開(kāi)始表演;表演時(shí)要掌控會(huì)場(chǎng)氣氛,使整個(gè)場(chǎng)子有高潮迭起的感覺(jué);如果環(huán)節(jié)出了問(wèn)題,要馬上能夠應(yīng)變,使節(jié)目能夠繼續(xù)下去,而不是就此停頓;節(jié)目結(jié)束后,感謝每個(gè)人的合作,同時(shí)檢討整個(gè)表演的過(guò)程需要改進(jìn)的地方,如此一段表演才算正式收尾。
項(xiàng)目經(jīng)理的責(zé)任就是掌控全場(chǎng),把這段表演完美無(wú)缺的呈現(xiàn)出來(lái)。不過(guò)太難了,執(zhí)行過(guò)的項(xiàng)目的人都知道,首先客戶的需求不容易了解,其次計(jì)劃時(shí)間不夠,再來(lái)執(zhí)行時(shí)問(wèn)題重重,等到收尾時(shí)只能草草了事。
表演魔術(shù)可以事先演練,找出問(wèn)題先解決,執(zhí)行項(xiàng)目可沒(méi)辦法先來(lái)一遍。因此項(xiàng)目經(jīng)理能不能夠?qū)⑽磥?lái)半年、一年或二年如何執(zhí)行及因應(yīng)先「演」過(guò)一遍,就對(duì)項(xiàng)目的成功有很大影響了。而這就靠項(xiàng)目經(jīng)理做「計(jì)劃」的功夫。做計(jì)劃其實(shí)是很煩人的事,相信每個(gè)人都有經(jīng)驗(yàn)。必須考量有多少時(shí)間、要怎幺做、有誰(shuí)可以做、技術(shù)上是否可以支持、關(guān)鍵技術(shù)是否可以掌握等,做到這個(gè)地步,恐怕早已是滿身大汗。
//編者注:很不錯(cuò)的小方法
做個(gè)小練習(xí):取一張白紙,在紙的上緣首先將要交給客戶的產(chǎn)品以樹狀方式畫出來(lái)。然后在紙的中間,將如何做出這項(xiàng)產(chǎn)品的主要工作步驟(5-6個(gè)即可),以流程圖的方式由左至右用箭頭連起來(lái);需要供貨商供貨或其它單位配合的部份,以分支的方式指向各主要步驟。
上述步驟,就是整個(gè)計(jì)劃的基礎(chǔ)了。由上圖,可以發(fā)展出細(xì)部的工作步驟及時(shí)間、所需的人力資源及預(yù)算需求、采購(gòu)品項(xiàng)及合同商要求等。如何發(fā)展出這些細(xì)節(jié),限于篇幅,爾后再論。
這樣還不夠的。再取一張白紙,將執(zhí)行這些工作步驟所可能產(chǎn)生的問(wèn)題列出來(lái)。這個(gè)是很關(guān)鍵的步驟,列的愈多,將來(lái)臨機(jī)處理的狀況愈少(試想如果項(xiàng)目執(zhí)行過(guò)程中可能發(fā)生100個(gè)問(wèn)題,你能事先考量到99個(gè),你只要去擔(dān)心那突然出現(xiàn)的1個(gè);但如果你只事先考量到1個(gè),那結(jié)果可就不得了了)。這些問(wèn)題,就是你要先期處理,以減少處理意外狀況的時(shí)間。
二張紙,一個(gè)計(jì)劃的框架就成形了。這樣其實(shí)還不足以執(zhí)行項(xiàng)目,但是最起碼項(xiàng)目經(jīng)理先將整個(gè)項(xiàng)目執(zhí)行過(guò)程大概想了一遍(就有如魔術(shù)師先行彩排一樣),同時(shí)也建立一個(gè)以后細(xì)部計(jì)劃的基礎(chǔ)。由以上的練習(xí)來(lái)看,做計(jì)劃并不難,重點(diǎn)在于去不去想,去不去做。
3. 要能夠預(yù)測(cè)結(jié)果
日前一個(gè)朋友赴美,飛機(jī)誤點(diǎn),航空公司沒(méi)有宣布會(huì)擔(dān)誤多久時(shí)間,因此在機(jī)場(chǎng)枯坐了三個(gè)鐘頭。搭乘那班班機(jī)的乘客,有的人需要轉(zhuǎn)機(jī),有的人有親友在目的地機(jī)場(chǎng)接機(jī),有的人初次訪美。此時(shí)在機(jī)場(chǎng)看到每個(gè)人都是焦慮的眼神,焦慮的原因在于他們無(wú)法知道誤點(diǎn)多少時(shí)間,所以沒(méi)有辦法控制之后的行程。你的項(xiàng)目是不是也是如此?
計(jì)劃是「想」,執(zhí)行是「做」。真的去做的時(shí)候,碰到需求、能力、技術(shù)、管理、人力等問(wèn)題,都會(huì)影響到執(zhí)行效果。雖然最后都可以完成,但是如果無(wú)法推測(cè)完成的時(shí)間、成本及產(chǎn)出,項(xiàng)目經(jīng)理就像是那些旅客一樣──彷徨無(wú)助。所以項(xiàng)目經(jīng)理除了要會(huì)做計(jì)劃之外,還要能綜合研判情勢(shì),預(yù)測(cè)項(xiàng)目時(shí)間、成本及產(chǎn)出的結(jié)果。
以一個(gè)一年的項(xiàng)目來(lái)說(shuō),開(kāi)始之后,項(xiàng)目經(jīng)理就負(fù)了成敗責(zé)任,所有的壓力都落在項(xiàng)目經(jīng)理肩上。每天項(xiàng)目經(jīng)理要想的,不應(yīng)該只是誰(shuí)的問(wèn)題要怎幺解決,今天的日子要怎么過(guò),而是一年后的今天,我是否可以將客戶要的東西按時(shí)交付、公司的項(xiàng)目盈余目標(biāo)可以達(dá)成、今天無(wú)法達(dá)成的,剩下的時(shí)間里我應(yīng)該怎么處理才能達(dá)成。所以總的來(lái)看,項(xiàng)目經(jīng)理不僅要做Micro Management(細(xì)節(jié)管理),同時(shí)還要做到Macro Management(總體管理)。而要做到Macro Management最基本的作法就是從全面預(yù)測(cè)項(xiàng)目結(jié)果,并且采取各種因應(yīng)作法。
要如何預(yù)測(cè)結(jié)果?今天工作延誤,明天也會(huì)延誤,后天也照樣會(huì)延誤,以后到底要如何補(bǔ)回來(lái)呢?傳統(tǒng)的項(xiàng)目經(jīng)理在現(xiàn)在這個(gè)時(shí)點(diǎn)是沒(méi)有概念的,結(jié)果是到項(xiàng)目要結(jié)束前才在趕工,到那時(shí)候才發(fā)現(xiàn)所要花的錢早就把利潤(rùn)吃光了。
比較好的作法是今天發(fā)生問(wèn)題了,找出原因,評(píng)估這個(gè)問(wèn)題如何解決。如果一定得增加時(shí)間及人力,那幺假設(shè)今天這個(gè)工作得延長(zhǎng)二周,照著時(shí)程表推下去,所有相關(guān)工作,包含對(duì)人力資源、合同商、成本的影響為何都要找出來(lái);再往下看,推到項(xiàng)目完成期限,是否會(huì)延誤(不是所有工作的延誤都對(duì)項(xiàng)目完成時(shí)間有影響的!);如果有影響,就要思考后續(xù)的工作要如何先期調(diào)整,以適度的調(diào)配資源。要做這些評(píng)估,較簡(jiǎn)單的方式,可能仍得借助項(xiàng)目管理軟件。目前項(xiàng)目管理軟件,不論是國(guó)內(nèi)或國(guó)外的,都能做到計(jì)劃功能,也能夠經(jīng)由計(jì)劃的調(diào)整,去分析對(duì)整體的影響。
項(xiàng)目經(jīng)理的工作其實(shí)是很復(fù)雜。對(duì)于一個(gè)不愿意看全局的項(xiàng)目經(jīng)理,這些步驟全部在不知不覺(jué)中被省去。但是對(duì)于一個(gè)企業(yè)來(lái)說(shuō),由一位沒(méi)有看家本領(lǐng)的項(xiàng)目經(jīng)理來(lái)執(zhí)行重要的項(xiàng)目,公司的時(shí)間、名譽(yù)、獲利及質(zhì)量保證,不僅僅是兒戲。您的項(xiàng)目經(jīng)理有沒(méi)有這些看家本領(lǐng)呢?
大家好,今天亦樂(lè)首次為大家?guī)?lái)flash actionscript轉(zhuǎn)載教程。首先聲明出處(我自己是沒(méi)時(shí)間寫教程啦,要直接找我討論還好)
今天,我也正式宣布,開(kāi)始成為閃客,以往對(duì)macromedia flash的許多頭疼問(wèn)題都被adobe解決了,以往一直否認(rèn)我喜歡做flash,現(xiàn)在總算可以為adobe flash 自豪。非常有系統(tǒng)的developing方式。RIA 平臺(tái), on screen project就不這里說(shuō)了。
這期帶來(lái)的是flash極重要元素之一,event事件。在游戲里就是所謂的Trigger. Adobe改良后的,大家謂稱的“冒泡機(jī)制”。有問(wèn)題歡迎發(fā)問(wèn)指教。
=思路大綱=
- ActionScript 2的問(wèn)題
- AS3解決問(wèn)題
- 結(jié)合問(wèn)題,說(shuō)明“冒泡”
- 冒泡的問(wèn)題所在以及解決方法
1 - ActionScript 2的問(wèn)題
stage里有一個(gè)mc,mc里有一個(gè)btn
點(diǎn)選mc實(shí)現(xiàn)拖動(dòng)mc,鼠標(biāo)松開(kāi)停止拖動(dòng)
點(diǎn)選mc實(shí)現(xiàn)mc隱藏。
最容易想到的方法,代碼如下:
mc.onPress = function() {
this.startDrag();
};
mc.onRelease = function() {
this.stopDrag();
};
mc.btn.onPress = function() {
mc._visible=false
};
表面來(lái)看,這個(gè)思路是正確的。(實(shí)際上沒(méi)什么思路可言,很簡(jiǎn)單的方法。)
實(shí)際怎么樣?當(dāng)然是不能實(shí)現(xiàn)。
問(wèn)題:點(diǎn)擊btn,不能觸發(fā)btn的動(dòng)作!!!!
解釋: 因?yàn)閎tn處于mc內(nèi)部,mc被加上了事件以后,按照as2的事件機(jī)制,mc內(nèi)部的btn甚至是其他的元件都不能接受事件。或者可以認(rèn)為mc的事件覆蓋了mc中其他元件的事件。
從非冒泡機(jī)制來(lái)說(shuō),在btn上點(diǎn)擊鼠標(biāo),首先接受到點(diǎn)擊事件的自然是btn的上一層(也就是mc),然后才是btn元件。Mc先接受到點(diǎn)擊事件,觸發(fā)相關(guān)的函數(shù)。然后呢?我們要實(shí)現(xiàn)的點(diǎn)擊btn的效果沒(méi)了。我們可以認(rèn)為mc把我們的鼠標(biāo)點(diǎn)擊事件據(jù)為私有了,不再往下傳遞。(如果是冒泡機(jī)制的話,這個(gè)動(dòng)作就回繼續(xù)往下傳遞到btn,然后btn會(huì)執(zhí)行。)那么這種效果在as2中還能實(shí)現(xiàn)么?答案自然是肯定的,不過(guò)方法就復(fù)雜了。
這里就不討論了。As3已經(jīng)成為主流。
但是as3中的冒泡機(jī)制,讓我們可以簡(jiǎn)單的解決這樣的難題。
2 - AS3解決問(wèn)題
下面來(lái)看as3中怎么實(shí)現(xiàn)。
代碼如下:
import flash.events.*;
mc.addEventListener(MouseEvent.CLICK,mcfunction);
mc.btn.addEventListener(MouseEvent.CLICK,btnfucntion);
function mcfunction(event:MouseEvent) {
trace("mc click");
}
function btnfucntion(event:MouseEvent) {
trace("btn click");
}
看看代碼就覺(jué)得,好像沒(méi)用什么特別的解決方法,就加兩個(gè)偵聽(tīng)函數(shù),就搞定了。
這個(gè)代碼自然的不能再自然了,就好像做flash 先的安裝軟件一樣。
但是如此自然的代碼下面,使AS3的冒泡機(jī)制在提供支持。
3 - 結(jié)合問(wèn)題,說(shuō)明冒泡機(jī)制:
Help中有一個(gè)冒泡機(jī)制的圖,相信大家都已經(jīng)看過(guò)了
這里我聯(lián)系實(shí)例,另外做一個(gè)圖,幫助各位理解。

上圖為as2中的執(zhí)行原理
下圖為as3中的執(zhí)行原理
上圖也就是在as3中實(shí)現(xiàn)我們文章開(kāi)始提出的例子的工作原理。
下面詳細(xì)描述一下
捕獲階段:
鼠標(biāo)在btn上發(fā)出點(diǎn)擊事件,首先捕捉到該事件的事stage.,然后事件往下傳遞到mc,再到btn..(如果鼠標(biāo)事件發(fā)生在btn按鈕中的一個(gè)label上,那么該事件還會(huì)繼續(xù)向下傳遞,直到找到label元件。)AS2中,一旦找到了可以相應(yīng)事件的函數(shù),就停止了,不會(huì)往下傳遞。這個(gè)道理應(yīng)該說(shuō)明白了
目標(biāo)階段:
找到我們的鼠標(biāo)最底層的目標(biāo),也就是btn以后,那么就開(kāi)始執(zhí)行btn的偵聽(tīng)函數(shù)了。
如果鼠標(biāo)事件發(fā)生的所在位置,是mc中的btn中的一個(gè)label。那么將先執(zhí)行l(wèi)abel的偵聽(tīng)函數(shù)。(當(dāng)然我們的例子中沒(méi)有l(wèi)abel)
冒泡階段:
執(zhí)行了目標(biāo)階段的偵聽(tīng)函數(shù)以后,開(kāi)始冒泡。
換一個(gè)說(shuō)法是,返回btn的父級(jí)元件mc,如果能找到相關(guān)的偵聽(tīng)函數(shù),那么就執(zhí)行,如果沒(méi)有,就繼續(xù)往上冒泡到btn的父級(jí)元件mc的父級(jí)元件stage。看能不能找到相關(guān)的偵聽(tīng)函數(shù)。
注意一個(gè):首先執(zhí)行的函數(shù)一定是目標(biāo)對(duì)象的偵聽(tīng)函數(shù)。就像我們上面的例子一樣,點(diǎn)擊btn會(huì)先trace(“btn click”),然后冒泡到mc,執(zhí)行trace(“mc click”)..然后繼續(xù)往上,如果stage我們也加一個(gè)偵聽(tīng)函數(shù),執(zhí)行語(yǔ)句,那么還會(huì)繼續(xù)執(zhí)行 trace(“stage click”).
到達(dá)stage頂層了,冒泡結(jié)束。
說(shuō)到這里,各位看官也應(yīng)該明白了as3的冒泡究竟是干什么用的了
4 - 冒泡的問(wèn)題所在以及解決方法
冒泡也有問(wèn)題,并不是說(shuō)它有缺陷,因?yàn)槌霈F(xiàn)問(wèn)題無(wú)法避免。
問(wèn)題在于,
假如在上面的例子中,我們不想在點(diǎn)擊btn冒泡階段中執(zhí)行mc的偵聽(tīng)函數(shù),我們只想執(zhí)行btn的偵聽(tīng)函數(shù)。怎么解決?
同樣的問(wèn)題延伸出去,可以得到很多擴(kuò)展和應(yīng)用。
那么我們需要阻止他的冒泡的時(shí)候執(zhí)行相關(guān)的偵聽(tīng)函數(shù)。
Chm中的方法有
stopImmediatePropagation():void
防止對(duì)事件流中當(dāng)前節(jié)點(diǎn)中和所有后續(xù)節(jié)點(diǎn)中的事件偵聽(tīng)器進(jìn)行處理。
stopPropagation():void
防止對(duì)事件流中當(dāng)前節(jié)點(diǎn)的后續(xù)節(jié)點(diǎn)中的所有事件偵聽(tīng)器進(jìn)行處理。
用來(lái)修改我們上面的例子
代碼如下:
import flash.events.*;
mc.addEventListener(MouseEvent.CLICK,mcfunction);
mc.btn.addEventListener(MouseEvent.CLICK,btnfucntion);
function mcfunction(event:MouseEvent) {
trace("mc click");
}
function btnfucntion(event:MouseEvent) {
trace("btn click");
event.stopPropagation();//修改在此處。簡(jiǎn)單一句,解決問(wèn)題
}
現(xiàn)在可以試試,點(diǎn)擊btn運(yùn)行得到的結(jié)果就是
代碼:
btn click說(shuō)明,已經(jīng)防止了冒泡階段中對(duì)mc偵聽(tīng)函數(shù)的處理。也就沒(méi)有trace(“mc click”)了
As3事件機(jī)制遠(yuǎn)遠(yuǎn)不像這里寫的那么簡(jiǎn)單,還有很多東西需要研究。
本文只為拋磚引玉,讓各位能先了解一下冒泡機(jī)制。
希望能多的朋友能提供相關(guān)的學(xué)習(xí)資料
摘要: 什么是反射反射 (Reflection) 是指在程序在運(yùn)行時(shí) (run-time) 獲取類信息的方式. 諸如實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建類實(shí)例, 方法等. 在很語(yǔ)言中都有相關(guān)的的實(shí)現(xiàn), 如 Java 和 c# 等反射有什么用在 as3 與 as2 不同, 類實(shí)例中任何元素, 如變量 (variable), 訪問(wèn)器 (accessor, 即 getter / setter), 方法 (method) 都是不可被 f...
閱讀全文
打麻將必勝絕技(珍藏版,逢賭必贏)(上)
1.147,258規(guī)則:下家丟1萬(wàn),3、4、7萬(wàn)基本不吃,2、5萬(wàn)可能要吃;
2.牌過(guò)半旬,上家開(kāi)始落風(fēng)子,不要碰(碰聽(tīng)張除外);
3.牌局一直不胡,最好不要?jiǎng)优疲蚴鞆垼埔粍?dòng)就有吃大牌的可能;
4.下家丟3、8萬(wàn),有可能手握3、5、6、8萬(wàn),打4、7萬(wàn)要小心一點(diǎn);
5.下家丟8、9萬(wàn),有可能手中還有4、7萬(wàn),打4、7萬(wàn)要小心一點(diǎn);
6.開(kāi)始幾圈,除嵌張、邊張外,兩頭張最好不吃,先上別的張,等上家再拿到這種牌時(shí),他還會(huì)打下來(lái);
7.手中有1萬(wàn)一張,2萬(wàn)一對(duì)這種牌型,別人丟3萬(wàn),如有混(百搭)不要吃(吃聽(tīng)張除外);
8.外面風(fēng)子除東風(fēng)外全都見(jiàn)了,不能打,有可能要杠開(kāi),至少看二圈再打;
9.外面有7萬(wàn)碰掉,8萬(wàn)見(jiàn)二張,9萬(wàn)基本上有人碰;
10.牌開(kāi)始時(shí)先丟蕩張,再丟風(fēng)子,但是手中風(fēng)子不可超過(guò)二張;
11.自己無(wú)混(百搭)聽(tīng)張,比如2、5萬(wàn),上家丟2、5萬(wàn),如果你吃了可聽(tīng)2、5、8,沒(méi)有必要吃;
12.單吊不要吊一張都沒(méi)有見(jiàn)過(guò)的張,最好吊兩頭都碰掉,外面見(jiàn)一張的張子或風(fēng)子;
13.開(kāi)始幾圈,有人丟東風(fēng),手中有東西風(fēng),要先丟西風(fēng),因有可能有人拿西風(fēng)對(duì),別人丟你將被輪出一圈,東風(fēng)你還可能拿對(duì)。
知已知彼戰(zhàn)術(shù)①怎樣猜牌
猜牌有兩個(gè)內(nèi)容:
(一) 進(jìn)攻時(shí):自己所想要上的張,上家有沒(méi)有?肯不肯打?已經(jīng)聽(tīng)張了,人家會(huì)不會(huì)打?是否就打?
(二) 守勢(shì)時(shí):人家要什么牌?人家聽(tīng)什么牌?
取攻勢(shì)是求自己從速上張,盡早和出,以免人家和出,雖攻亦寓守意。
取守勢(shì)時(shí)則力求猜測(cè)準(zhǔn)確,以縮小克牌的范圍,而給自己出路,雖守亦含攻崐。
猜牌有兩種情況:
(一) 初步的:下家大概有哪一路牌。這張牌打出去,大概有人要碰,要吃,或要和。
(二) 鐵定的:這一張牌打出去,一定有人和出,而且一定是某一家和出。
前者是籠統(tǒng)的,可以根據(jù)統(tǒng)計(jì)、觀測(cè)而得到答案;后者則是確定的,決非單憑估計(jì)而可得到答案。
猜牌的根據(jù)是什么呢?
猜牌總是根據(jù)種種現(xiàn)象做出判斷的。在未列舉及分析這些現(xiàn)象之前,得先說(shuō)明一點(diǎn):下列的現(xiàn)象雖然是分別舉出,看來(lái)是個(gè)別的,然而這種種現(xiàn)象實(shí)際上又是互崐相聯(lián)貫的。
下面是據(jù)以猜牌的現(xiàn)象:
(一) 河里的牌
就是四家所打的牌。譬如:白板見(jiàn)了兩張,倘若你手里還有一張白板,決計(jì)沒(méi)有人要,也沒(méi)有人再會(huì)打給你。這個(gè)例子似乎太幼稚了,然而你正可以從這個(gè)例子來(lái)加以推論。如八筒已見(jiàn)三張,九筒見(jiàn)一張,而你手里有七、八筒的六、九筒的搭子,必然極容易吃進(jìn)或和出(倘若已經(jīng)聽(tīng)張的話)。換一個(gè)例子來(lái)說(shuō),河里絕少五、六萬(wàn),則四、七萬(wàn)便是人家容易吃進(jìn)或和出的牌。
不要以為這種現(xiàn)象是顯而易見(jiàn)的,不少入局者正是忽略了這種現(xiàn)象而鑄成錯(cuò)誤的,如以為八筒(以八筒見(jiàn)三為例)是熟張而打八筒,這樣在不覺(jué)中把本人的上好機(jī)會(huì)丟掉了;或是以為一萬(wàn)已見(jiàn)三、四次(以五、六萬(wàn)甚少為例),四萬(wàn)亦屬可打。這是猜牌的初步概念;而成熟的準(zhǔn)確猜牌大多建筑在初步概念上面。
(二) 別家打牌的次序
這一點(diǎn)我們?cè)?#8220;控制下家”一節(jié)內(nèi)已經(jīng)講過(guò),應(yīng)該隨時(shí)記牢別家所打的牌的先后,同時(shí)可以猜想——他為什么先打那一張,后打這一張呢?其中必有道理。
譬如:上家先打二筒,后打四筒。他也許是拆搭子;也許是打二筒時(shí)抓進(jìn)一張五筒,而打四筒時(shí)已抓進(jìn)六筒(因?yàn)橛兴耐惨粚?duì)),或者仍舊留有三、六筒搭子;也許是打二筒時(shí)抓進(jìn)一張六筒,而打四筒時(shí)抓進(jìn)一張七筒。
倘若上家先打四筒,后打二筒。他也許是拆搭子;也許是本來(lái)有一筒一對(duì),所以先打四筒,并不蝕搭,而打二筒時(shí)則希望一筒來(lái)碰,或把一筒一對(duì)做麻將。
任何一張牌都可以研究,任何一張牌都會(huì)提供一種信息,因?yàn)檎l(shuí)都不會(huì)無(wú)緣無(wú)故打牌的。
也許有人會(huì)說(shuō):我就是常常無(wú)緣無(wú)故打牌。不對(duì),你有時(shí)所以隨便打牌,是因?yàn)槭掷锏呐崎e張甚多,而這也是一種信息,也是一個(gè)緣故。
下面再做進(jìn)一步的解釋。
先打二筒,后打四筒是常例:先打四筒,后打二筒是反常。因?yàn)槎草^近幺、九。凡是反常的打法,常常含有明顯的道理。
倘若上家先打四筒,后打二筒,而河里并未見(jiàn)過(guò)一筒,他手里有一筒一對(duì),便更有把握了。倘若能再有其他的現(xiàn)象來(lái)旁證這一點(diǎn),那上家手里有一筒一對(duì)或一坎,便可準(zhǔn)確地加以證實(shí)了。
據(jù)以猜牌的現(xiàn)象彼此都有聯(lián)系,這便是一個(gè)例子。當(dāng)然這還是最簡(jiǎn)單的。
(三) 打牌的姿勢(shì)
如手里是一副大牌,現(xiàn)出一種特殊緊張或過(guò)分仔細(xì)的精神狀態(tài),,象把十三張牌數(shù)一數(shù),每打一張牌都可以考慮;在聽(tīng)張之前一張,故意把牌打得重一些,向桌上拼命一拍;正想吃進(jìn)某一張牌,突被對(duì)家碰去,把拿出一半的牌重新縮回;想碰而不碰……。
這種種動(dòng)作都無(wú)形中告訴你:他手里有幾張什么牌,并且一般都是不會(huì)錯(cuò)的。一個(gè)麻將技巧不熟練的人,幾乎每一副牌都有這一類的表示;而熟練者有時(shí)也難免,你總可從中知道他手里的幾張牌,再?gòu)呐宰C來(lái)加以證明,便可進(jìn)一步知道他手中有什么牌要打,要吃,要和了。
(四) 口中的驚嘆語(yǔ)“啊呀!”或是類似的感嘆詞
這大多是表現(xiàn)出某一張牌給人家碰去了,或抓去了;牌的變化時(shí)常會(huì)使人無(wú)意中說(shuō)出許多話來(lái),而從這些話中可以找到某些線索。 言語(yǔ)及姿態(tài)有時(shí)是故意制造出來(lái)的,然而只要能記牢他所說(shuō)的話和動(dòng)作,與牌和出后他所攤出的牌來(lái)加以對(duì)照,便可知道他的脾氣——是真情的流露還是裝模作崐樣。
打麻將需要應(yīng)用心理學(xué)。倘能看透牌的路數(shù),再加上心理推測(cè),那猜牌的功夫便水到渠成了。
(五) 最后的幾張牌
當(dāng)一家的牌手中有四張的時(shí)候(或者時(shí)間已遲,手中剩七張牌時(shí)),他在抓進(jìn)一張之后,換出一張來(lái),你便可猜到他手中所有的牌。不過(guò)這種猜測(cè),應(yīng)該隨時(shí)把他以往打牌的次序,和他的上家所打的牌加以驗(yàn)證,方可得到正確的答案。否則未必是準(zhǔn)確的。
在各種各樣的牌都打過(guò)之后,所剩余的牌便可一目了然,別人聽(tīng)張的可能配合便有了限制,在這種時(shí)候,你便能尋到一種“有去無(wú)來(lái)”的答案(當(dāng)然也應(yīng)該有旁崐的佐證來(lái)確定)。
上面舉的五種現(xiàn)象,可以作為猜牌的根據(jù),然而最根本的還是在掌握牌的路數(shù)。
(1)很早打中、發(fā)、白,當(dāng)有做平和的企圖。
(2)在打過(guò)二、三、四、五、六、七、八之后,打幺、九,非拆搭,即去衍張。
(3)拆兩頭搭子,不是有做一色的嫌疑,就是大幺對(duì)子很多。
(4)先打一,后打二,緊防三、六。
(5)先打九,后打八,緊防四、七。
(6)開(kāi)大幺對(duì),有好搭。
(7)想吃不吃,必有同樣的牌多張。
(8)想碰不碰,不必防其碰大幺。
(9)麻將頭,不要三、四、六、七。
(10)嵌二、八是上好搭子。
(11)牌將完,需防半熟牌張。
(12)幺、九少見(jiàn),必有對(duì)子。
(13)臨危(指有大牌或?qū)⒆ネ陼r(shí))而打生張,手中必有大牌。
(14)打牌不顧一色,居心不良。
上面所舉的不過(guò)是最容易理解的,如能根據(jù)這些例子再加以融匯貫通,便能摸到猜牌的途徑了。
比如:在打過(guò)中心張子之后,突然又從里面打一張幺九(從原來(lái)的牌打出來(lái),與抓來(lái)就打,分別甚大,打牌時(shí)非注意到此點(diǎn)不可),說(shuō)明“非拆搭,即去衍張”,然而這二者又從何分別呢?
倘若你有五、八索搭子,上家打了一張九索,當(dāng)然可以希望他打一張八索給你,然而他在第二張抓進(jìn)時(shí),換出一張五索來(lái),你便可不必再等候他的八索了,因他決不是拆邊七索或嵌八索的搭子。倘若你能從另外的現(xiàn)象中看出,例如河里不見(jiàn)八索,而七、九索已各見(jiàn)三張,便可認(rèn)定他有八索一對(duì)或一坎;否則他是抓進(jìn)一張六索,換出一張九索的。
又如先打一,后打二,固然要提防他有三、六的搭子;然而也許他是簡(jiǎn)單地拆一個(gè)邊三的搭子,你緊防三、六豈非徒勞了嗎!所以,在應(yīng)用這種路數(shù)時(shí),也得瞻前顧后,才可有比較可靠的答案。
現(xiàn)在,我們要進(jìn)一步來(lái)考慮一個(gè)更難以斷定的因素,以作為猜牌的根據(jù)。
“他是怎樣打牌的?”這實(shí)是一個(gè)最緊要的因素,更透徹一些來(lái)說(shuō),他打牌的路數(shù)是怎樣的?他的麻將技巧水準(zhǔn)如何?他有無(wú)特殊的牌氣?
孫子兵法所謂:“知己知彼,方能克敵”。叉麻將亦應(yīng)應(yīng)用這個(gè)原則。根據(jù)我們的經(jīng)驗(yàn),可把麻將技巧分為上中下三級(jí)。而這三級(jí)是根據(jù)下列現(xiàn)象來(lái)區(qū)分的:
(一)抓進(jìn)六筒不會(huì)換出九筒的 譬如有七、八、九筒一順,抓進(jìn)一張六筒仍打六筒——這類人的麻將技巧僅能管理現(xiàn)成的牌,而換一張打的念頭還不能產(chǎn)生。當(dāng)然,聽(tīng)三交而不聽(tīng),生熟張不甚明了之類的毛病也包括在內(nèi)。 這是下級(jí)。
(二)抓進(jìn)六筒會(huì)打九筒的 同前例,能換打九筒,說(shuō)明已看清九筒是大幺,比較地不易給人家便宜。他已經(jīng)了解生熟張之別,在全副牌的過(guò)程中,可不至于蝕搭。 這是中級(jí)。
(三)抓進(jìn)九筒而換打六筒的 同前例,能這樣打,說(shuō)明水準(zhǔn)更高了,因?yàn)樗ミM(jìn)一張九筒,而知九筒是生張,六筒的危險(xiǎn)倒少,已能解除幺、九熟于中心張子的死限制,這顯然是更進(jìn)一級(jí)的技巧了。他不但能看透生張的分別、而且還會(huì)因時(shí)制宜,隨機(jī)應(yīng)變,已到出神入化的地步了。 這是上級(jí)。
也有人用另外一種現(xiàn)象來(lái)區(qū)分的,即:
下級(jí)——不知聽(tīng)一、四、七而聽(tīng)四、七,比如有二、三、三、四五,抓進(jìn)一張六,不知打三而打六。
中級(jí)——聽(tīng)一、四、七。
上級(jí)——情愿不聽(tīng)一、四、七,而聽(tīng)嵌七。
其理由與前述之例相同。下家者顧自己還顧不周全,中級(jí)者已能顧全自己而尚未臻化境,上級(jí)者則張張見(jiàn)血,知己知彼,能攻能守,靈活應(yīng)用。
在猜牌的因素中,這個(gè)估計(jì)是最根本的;因?yàn)槟闾热魧?duì)每個(gè)入局者的水準(zhǔn)沒(méi)有正確的估計(jì),便會(huì)時(shí)常懷疑自己的猜測(cè)是錯(cuò)誤的,以為他所打的牌出乎意料之外。其實(shí)是你自己想得不夠周到。
譬如:一家有八、九萬(wàn)兩張,抓進(jìn)一張六萬(wàn)時(shí),在中、下級(jí)技巧必打九萬(wàn),而上級(jí)技巧就未必如此,明乎此理,猜牌之術(shù)便屬上乘了。
階段舍牌的策略
在麻將中,舍牌十分重要。摸、吃、碰、杠屬于進(jìn)張,舍牌則是出張,故麻將技巧之高低、競(jìng)技之勝負(fù),舍牌系于一半,甚至不止一半。麻將高手打得“精明”,主要是精在“舍牌”上。
舍牌之重要性在于:
第一、舍牌的安危可以打亂摸牌的順序;
第二、舍牌可決定各家戰(zhàn)術(shù)的運(yùn)用;
第三、舍牌可促進(jìn)他人入聽(tīng)的升級(jí);
第四、舍牌可破壞他人的戰(zhàn)略部署;
第五、舍牌又能牽制他人的牌勢(shì);
第六、舍牌可放銃成全他人食用;
第七、舍牌可迷惑他人,使自己食和;
尤其是打新潮麻將,你舍牌精明,不點(diǎn)炮,既使別人和了88分值的大四喜、大三元,而你也只丟了8分。所以只要舍得精,不點(diǎn)炮或少點(diǎn)炮,再和上幾把高番牌,大概就能穩(wěn)操勝券。
1.初期舍牌走單張
初期舍牌大體上為一至四五巡。起手13張配牌,各家都不同程度地起幾個(gè)長(zhǎng)單張的風(fēng)箭牌、么九牌和中張的蕩張。這個(gè)階段的舍牌順序,一般是:風(fēng)箭牌、么九牌和中張的蕩張牌。
牌戰(zhàn)初期,一般是先舍單張的風(fēng)、箭牌。打字牌的技巧是:先打風(fēng),后打箭。打風(fēng)的次序是:先打客風(fēng),后打圈風(fēng)和本門風(fēng),最后打中、發(fā)、白,也可以把本門風(fēng)放在箭牌的后面打。
如果起手配牌時(shí),風(fēng)箭牌就有八九張之多,且又有三對(duì),就要留下,而奔“字一色”或“大小三元”、“大小四喜”或“全不靠”、“七星不靠”或“混一色”高、中番種去努力。
2.么九牌的去與留
行張時(shí),如無(wú)風(fēng)箭閑張,或已把風(fēng)箭閑張打完情況下,萬(wàn)子、條子和筒子的中張(2至8色點(diǎn))容易抓入靠張,不便先打(但設(shè)計(jì)牌局時(shí),考慮到“清缺”、“混缺”及“缺一門”者除外),一般先把手中的么與九閑張打掉,因?yàn)槊础⒕砰e張各據(jù)首尾,抓靠張的機(jī)會(huì)比中張少一倍,所以在牌桌上,緊接風(fēng)、箭之后,各家多都打么、九閑張。
大凡起牌后,出牌不是風(fēng)箭,也沒(méi)有么九,出手就見(jiàn)中張或邊張,說(shuō)明這家牌局較佳或設(shè)計(jì)十三不靠,其余三家行張時(shí),須多加提防。對(duì)于么九閑張的打法,也并非沒(méi)有先后,常有以下幾種情況:
(l)對(duì)設(shè)計(jì)“清缺”、“混缺”、及“缺一門”的牌家來(lái)說(shuō),應(yīng)首先打掉不需要的門類中的么與九;
(2)在牌局中,現(xiàn)有的牌副、搭子或?qū)ψ佣家灾袕埥M成的,那么設(shè)計(jì)牌局時(shí),必順考慮“斷么”的可能性,無(wú)論哪門的么、九牌,均可打掉;如果牌局中搭子和對(duì)子較多,準(zhǔn)備依靠吃、碰、抓來(lái)組副,考慮留下一張尚未見(jiàn)面的么或九的蕩張作單釣叫牌,成和希望就較大。所以,此種情況的么、九取舍,就要視牌局發(fā)展而定了;
(3)如果牌副里已有l(wèi)、2、3或者7、8、9的順子副,那么,再打么、九閑張時(shí),應(yīng)與設(shè)計(jì)的“一般高”、“姐妹花”作一權(quán)衡,是打是留?先后次序都要統(tǒng)籌考慮;
(4)對(duì)于牌局組成的后期,在原有邊張搭子8、9的基礎(chǔ)上,抓進(jìn)同類牌6時(shí),即應(yīng)打9留6,成6、8嵌搭。小頭也一樣,如在原有邊張搭子l、2基礎(chǔ)上,抓進(jìn)同類牌4時(shí),也應(yīng)打‘么”留個(gè)成2、4嵌搭。
(5)凡屬設(shè)計(jì)十三不靠牌局,除留箭風(fēng)外,對(duì)于萬(wàn)子、條子和筒子,誠(chéng)然保留么、九最佳,中間不靠牌張可擴(kuò)展到4、5或6,進(jìn)張副度拓寬,利于上張成和,誠(chéng)然,這時(shí)的么九閑張,非但不能打掉,仍應(yīng)視為牌張中的上乘了。中張,一旦上張成對(duì),即好牌局中上乘的麻將頭。類似這樣的中張,閑而有用,當(dāng)然在行張中是不會(huì)輕易舍出的。
3.中盤舍牌觀三家
中盤階段是作戰(zhàn)激烈、緊張的階段,一取一舍都關(guān)系到勝敗,所以每舍一張牌都必須真正地把握住安全關(guān),盡量做到所舍的牌讓下家沒(méi)有吃的、讓別家沒(méi)有碰的機(jī)會(huì),更不能讓別家有成和的可能。
麻將實(shí)戰(zhàn)中,牌勢(shì)只要進(jìn)入中盤階段,各家的手牌無(wú)時(shí)不在起變化,摸打一至二巡牌后,以前的熟張?jiān)谶@個(gè)時(shí)候可能已經(jīng)成為生張了,以前認(rèn)為是安全牌,現(xiàn)在很有可能成為危險(xiǎn)牌,此時(shí)若舍出不是被下家吃起,就是被其余的家成和,真是隔巡如生張,舊安變新危。
麻將的舍牌要根據(jù)牌面和牌桌上的變化來(lái)制定對(duì)策及戰(zhàn)略戰(zhàn)術(shù),做到看上家、默下家、盯對(duì)家。
看上家。也就是應(yīng)看明白上家打出什么樣的花色牌,吃起、碰起什么花色的牌。因?yàn)樗浴⑺鲋疲词撬种行枰幕ㄉ淮虺龅呐疲彩悄憧梢猿云稹⑴銎鸬幕ㄉ_@樣,你可判斷出你自己應(yīng)保留什么樣的花色,才有迅速吃、碰牌的機(jī)會(huì)。如果你手中的花色,也是上家想留存、沒(méi)有舍出來(lái)的,自然你就沒(méi)有辦法靠吃碰牌來(lái)迅速組合手中牌陣了。
默下家。與看上家相反,下家正想靠你手中打出的牌來(lái)判斷自己手牌中的去留。若你會(huì)出的牌,多是下家正想吃起的,那他當(dāng)然就會(huì)很快地吃成一副一副的牌攤開(kāi)亮出,并且叫聽(tīng)。故在打牌時(shí),盡量不使下家能吃上自己舍出去的牌,就成了十分重要的思考內(nèi)容。
盯對(duì)家。既看上家、默下家,也必須盯住對(duì)家,這樣三家人需要什么花色的牌,甚至可能需要什么牌點(diǎn)也在你預(yù)料之中,知己知彼,方能百戰(zhàn)百勝。對(duì)于自己,要做什么花色的牌,成什么樣的和對(duì)自己有利,必須考慮周密,這樣才能一舉成功。
4.終盤舍牌防點(diǎn)炮
終盤階段是大家短兵相接、交鋒決斗定勝負(fù)的階段,絲毫不能疏忽大意。進(jìn)人終盤階段,有以下兩種情況:
一是四人中的兩人或一人,依然保持著聽(tīng)牌,窺機(jī)食和。但因牌勢(shì)的發(fā)展趨平,只好強(qiáng)行打牌,應(yīng)酬戰(zhàn)局。其他的各家均以防御為主,最后以少失分而收?qǐng)觥?/p>
二是四人繼續(xù)互相牽制,打出安全牌。事實(shí)上,其中一人或兩人,早已放棄聽(tīng)牌,采取少失分的作戰(zhàn)方案。
凡是牌壇高手的對(duì)陣,這種局勢(shì)并不是少見(jiàn)的,與初手者聚桌娛樂(lè),推倒食和大不相同。設(shè)想,牌桌上有一或兩名低手,欲使戰(zhàn)局發(fā)展到終盤階段,似乎是不可能的。
下面談?wù)剮追N牌的情況處理:
①放炮危險(xiǎn)牌
這里說(shuō)的危險(xiǎn)牌,是指將其放出后使他家成和的絕對(duì)危險(xiǎn)牌。當(dāng)牌局進(jìn)入中盤階段后期,對(duì)于任何舍牌,都充滿著重重危險(xiǎn)。
實(shí)際上,有些牌在眾多場(chǎng)合下,并非危險(xiǎn)牌,但是感覺(jué)上又認(rèn)為不是安全牌,這就是被放炮的KB觀念影響所致。
所以在這期間,每舍一張牌對(duì)旁家來(lái)說(shuō)都不可能是安全牌,那么如何處理這些危險(xiǎn)牌,需要進(jìn)一步地探討。除了絕對(duì)安全牌以外(如字牌東碰出,又摸入第四張),其他牌多少總帶點(diǎn)危險(xiǎn)性。現(xiàn)在就以放炮的危險(xiǎn)牌為焦點(diǎn),觀察該點(diǎn)的變化。
第一:放炮危險(xiǎn)牌是指對(duì)方已經(jīng)聽(tīng)張后所要的牌,一旦出現(xiàn),即可成和。假如現(xiàn)在手中有某張牌,并非直接放炮的危險(xiǎn)牌,但由于這張牌被對(duì)方碰而導(dǎo)致他完成大番的聽(tīng)
張狀態(tài),那么這張牌應(yīng)視為放炮危險(xiǎn)牌。
第二:如能看準(zhǔn)對(duì)方在中盤戰(zhàn)后期的番臺(tái)狀況,那么凡與其番臺(tái)無(wú)關(guān)的種類牌,一大體上可算作安全牌。
第三:放炮危險(xiǎn)有時(shí)可從各家舍牌相的途徑來(lái)推測(cè),切舍種類少的牌,危險(xiǎn)性大,尤其是生張牌,放炮危險(xiǎn)性更大。
第四:自己手牌中的暗坎和該同一線上的牌,是放炮的危險(xiǎn)牌。例如手牌中有暗坎3條3張和6條1張,當(dāng)桌面上一直沒(méi)有出現(xiàn)這樣的牌時(shí),就可能有人聽(tīng)張的叫牌是3、6條,而他和牌的叫牌張數(shù)有二分之一把握在你的手中,這樣就能極大程度地阻止他獲勝。
②高度危險(xiǎn)牌的舍法
知道是放炮牌,誰(shuí)也不會(huì)往外打。但是,如遇懷疑性的高度危險(xiǎn)牌,就要看舍牌者的膽量和到底對(duì)該局牌的勝負(fù)抱什么樣的期望而定了。自中盤階段后期到終盤階段,如自己的手牌沒(méi)有可能構(gòu)成多番牌姿,而對(duì)方的手牌頗有多番形態(tài)的預(yù)兆時(shí),最好死了心不和,不打危險(xiǎn)牌,甚至拆掉面子安全牌,以度過(guò)最后一兩巡的摸牌難關(guān),直到黃牌。
③放炮牌的處理方法
第一:編入組合面子。牌局到了終盤期,既然放炮牌不能打,也不能孤單單地留在手牌里,妨礙自己和牌。這樣,最好將放炮危險(xiǎn)牌編到手牌牌面中去,這是最安全而且是最有利的戰(zhàn)法。因?yàn)檫@樣一來(lái),這張放炮危險(xiǎn)牌的左右聯(lián)絡(luò)牌也都打上了保險(xiǎn)系數(shù),均不會(huì)輕易舍出,使危險(xiǎn)性大大減少。
第二:立即退出勝負(fù)圈。麻將牌競(jìng)技中,能當(dāng)機(jī)立斷地退出勝負(fù)圈的做法,是極為明智的。尤其是多門聽(tīng)牌的牌姿,明知摸入危險(xiǎn)牌,但惟恐?jǐn)_亂了成形的牌勢(shì),卻執(zhí)意舍出,奢望僥幸過(guò)關(guān)。殊不知這樣戰(zhàn)法將會(huì)勝敗立見(jiàn),決無(wú)放炮與過(guò)關(guān)的五五開(kāi)之說(shuō)。
第三:沒(méi)有安全牌的困惑。在形形色色的牌姿中,常出現(xiàn)有人覺(jué)得手牌中沒(méi)有安全牌可打的窘迫感。誠(chéng)然,這是人為造成的,大體上可分為兩種類型:其一,手牌中顯露的朋組過(guò)多,饑不擇食地見(jiàn)吃就吃、得碰便碰,既無(wú)算計(jì),又不顧及戰(zhàn)略,結(jié)果手牌相對(duì)減少,周旋余地縮小了,調(diào)整面也窄了。手頭僅有幾張牌,即出現(xiàn)沒(méi)有安全牌可打的情況,以致給自己帶來(lái)很大的困惑,甚至有放炮的危險(xiǎn)。其二,雖然呈現(xiàn)未吃未碰的門前清狀況,但一手13張牌仍覺(jué)得沒(méi)有安全牌可打,這其實(shí)是恐懼心理。
照常規(guī)戰(zhàn)法,手牌中沒(méi)有安全牌的說(shuō)法是不切實(shí)際的。以三家對(duì)手均已聽(tīng)牌而言,每家通常是兩門聽(tīng),也就是說(shuō)三家合計(jì)叫聽(tīng)六種待牌而已。這對(duì)門前清的13張手牌來(lái)說(shuō),至少手頭上還有一半以上的牌是安全牌。即使手牌少的人,也不見(jiàn)得張張與他人叫聽(tīng)的待牌分毫不差。問(wèn)題在于是否愿意舍聽(tīng)而后退一步,是否懂得計(jì)算舍牌相。所以,打出一張牌是不是安全,須憑技術(shù)高低去審定。
打麻將必勝絕技(珍藏版,逢賭必贏)(下)
麻將理牌的實(shí)例剖析
①?zèng)]有聽(tīng)張希望的牌姿:
例1:中、白、發(fā)、東、南,l、2、6、9筒,6、8條,8、9萬(wàn)。
顯然,這鋪牌里有5個(gè)單張字牌和3張老頭牌(么九頭),無(wú)法形成九種么九牌的倒牌。這種牌,可說(shuō)是相當(dāng)惡劣的手牌了。盡管其中尚有3組可構(gòu)成面子牌張,但畢竟是機(jī)遇不佳的邊搭l、2筒和8、9萬(wàn)與嵌搭6、8條。根據(jù)牌譜中所謂“起首三張單風(fēng)箭,兵牌必難求聽(tīng)和”之訓(xùn),這種牌即使每巡進(jìn)張,也是距聽(tīng)張食和相當(dāng)遙遠(yuǎn)的,大可不必認(rèn)真組牌,勢(shì)必作好不和的思想準(zhǔn)備。
所以在舍牌時(shí),應(yīng)視海牌而定,客風(fēng)輕易不能拋出,三無(wú)牌也需慎重,否則將會(huì)加大別家的番和。待到別家打出之后,再追打熟張不遲,首先舍出的當(dāng)然是老頭牌了。
在這種惡劣牌勢(shì)的情況下,除追打熟張牌外,應(yīng)留神對(duì)手中的某一家,估計(jì)和牌平平,即可盡量供牌,促其早成早和,少失番分。
例2:中、發(fā)、東、北,2、5、9、9條,4、5、9筒,2、4萬(wàn)。
這種牌勢(shì)雖勝于上例,風(fēng)箭少了一張,對(duì)子、搭子加嵌搭,單張中張牌5條兩頭尚有牌張,聯(lián)絡(luò)價(jià)值更大,但是距離聽(tīng)張仍然差得很遠(yuǎn)。如強(qiáng)行奢望和牌,必失大誤。
例3:發(fā)發(fā)、西、白,1、5、9筒,1、2、4、8條,4、5萬(wàn)。
四張字牌之內(nèi),只有綠發(fā)對(duì)子為一要素。雖然1、2、4條為復(fù)合面子,但待牌只有3條一種,決非有利形勢(shì)。4、5萬(wàn)與中張牌5筒給整個(gè)牌鋪帶來(lái)一線希望,惟獨(dú)缺少麻將頭。
倘若依靠模入一張將頭牌的話,至少也須換5到6次以上,這么遙遠(yuǎn)的行程,恐怕不及來(lái)張時(shí),早已敗北。故而戰(zhàn)略上與例2相同,照例1打法,多是有益無(wú)損的。
②接近聽(tīng)牌的“未知數(shù)”:
例4:中中、白,1、4、5、8筒,3、6條,1、2、7、9萬(wàn)。
此例的紅中對(duì)子系一要素,加上4、5筒子,1、2萬(wàn)邊搭以及7、9萬(wàn)嵌搭,合為面子牌的4個(gè)要素。倘若3與6條中的一張牌與摸進(jìn)的任何一張中張條子再組成一個(gè)面子的話,即有了
5個(gè)要素,從而具備了聽(tīng)牌資格。
牌譜中有句話:“副副求和,敗可立見(jiàn)”,說(shuō)明求和心切者,往往極易他人放銃。因此,每當(dāng)使用本例牌促成叫聽(tīng)之后,必須居安思危,不要抱太大希望。待你手牌理順之際,殊不
知?jiǎng)e人已早“磨刀霍霍”,準(zhǔn)備食和了。
例5:東、南南、西,1、2、3、6筒,2、3條,1、7、9萬(wàn)。
這里已有現(xiàn)成的4個(gè)要素,即門風(fēng)對(duì)子一組,123筒一副,2、3條搭子與7、9萬(wàn)嵌搭,當(dāng)然如能摸進(jìn)一張與中張6筒相聯(lián)絡(luò)的牌,牌面即可重現(xiàn)生機(jī)了。
對(duì)于上述要素,一旦吃碰形成面子牌朋組時(shí),就須在理牌時(shí)小心斟酌了。雖說(shuō)單張的東、南兩風(fēng)屬客風(fēng)牌,本可舍棄。但是,對(duì)于本例實(shí)戰(zhàn)情況來(lái)看,有時(shí)留下一張風(fēng)牌(自然是“海”內(nèi)尸牌未見(jiàn)或只見(jiàn)一張的),作單釣叫牌,對(duì)和牌極為有利。
例6:白白、南,1、2條,3、4萬(wàn),1、222、6、8筒。
乍看,這副牌比較整潔,有白板一對(duì),1、2條邊搭,2、4萬(wàn)嵌搭,6、8筒嵌搭,以及1、222筒的復(fù)合面子共5個(gè)要素。但是,這種牌的潛在性危機(jī)極大,無(wú)論邊搭、嵌搭與復(fù)合面子,可待牌全部是3與7的尖張牌,這些尖張牌對(duì)于高手而言,極難舍出,單純依靠吃進(jìn)組成朋組的機(jī)會(huì)是極少,尚余的一半機(jī)會(huì)只能靠自己摸進(jìn)了。假如平均每摸3手可得一張的話,起碼也需12巡摸牌才行。
例7:東、西,1、2、3、77萬(wàn),2、5、8條,3、7、9筒
這副牌反而比上例牌有利。盡管單張牌較多,但極易得手上張,這是老麻將們堅(jiān)信不移的。字牌雖有兩張,且為客風(fēng)牌,即便打出也無(wú)大礙。這里,7萬(wàn)對(duì)子為將頭,123萬(wàn)一副,7、9筒為嵌搭,雖說(shuō)只有3個(gè)要素,但上張極快。其中萬(wàn)子與筒子任意進(jìn)牌,都能組成復(fù)合面子,決不成蕩張。對(duì)條子來(lái)說(shuō),首先應(yīng)打掉中張5條(這是許多人所不愿的),從戰(zhàn)術(shù)上看,舍出5條后,尚有2與8條兩張,除摸進(jìn)倒運(yùn)的5條外,無(wú)論進(jìn)什麼張了,都能組成一對(duì)要素,這是高手們非常明白的。
所以說(shuō),倘若打的順的話,最快只需5手(摸5次牌)便可叫聽(tīng)了。
③具有成和把握的牌姿:
例8:東東,2、7、8筒,3、5、7、8條,1、3、4、6萬(wàn)。
這副牌本身已經(jīng)有5組要素,除單張牌為2筒外,可將復(fù)合面子中的1、6萬(wàn)視為單張牌對(duì)待。
首先,舍牌是2筒無(wú)疑了。萬(wàn)一上張牌出現(xiàn)嵌2萬(wàn)或嵌5萬(wàn)時(shí),就可拆掉3、5條嵌搭。反之,出現(xiàn)嵌4條的話,首先應(yīng)打出6萬(wàn)。因?yàn)?萬(wàn)中張的危險(xiǎn)性大于老頭牌1萬(wàn),在旁家尚未上手之前舍掉,可避免放銃。一旦叫聽(tīng)叫和時(shí),再打1萬(wàn),也不致失誤。
例9:南、發(fā)發(fā),3、5、6、8筒,5、6條,11、3、4萬(wàn)。
這也是5個(gè)要素齊備的牌。除單張南風(fēng)牌外,復(fù)合面子的3、8筒,也可視為可舍的單張牌。
如果進(jìn)張南風(fēng)對(duì)或任意一張筒子時(shí),舍牌就應(yīng)仔細(xì)了。當(dāng)然,首先上筒子牌,即將南風(fēng)打出,倘若再進(jìn)筒子,應(yīng)考慮舍掉4萬(wàn)較為合適,從而保留1、1、3萬(wàn)的復(fù)合面子。
不過(guò),從一般玩牌者的習(xí)慣來(lái)看,不少人寧可拆筒子,說(shuō)什麼也不原打4萬(wàn)。這種舍近求遠(yuǎn)的打法,仍屬下策。不難看出,這副牌的綠發(fā)對(duì)容易碰出,決不會(huì)留在手頭作將用,那麼唯一的將頭只有1萬(wàn)了。只要進(jìn)張筒子,拆舍3、4萬(wàn)搭子就比較合理。誠(chéng)然,對(duì)于5、6條搭子而言,因?yàn)榧儗僦行膹堊樱坏┎鹕岢鋈ィ瑯O易被旁家吃進(jìn),所以不如不舍為妙。
例10:西,5、6筒,2、3、666條,2、3、4、6、7萬(wàn)。
這是極佳的面子牌。無(wú)論是起手配牌或是兩三手后的面子牌,只要吃牌或上張,都不應(yīng)留兩個(gè)搭子去尋求將頭。從實(shí)戰(zhàn)戰(zhàn)況看,應(yīng)毫不猶豫地將刻子6條舍去一張,既能保留將頭,又構(gòu)成了平和。此系上策保和無(wú)疑。相反,如果舍不得6條刻子,很可能會(huì)坐失良機(jī),這就是牌譜的勝?zèng)Q所在。
例11:南南、西西,88條,3、4筒,1、2、3、4、5萬(wàn)。
此例有3組對(duì)子,以要素而言合計(jì)6組,故此多余一組要素,在這種情況下,勢(shì)必要拆舍一組。誠(chéng)然,兩對(duì)風(fēng)牌較易碰出,所以當(dāng)有人打出其中一張字牌時(shí),不必急于去碰,反而就以該門風(fēng)對(duì)作為拆打?qū)ο螅员銧恐葡录摇?/p>
對(duì)于8條來(lái)說(shuō),最佳是進(jìn)張7條,打出8條,形成搭子牌面,使?jié)M鋪牌構(gòu)成較好的和平局面。如果牌桌正好遇上南風(fēng)圈,自己又坐于第三家,那麼兩對(duì)風(fēng)子全應(yīng)碰出,而拆舍3、4筒。倘使兩個(gè)搭子均先吃牌,就應(yīng)拆舍8條對(duì)子,以兩對(duì)風(fēng)子作為雙風(fēng)子作雙碰聽(tīng)和了。
祝大家逢賭必贏!
“開(kāi)會(huì)”,在現(xiàn)在的商業(yè)運(yùn)轉(zhuǎn)中,這兩個(gè)字的名聲非常不好,因?yàn)檎嬲芡ㄟ^(guò)會(huì)議這個(gè)形式取得什么成果的很少。我記得Dilbert(美國(guó)漫畫家)曾經(jīng)有一幅漫畫這樣畫的:幾個(gè)人圍著桌子坐著,會(huì)議組織者說(shuō)“今天會(huì)議沒(méi)什么特別的議程。像往常一樣,我們就就抱怨下、做些沒(méi)什么干系的發(fā)言就好了”。
現(xiàn)在會(huì)議基本上就是這樣的,大部分的會(huì)議都是無(wú)序的、沒(méi)有激情的、沒(méi)有效率的。但我們的會(huì)議是可以開(kāi)的更好的。
當(dāng)我決定寫一篇關(guān)于如何開(kāi)展有效會(huì)議的文章,我找到了Marissa Mayer (Google搜索產(chǎn)品的副總裁,see BusinessWeek.com, 6/19/06, “Marissa Mayer: The Talent Scout”),在我所認(rèn)知的人中,她在會(huì)議方面有著最豐富的知識(shí),并且她領(lǐng)導(dǎo)創(chuàng)造了當(dāng)今一些最有創(chuàng)新意義的產(chǎn)品,這也讓我為她在會(huì)議組織方面的才能上加了不少分。
Mayer平均每周開(kāi)差不多70個(gè)會(huì)議(SweetRiver譯注:會(huì)霸…囧rz…),并且作為最后一道關(guān)卡來(lái)把關(guān)Google工程師、項(xiàng)目經(jīng)理向Google創(chuàng)始人Sergey Brin和Larry Page來(lái)陳述、推銷他們的想法的機(jī)會(huì)。一共有8個(gè)由directors, managers和engineers組成的團(tuán)隊(duì)在產(chǎn)品開(kāi)發(fā)的各個(gè)階段,向Mayer匯報(bào)。
在Google這樣的公司里,大部分的工作都在會(huì)議中開(kāi)展,Mayer的目標(biāo)就是確保她的團(tuán)隊(duì)有明確的工作指令、戰(zhàn)略方向以及有足夠支撐行動(dòng)的信息,并且同時(shí)讓他們感覺(jué)有前進(jìn)的動(dòng)力并受到了尊重。Mayer她成功開(kāi)展高效會(huì)議的6個(gè)秘訣就是:
1. 有一個(gè)明確的議程
Mayer要求每個(gè)會(huì)議都必須有明確的議程,內(nèi)容包括參會(huì)者希望討論的問(wèn)題的大綱以及他們將如何最有效地利用自己的時(shí)間。當(dāng)然,議程需要有一定的靈活性,Mayer覺(jué)得議程更多地扮演這樣一個(gè)角色的工具:議程迫使參會(huì)者仔細(xì)思考自己希望在會(huì)議上所達(dá)到什么目標(biāo)以及如何最好地去達(dá)成這樣的目的。
2. 指定專門的note-taker(SweetRiver注:和我們一般概念上的“會(huì)議記錄員”還不一樣)
Google的會(huì)議一大特色就是有很多的投影…..。一面墻上投影現(xiàn)在的presentation,旁邊會(huì)再有一個(gè)投影儀展示當(dāng)前會(huì)議的記要(SweetRiver注:原文想要表達(dá)的意思應(yīng)該是不僅要找一個(gè)專門的會(huì)議記錄員,還要專門的投影實(shí)時(shí)地展示當(dāng)前會(huì)議的記要,以確保參會(huì)人員能在會(huì)議上達(dá)成真正的一致),可能旁邊還會(huì)有一個(gè)投影顯示著一個(gè)4英尺高的在走的計(jì)時(shí)器!!Google高管們相信,通過(guò)制作一份官方的記要,可以最大程度地馬上消除不準(zhǔn)確性和不一致性。
那些沒(méi)能參加會(huì)議的人會(huì)收到一份會(huì)議的記要。當(dāng)有人試著回想會(huì)議的決定、團(tuán)隊(duì)前進(jìn)的方向、接下來(lái)需要做什么工作,他們可以有這樣的標(biāo)準(zhǔn)官方記要參考。
3. 鉆小會(huì)(Carve out micro-meeting)
Mayer留了大量的小塊時(shí)間段去參加那些有特定議題或者關(guān)于特定項(xiàng)目的小會(huì)。比如,在她與創(chuàng)始人兼CEO – Eric Schmidt的每周2小時(shí)的會(huì)議中,她會(huì)抽出5-10分鐘間隔(或者更長(zhǎng),這根據(jù)主題而定),去參加那些特定領(lǐng)域的會(huì)議,如關(guān)于站點(diǎn)表現(xiàn)的周例會(huì)、新產(chǎn)品發(fā)布等等。
如果有什么緊急情況發(fā)生,這種方式給了Mayer足夠在會(huì)議前調(diào)整議程的靈活性。這也慢慢讓會(huì)議變得更有重點(diǎn)。Mayer對(duì)她的團(tuán)隊(duì)成員也是采取同樣的策略,更多是5-10分鐘的短交流(她的行程安排所允許的最短時(shí)間段),而不是30分鐘的促膝長(zhǎng)談。通過(guò)這樣地在一個(gè)大塊時(shí)間段鉆出時(shí)間參加小會(huì),她可以收獲更多。
Mayer有著engineering和computer science方面的背景經(jīng)驗(yàn),自嘲地稱這些micro-meetings是“降低流水線上的延遲” (reducing latency in the pipeline)。這就是說(shuō),如果她的一個(gè)員工想跟她討論一個(gè)問(wèn)題,這位員工可以在Mayer的某一個(gè)大的時(shí)間塊上跟她預(yù)約一個(gè)10分鐘的micro-meeting,而不是等她下一個(gè)空閑的30分鐘,——這30分鐘可能2個(gè)星期都等不到。
4. Hold office hours.
SweetRiver譯注:Hold office hours的意思可以看下Harvard Business Review的這篇文章。其實(shí)就是類似“答疑時(shí)間”的這樣一個(gè)概念,即某人固定時(shí)間待在office里,保證你在這段時(shí)間的時(shí)候能找到他,跟他交流。這樣的“答疑時(shí)間”可以讓你更加親近您的員工、更加了解公司內(nèi)的事情、更加有機(jī)會(huì)聽(tīng)取意見(jiàn)和新的idea、更加有效的處理來(lái)自下層的一些問(wèn)題,特別讓你不會(huì)變成那種永遠(yuǎn)看不到的untouchable的神人一樣。我沒(méi)有想出比較好的中文詞組來(lái)表達(dá)這個(gè)意思,所以下面都會(huì)保留英文。
Mayer的這條秘訣來(lái)自她在Stanford做computer science教師的經(jīng)驗(yàn),她也是在Stanford遇到了Google的兩位創(chuàng)始人。Mayer的office hour每天下午4點(diǎn)開(kāi)始,每次一個(gè)半小時(shí)。
員工將他們的名字寫在她office外面的一塊白板上,然后她按照先進(jìn)先出的方式對(duì)隊(duì)列進(jìn)行處理。有時(shí)候是PM需要她在一次市場(chǎng)活動(dòng)上的認(rèn)同,有時(shí)候是一些員工想向她sell(推銷)自己的一個(gè)想法或者設(shè)計(jì) (see BusinessWeek.com, 6/30/06, “Inside Google’s New-Product Process”).
Mayer說(shuō): “我們很多有意思的產(chǎn)品都是在這個(gè)office hour里搗鼓出來(lái)的,Google News, Orkut [Google's social networking site](SweetRiver譯注:這里作者居然給Orkut加了一個(gè)英文注釋,看來(lái)Orkut是比較痿,囧~~), Google Reviews, and Google Desktop這些產(chǎn)品的idea都是首先在這種office hour里出現(xiàn)的”。在這短短的一一個(gè)半小時(shí)的office hour的時(shí)間中,Mayer可以開(kāi)多達(dá)15個(gè)會(huì)議,平均每個(gè)人7分鐘的時(shí)間…….
5. 要數(shù)據(jù),不要政治 (Discourage politics, use data)
Mayer曾經(jīng)談到的“9個(gè)關(guān)于創(chuàng)新的意見(jiàn)”(”Nine Notions of Innovation”)中的一條就是“要數(shù)據(jù),不要政治”(see BusinessWeek.com, 6/19/06, “9 Notions of Innovation”).
一個(gè)公司里,如果老板會(huì)根據(jù)他對(duì)人的喜好而不是他對(duì)產(chǎn)品和設(shè)計(jì)的客觀想法來(lái)做決定,如果參加會(huì)議的人都會(huì)覺(jué)得老板會(huì)給他所喜歡的人所作的設(shè)計(jì)開(kāi)綠燈時(shí),那這條意見(jiàn)就非常有必要了。
Mayer相信這樣的價(jià)值傾向會(huì)讓員工士氣低落,所以她把審批流程(approval process)變成了科學(xué)。Google會(huì)根據(jù)一些明確的度量指標(biāo)來(lái)選擇好的設(shè)計(jì)。選擇是基于價(jià)值以及事實(shí),而不是個(gè)人關(guān)系 (Designs are chosen based on merit and evidence, not personal relationships)。
Mayer不希望在設(shè)計(jì)會(huì)議上聽(tīng)到類似“I like”這樣的句子,譬如“I like the way the screen looks”。而她會(huì)鼓勵(lì)類似“he experimentation on the site shows that his design performed 10% better”這樣的言論。Google是建立在客戶反饋數(shù)據(jù)驅(qū)動(dòng)的企業(yè)文化上,而不是建立在內(nèi)部政治上(現(xiàn)在很多的企業(yè)都是),所以對(duì)于Google來(lái)說(shuō),“要數(shù)據(jù)、不要政治” works。
6. Stick to the clock.
為了給會(huì)議增加點(diǎn)壓力以保持參會(huì)人員的注意力,Google的集會(huì)一般都會(huì)非常特色地在墻上都投影一個(gè)巨大的計(jì)時(shí)器,給特定的會(huì)議或者議題做倒計(jì)時(shí)…..。這真的真的就是一個(gè)網(wǎng)上可以下載的timer,跑在PC上,然后投影到4英尺大小。
想想當(dāng)從會(huì)議室外面來(lái)看里面的情況,那一定非常瘋狂:墻上同時(shí)投影著若干的影像:presentation, transcription(參第2條), 然后還有一個(gè)mega-timer!不過(guò),在Google,it makes sense,在創(chuàng)造性的混亂中引入結(jié)構(gòu)!!通過(guò)這個(gè)Timer給會(huì)議帶來(lái)的輕微的壓力感使會(huì)議保持on schedule。
Mayer同時(shí)對(duì)這個(gè)timer也有一個(gè)忠告:對(duì)timer保持健康的幽默感。(同時(shí),我對(duì)Mayer的采訪的timer也快到到時(shí)間了,但是Mayer讓timer變成了一個(gè)有趣、友善的提醒物,而不是對(duì)我們談話的粗魯打斷。)
請(qǐng)記住,這些會(huì)議技巧在Google里用的很好。雖然可能并不適用你們公司,但這六個(gè)秘訣應(yīng)該可以給你一點(diǎn)如何讓會(huì)議不浪費(fèi)時(shí)間、更加有效的良好的啟示。
一、寫這個(gè)文章的起因:
經(jīng)常遇到很多人想學(xué)習(xí)Flash,但是不知道從何學(xué)起,有的朋友甚至對(duì)于學(xué)會(huì)了Flash,能做些什么也很疑惑。
本人結(jié)合若干年Flash學(xué)習(xí)研究經(jīng)驗(yàn),給想學(xué)習(xí)Flash的朋友一些建議,也歡迎大家訪問(wèn)我的空間,http://hi.baidu.com/billypc給我留言。如轉(zhuǎn)載本文,希望多多宣傳本空間,謝謝。
一般來(lái)說(shuō),F(xiàn)lash的學(xué)習(xí)主要有兩個(gè)方向,一是專攻Flash動(dòng)畫,一是專攻Flash編程,當(dāng)然也有動(dòng)畫和編程都學(xué)習(xí)的很到位的人,那是牛人。不過(guò)這里我主要分析一下Flash的這兩種方向如何開(kāi)始學(xué)習(xí),如何快速掌握。
二、FAQs
問(wèn):學(xué)習(xí)flash做動(dòng)畫需不需要美術(shù)基礎(chǔ)啊?
答:
首先,要說(shuō)明的是,F(xiàn)lash動(dòng)畫也分為幾種。
最重要的應(yīng)用就是做動(dòng)畫片,比如早期的ShowGood三國(guó),小小,現(xiàn)在的小破孩系列,開(kāi)心驛站系列,燕尾蝶等。這些都是動(dòng)畫片制作,這一類的flash需要有很好的美術(shù)功底,需要有諸如手繪,視覺(jué)感,鏡頭感等相關(guān)的專業(yè)知識(shí)。這一類的動(dòng)畫制作基本上需要美術(shù)和動(dòng)畫的專業(yè)知識(shí)。而Flash只是作為一個(gè)動(dòng)畫制作的工具而已,一個(gè)動(dòng)畫片在從開(kāi)始到結(jié)束,更多的需要的是美術(shù)及動(dòng)畫方面的專業(yè)知識(shí)。
另一類應(yīng)用是Flash廣告和Flash特效,這一類Flash大量應(yīng)用于網(wǎng)絡(luò),從網(wǎng)站主頁(yè)Flash動(dòng)畫,到網(wǎng)站內(nèi)部的一些廣告,一些吸引眼球的效果,都屬于這一類應(yīng)用。一般學(xué)習(xí)Flash的人,基本上都在做這樣的東西。包括一些初學(xué)者在內(nèi),都認(rèn)為這就是Flash,其實(shí)這只是Flash最簡(jiǎn)單的應(yīng)用。制作這一類的Flash一般需要一些創(chuàng)意,有一定的視覺(jué)感,有美術(shù)基礎(chǔ)的人會(huì)更加得心應(yīng)手。有時(shí)候會(huì)需要掌握一些基礎(chǔ)的flash as,比如制作flash菜單,flash跳轉(zhuǎn)效果等。
Flash在動(dòng)畫的制作過(guò)程中,主要扮演的是工具的角色,是目前動(dòng)畫制作中效率比較高的工具之一,而一個(gè)好的動(dòng)畫,并不依賴于你用什么工具,而依賴于你的專業(yè)程度。專業(yè)知識(shí)越扎實(shí),創(chuàng)意越新穎,做出的動(dòng)畫就越好。而工具的學(xué)習(xí)僅僅是第一步。
問(wèn):我也不知道應(yīng)該學(xué)習(xí)哪個(gè)方向,動(dòng)畫和編程哪個(gè)好學(xué)啊?
答:
學(xué)做動(dòng)畫,和學(xué)做編程,這樣兩個(gè)方向,其實(shí)不僅僅是做什么的不同,也是思維方式的不同。
一般來(lái)說(shuō),做動(dòng)畫受視覺(jué)因素影響,而編程主要受邏輯思維影響。從很寬泛的角度上來(lái)說(shuō),學(xué)動(dòng)畫,就是學(xué)感覺(jué),學(xué)新思維。而學(xué)編程,就是學(xué)邏輯,學(xué)思維方式。美學(xué)不僅僅是能感覺(jué)到,還是一種創(chuàng)意思維,是感性的。而程序邏輯則完全是一種逆向思維,是理性的。
一般情況下,邏輯思維可以通過(guò)培訓(xùn)等,在短時(shí)間內(nèi)鍛煉出來(lái),所以編程應(yīng)該來(lái)說(shuō)是人人都能學(xué)會(huì)的,而且是可以通過(guò)死記硬背在短時(shí)間內(nèi)速成的。
而感性思維,或者說(shuō)創(chuàng)造性思維,是很難一下子就養(yǎng)成的,就像我們學(xué)畫畫,沒(méi)有個(gè)一年半載,根本畫不出什么好的東西,而且很多畫畫好的都是從小開(kāi)始培養(yǎng)的。所以學(xué)動(dòng)畫短時(shí)間內(nèi)很難有一些突破,僅僅只能停留在一個(gè)較低的層面上,這也就是為什么很多人只會(huì)做flash廣告,而做不了大于3分鐘的動(dòng)畫,或者說(shuō)做不出高質(zhì)量的動(dòng)畫的原因了。
但是從入門的角度上來(lái)看,會(huì)用flash的人,一般都能從事簡(jiǎn)單flash動(dòng)畫的制作,其實(shí)這主要是依靠了FLASH這款工具的強(qiáng)大,并非代表著做動(dòng)畫很簡(jiǎn)單,或者你很聰明,一下子就學(xué)會(huì)了,入門也許很簡(jiǎn)單,但是越想提高一個(gè)層次就越困難,比如學(xué)會(huì)FLASH沒(méi)多久,就會(huì)做flash主頁(yè),flash廣告等,那是因?yàn)檫@個(gè)沒(méi)有什么難度,所以綜合看來(lái),我認(rèn)為,如果想在短時(shí)間內(nèi),從事flash工作的話,可以先掌握f(shuō)lash的應(yīng)用,能制作簡(jiǎn)單flash動(dòng)畫,然后學(xué)習(xí)編程,短期內(nèi)會(huì)很有效果。從長(zhǎng)期來(lái)看,學(xué)習(xí)一些美術(shù)基礎(chǔ),對(duì)做動(dòng)畫會(huì)大有幫助。
問(wèn):我最近想去學(xué)flash制作,在網(wǎng)上找了找,發(fā)現(xiàn)有很多制作軟件,如flash MX,flash MX2004和flash cs3 Pro,哪款比較好啊?
答:
2000年 flash 5.0
2002年 flash mx (就是flash 6.0)
2004年 flash mx2004 (就是flash 7.0)
2005年 flash 8.0
2006年 flash cs3 (就是flash 9.0)
2008年 flash cs4 (就是flash 10.0)
目前的最新版本是flash cs4 功能非常強(qiáng)大,不僅支持骨骼動(dòng)畫,還支持3維等等,verycd上有視頻教程,可以去學(xué)習(xí)一下。
不過(guò)初學(xué)的話,個(gè)人建議你從flash cs3開(kāi)始,以便今后玩flash cs4,因?yàn)樗麄兊牟僮餍院芟嗨疲現(xiàn)lash 8現(xiàn)在雖然還是很多人在用,但是已經(jīng)漸漸被新軟件的新功能所取代。
FLASH CS3的好用之處::
1.cs3是ADOBE收購(gòu)micromedia后的大作,無(wú)論從動(dòng)畫設(shè)計(jì)上,還是程序語(yǔ)言上都有質(zhì)的飛躍。比如鋼筆功能更加強(qiáng)大,超級(jí)強(qiáng)大的繪圖功能,這些都讓矢量圖制作者提高了效率,使用更方便。
2.FLASH CS3引入了面向?qū)ο蟮腁S3語(yǔ)言,使得AS不在是一個(gè)簡(jiǎn)簡(jiǎn)單單的腳本語(yǔ)言,而搖身變成一種強(qiáng)大的高級(jí)程序語(yǔ)言。另外,F(xiàn)LASH CS3也全面支持AS之前的版本,從AS1到AS2均支持。
3.作為初學(xué)者,因?yàn)闆](méi)有基礎(chǔ),不存在用慣一個(gè)版本的軟件,用新版本時(shí)要重新熟悉的問(wèn)題,所以應(yīng)盡量選擇最新版本的軟件進(jìn)行學(xué)習(xí),因?yàn)闀r(shí)代是在進(jìn)步的,老版本的軟件,學(xué)完了也就淘汰了,再學(xué)新的,還得重新熟悉界面及操作習(xí)慣。
4.目前由于flash cs4 10月份剛剛推出,目前CS4的教材并不多也不系統(tǒng),所以建議以FLASH CS3作為學(xué)習(xí)的開(kāi)始,而且FLASH CS4的界面和CS3差不多,只是加了些新功能。
問(wèn):怎樣學(xué)會(huì)flash編程,要有什么基礎(chǔ),要學(xué)c語(yǔ)言嗎,哪里有教程啊?該怎么學(xué)啊??
答:
如果你只是了解一下,網(wǎng)上的視頻教程很多,可以去看一看。
但是如果你是很想學(xué)會(huì),那么我建議你,要學(xué)習(xí)一門知識(shí),就必須看系統(tǒng)的教材。因此不推薦看視頻教程,網(wǎng)上的視頻教程雖然很多,但是都很難系統(tǒng)性的教會(huì)你代碼的結(jié)構(gòu)、編程的思想。所以我的建議是買書學(xué)習(xí)。最好不要看電子書,個(gè)人覺(jué)得,看電子書的人,都喜歡跳著看,這樣看就失去了意義。這樣看下來(lái),好像學(xué)會(huì)了,其實(shí)什么原理都沒(méi)搞懂。
要真正的買一本書,一頁(yè)一頁(yè)的翻著看,看一遍不夠,一本書至少3遍甚至n遍。還要多加練習(xí)。學(xué)習(xí)編程,首先從hello world開(kāi)始,然后就是要每天寫,經(jīng)常寫,這樣才有進(jìn)步。
很多人也有這樣的擔(dān)心,怕自己沒(méi)有語(yǔ)言基礎(chǔ),例如沒(méi)有學(xué)習(xí)過(guò)C等。其實(shí)大可不必?fù)?dān)心,語(yǔ)言只是一種工具而已,目前的主流語(yǔ)言就好象同素異形體一樣,看似有區(qū)別,其實(shí)都差不多。這就好像你會(huì)使用WIN98,升級(jí)到了WIN XP,你也不會(huì)說(shuō),連怎么打開(kāi)文件都要重頭學(xué)習(xí)一樣。學(xué)習(xí)編程的關(guān)鍵是學(xué)習(xí)編程的思想,所以好的書教你怎么理解編程思想,差的書只是叫你怎么寫代碼,其中區(qū)別很大。
AS2的書,這里不做推薦了,我也沒(méi)看過(guò)什么好點(diǎn)的書,我學(xué)AS2完全就是看幫助學(xué)會(huì)的,主要是有JS基礎(chǔ)。
這里推薦一本AS3的書:《action script3.0殿堂之路》
問(wèn):我是老程序員了,對(duì)Javascript和Java都比較擅長(zhǎng),現(xiàn)在想學(xué)Flex,但不知道有什么經(jīng)典一點(diǎn)的書籍?
答:
1.初學(xué)者,推薦《action script3.0殿堂之路》,也有人推薦《as3權(quán)威寶典》個(gè)人覺(jué)得那書寫的不行。
2.flex的話,推薦《flex第一步》
3.as3語(yǔ)言掌握的7788了以后,可以去看以下一些書籍
4.實(shí)用書籍:
Action Script3.0 Cook Book —— 類似幫助手冊(cè)的書籍
Action Script3.0 設(shè)計(jì)模式 —— 一本講述程序設(shè)計(jì)思想的書籍,強(qiáng)烈推薦
問(wèn):flash as2.0 與 as3.0的本質(zhì)區(qū)別?
答:
首先說(shuō)下as2,as2實(shí)際上是as1的升級(jí)版,引入一面向?qū)ο蟮母拍睿⒉皇峭耆嫦驅(qū)ο蟮恼Z(yǔ)言,只是在編譯過(guò)程中支持OOP語(yǔ)法。as2的面向?qū)ο箅m然不全面,但是卻是首次將OOP帶到了FLASH,而AS3是一個(gè)完全基于OOP的標(biāo)準(zhǔn)化面向?qū)ο笳Z(yǔ)言,最重要的就是as3不是as2的簡(jiǎn)單升級(jí),而完全是兩種思想的語(yǔ)言。可以說(shuō),as3全面采用了面向?qū)ο蟮乃枷耄鴄s2則仍然停留在面向過(guò)程階段,舉個(gè)例子,就像VB和C#的對(duì)比。
所以as3絕不是as2的升級(jí)版,在as3里,可以看到j(luò)ava和c#的影子,確實(shí),這三種語(yǔ)言大部分思想都是一致的,只有一些小的區(qū)別,比如as3引入了命名空間的概念,但是不支持比如委托,在包封裝及外部訪問(wèn)上也引入了一些新概念。
在編譯階段,as2采用的是AVM1(actionScript vitual machine),而as3采用的是AVM2。新一代虛擬機(jī)采用了OOP思想,在執(zhí)行速度上比起avm1也快了10倍。還提供了異常處理。以前我們?cè)谑褂肁S2時(shí),一旦出錯(cuò),AVM1選擇的是靜默失敗,讓人根本不知道什么地方出錯(cuò)了,會(huì)浪費(fèi)大量的時(shí)間去查錯(cuò),而AVM2與目前主流的編譯器一樣,會(huì)有異常處理,運(yùn)行出錯(cuò)會(huì)輸出錯(cuò)誤提示,工作效率大大提高。如果做個(gè)對(duì)比,我想說(shuō),AVM1就是大刀長(zhǎng)矛,而AVM2就是手槍,大刀和長(zhǎng)矛也能殺敵,但是只在面對(duì)弱智的敵人才能發(fā)揮作用,面對(duì)一個(gè)大型項(xiàng)目,不用點(diǎn)現(xiàn)代化工具是不行滴。
as2與as3的部分區(qū)別,只說(shuō)一些大的區(qū)別,小的不同太多,就不談了:
1.運(yùn)行時(shí)異常機(jī)制處理,這個(gè)剛才說(shuō)過(guò)了。
2.事件機(jī)制,這也是很多人拿起as3就不知所措的原因,初學(xué)者會(huì)發(fā)現(xiàn)連一個(gè)按鈕點(diǎn)擊的方法都寫不出來(lái)。實(shí)際上as3的事件機(jī)制采用的是監(jiān)聽(tīng)的方式,和as2時(shí)代的onClipEvent不同,as3里所有的事件都是需要觸發(fā)器,監(jiān)聽(tīng)器,執(zhí)行器三種結(jié)構(gòu)的,這樣做的好處就是使得這個(gè)語(yǔ)言非常的堅(jiān)強(qiáng),非常的標(biāo)準(zhǔn)化。不像as2,奇形怪狀的代碼漫天飛,可以這樣寫,也可以那樣寫,代碼變得繁復(fù)難懂,可讀性太差,執(zhí)行效率也大大降低。要特別說(shuō)明的是,as3的所有事件都直接繼承event對(duì)象,而event是直接繼承自大老板Object類,結(jié)構(gòu)多么完美。所以在as3中,所有的事件都繼承自相同的父親,結(jié)構(gòu)相同,提高了重用性。
3.封裝性,這是as3與as2最大的不同,as3引入了封裝的概念,使得程序安全性大大提高,各個(gè)對(duì)象之間的關(guān)系也通過(guò)封裝,訪問(wèn)控制而得以確定,避免了不可靠的訪問(wèn)給程序帶來(lái)的意外產(chǎn)生。
4.XML,我覺(jué)得這是最令人激動(dòng)人心的改變,現(xiàn)在as3程序員可以很輕松也很自豪的說(shuō),我們是使用XML人群中最快樂(lè)的人。AS2時(shí)代對(duì)XML的存取仍然需要解析,而AS3則創(chuàng)新的將XML也視作一個(gè)對(duì)象,存取XML就像存取普通對(duì)象的屬性一樣方便,用點(diǎn)語(yǔ)法就可以,無(wú)疑大大提高了效率。
5.最關(guān)鍵的一點(diǎn),容器的概念,AS3采用了容器的思想,告別了as2一個(gè)MovieClip打天下的局面。對(duì)于as2程序員來(lái)說(shuō),可能不能理解,我mc用的好好的,干嘛不讓我用啊。但是當(dāng)你真正的了解as3的思想的時(shí)候,當(dāng)你真主的體會(huì)到OOP的好處的時(shí)候,你會(huì)覺(jué)得as3的容器的思想的完全正確的。as2時(shí)代,我們做什么都用mc,而as2時(shí)代的mc也是直接繼承自object,這給了mc極大的權(quán)限,極其多的方法屬性,而有時(shí)我們只需要放一個(gè)背景圖,并不需要它動(dòng),這樣做就造成了極大的浪費(fèi)。說(shuō)實(shí)在話as2和as3比起來(lái)就是浪費(fèi)之神,所以as2編出的swf絕對(duì)比as3編譯出來(lái)的swf要大上幾倍。as3把所有你用到的顯示對(duì)象都分開(kāi),mc的屬性方法都被瓜分開(kāi)來(lái),舉個(gè)例子,你去水果超市買水果,就肯定比直接去大型超市買要方便,更節(jié)約時(shí)間,時(shí)間就是金錢,那就是很大的節(jié)省。
當(dāng)然還有許許多多的不同,比如程序執(zhí)行機(jī)制,設(shè)計(jì)模式,結(jié)構(gòu)框架等等,這里就不在一一贅述。
問(wèn):怎么才能成為編程高手?
答:
可以說(shuō),學(xué)會(huì)編程并不難,怎么才能寫出好的程序,這是很多人所困惑的事情,我有時(shí)候也是左思右想,覺(jué)得自己寫出來(lái)的東西太在是太垃圾了。那么真正的高手他們?cè)谧鲂┦裁茨兀克麄兊降滓驗(yàn)槭裁床拍艹蔀楦呤帜兀?/font>
其實(shí),我們很多人都僅僅停留在會(huì)寫程序的階段,并沒(méi)有去研究,一個(gè)程序怎么寫才算是合理的,什么樣的結(jié)構(gòu),才是最完善的,什么樣的布局才是可擴(kuò)展的。什么樣的代碼才是最高效的。而這正是高手花功夫去研究的事情,也是為什么高手能做的更好的原因。
我總結(jié)了一下,覺(jué)得以下才是一個(gè)程序員應(yīng)該思考的路:
1.第一類人:會(huì)寫程序,這沒(méi)什么,人人都能辦到。(70%的程序員都在這里)
2.第二類人:有一定的結(jié)構(gòu)思想,能做設(shè)計(jì)結(jié)構(gòu)上的調(diào)整。能走到這一步,應(yīng)該可以算真正入門了。(15%的程序員在這里,很不幸,本人也在這里。)
3.第三類人:熟練應(yīng)用各種設(shè)計(jì)模式,到了這里,才算涉足高級(jí)編程領(lǐng)域。這樣的人才能算高手。(10%左右,我想黑羽同志應(yīng)該屬于這個(gè)級(jí)別)
4.第四類人:有算法分析和創(chuàng)意思維,能做到這一步的人,寫出來(lái)的程序就不叫程序了,叫偉大發(fā)明!(5%左右,微軟和谷歌的專家們?cè)谶@里)
5.第五類人:這一類人是我不敢想象的,已經(jīng)超出我的思考范疇了。(趨向0%)
最后,歡迎大家百度HI我,和我探討相關(guān)的技術(shù)。
或者加入百度HI群:flash知道(1群)1051316、 flash知道(2群)1084144
#include <winsock2.h>
//#include <windows.h>
#include <stdio.h>
#define PORT 5150
#define DATA_BUFSIZE 8192
typedef struct
{
OVERLAPPED Overlapped;
WSABUF DataBuf;
CHAR Buffer[DATA_BUFSIZE];
DWORD BytesSEND;
DWORD BytesRECV;
} PER_IO_OPERATION_DATA, * LPPER_IO_OPERATION_DATA;
typedef struct
{
SOCKET Socket;
} PER_HANDLE_DATA, * LPPER_HANDLE_DATA;
DWORD WINAPI ServerWorkerThread(LPVOID CompletionPortID);
int main(void)
{
SOCKADDR_IN InternetAddr;
SOCKET Listen;
SOCKET Accept;
HANDLE CompletionPort;
SYSTEM_INFO SystemInfo;
LPPER_HANDLE_DATA PerHandleData;
LPPER_IO_OPERATION_DATA PerIoData;
int i;
DWORD RecvBytes;
DWORD Flags;
DWORD ThreadID;
WSADATA wsaData;
DWORD Ret;
if ((Ret = WSAStartup(0x0202, &wsaData)) != 0)
{
printf("WSAStartup失敗了,錯(cuò)誤信息如下: %d\n", Ret);
return;
}
// 設(shè)置一個(gè)I/O完成端口.
if ((CompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0)) == NULL)
{
printf( "CreateIoCompletionPort 失敗了,錯(cuò)誤信息如下: %d\n", GetLastError());
return;
}
// 測(cè)試系統(tǒng)中有多少cpu處理器
GetSystemInfo(&SystemInfo);
// 基于系統(tǒng)可用的處理器創(chuàng)建工作線程,為每個(gè)處理器創(chuàng)建連個(gè)線程
for(i = 0; i < SystemInfo.dwNumberOfProcessors * 2; i++)
{
HANDLE ThreadHandle;
// 創(chuàng)建一個(gè)服務(wù)端線程并且傳遞一個(gè)完成端口給這個(gè)線程.
if ((ThreadHandle = CreateThread(NULL, 0, ServerWorkerThread, CompletionPort,
0, &ThreadID)) == NULL)
{
printf("CreateThread()發(fā)生了如下錯(cuò)誤: %d\n", GetLastError());
return;
}
else
{printf("創(chuàng)建了一個(gè)完成端口.\n");
}
// 關(guān)閉 thread句柄
CloseHandle(ThreadHandle);
}
// 創(chuàng)建一個(gè)監(jiān)聽(tīng)套接字
if ((Listen =WSASocket(AF_INET, SOCK_STREAM, 0, NULL,0,WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
{
printf("WSASocket() 發(fā)生了如下錯(cuò)誤: %d\n", WSAGetLastError());
return;
}
else
{printf("創(chuàng)建監(jiān)聽(tīng)套接字成功\n");}
InternetAddr.sin_family = AF_INET;
InternetAddr.sin_addr.s_addr = htonl(INADDR_ANY);
InternetAddr.sin_port = htons(PORT);
if (bind(Listen, (PSOCKADDR) &InternetAddr, sizeof(InternetAddr)) == SOCKET_ERROR)
{
printf("bind()端口或IP時(shí)發(fā)生了如下錯(cuò)誤: %d\n", WSAGetLastError());
return;
}
else
{printf("綁定端口%d成功\n",PORT);}
// 準(zhǔn)備socket 用來(lái)監(jiān)聽(tīng)
if (listen(Listen, 5) == SOCKET_ERROR)
{
printf("listen() 發(fā)生了如下錯(cuò)誤 %d\n", WSAGetLastError());
return;
}
else
{printf("預(yù)處理成功,開(kāi)始在端口 %d 處監(jiān)聽(tīng)...\n",PORT);}
//接受連接并且交給完成端口處理
while(TRUE)
{
if ((Accept = WSAAccept(Listen, NULL, NULL, NULL, 0)) == SOCKET_ERROR)
{
printf("WSAAccept() 發(fā)生了如下錯(cuò)誤: %d\n", WSAGetLastError());
return;
}
// 創(chuàng)建一個(gè)套接字信息結(jié)構(gòu)體去聯(lián)系起來(lái)socket
if ((PerHandleData = (LPPER_HANDLE_DATA) GlobalAlloc(GPTR,
sizeof(PER_HANDLE_DATA))) == NULL)
{
printf("GlobalAlloc() 發(fā)生了如下錯(cuò)誤: %d\n", GetLastError());
return;
}
// 將接受到的套接字與原始的完成端口聯(lián)系起來(lái).
printf("號(hào)碼為 %d 的socket連接上了\n", Accept);
PerHandleData->Socket = Accept;
if (CreateIoCompletionPort((HANDLE) Accept, CompletionPort, (DWORD) PerHandleData,
0) == NULL)
{
printf("CreateIoCompletionPort 發(fā)生了如下錯(cuò)誤: %d\n", GetLastError());
return;
}
// 創(chuàng)建每一個(gè)I/O 套接字信息結(jié)構(gòu)體去和下面被調(diào)用的 to associate with the
// WSARecv 連接.
if ((PerIoData = (LPPER_IO_OPERATION_DATA) GlobalAlloc(GPTR, sizeof(PER_IO_OPERATION_DATA))) == NULL)
{
printf("GlobalAlloc() 發(fā)生了如下錯(cuò)誤: %d\n", GetLastError());
return;
}
else{printf("接收了一個(gè)連接\n");}
ZeroMemory(&(PerIoData->Overlapped), sizeof(OVERLAPPED));
PerIoData->BytesSEND = 0;
PerIoData->BytesRECV = 0;
PerIoData->DataBuf.len = DATA_BUFSIZE;
PerIoData->DataBuf.buf = PerIoData->Buffer;
Flags = 0;
if (WSARecv(Accept, &(PerIoData->DataBuf), 1, &RecvBytes, &Flags,
&(PerIoData->Overlapped), NULL) == SOCKET_ERROR)
{
if (WSAGetLastError() != ERROR_IO_PENDING)
{
printf("WSARecv() 發(fā)生了如下錯(cuò)誤: %d\n", WSAGetLastError());
return;
}
}
}
}
DWORD WINAPI ServerWorkerThread(LPVOID CompletionPortID)
{
HANDLE CompletionPort = (HANDLE) CompletionPortID;
DWORD BytesTransferred;
LPOVERLAPPED Overlapped;
LPPER_HANDLE_DATA PerHandleData;
LPPER_IO_OPERATION_DATA PerIoData;
DWORD SendBytes, RecvBytes;
DWORD Flags;
while(TRUE)
{
if (GetQueuedCompletionStatus(CompletionPort, &BytesTransferred,
(LPDWORD)&PerHandleData, (LPOVERLAPPED *) &PerIoData, INFINITE) == 0)
{
printf("GetQueuedCompletionStatus 發(fā)生了如下錯(cuò)誤: %d\n", GetLastError());
return 0;
}
//首先檢查一下去套接字看是否在上發(fā)生了錯(cuò)誤并且如果發(fā)生了錯(cuò)誤就關(guān)閉套接
//字并且清除與套接字連接的 SOCKET_INFORMATION結(jié)構(gòu)信息體
if (BytesTransferred == 0)
{
printf("正在關(guān)閉socket %d\n", PerHandleData->Socket);
if (closesocket(PerHandleData->Socket) == SOCKET_ERROR)
{
printf("closesocket() 發(fā)生了如下錯(cuò)誤: %d\n", WSAGetLastError());
return 0;
}
GlobalFree(PerHandleData);
GlobalFree(PerIoData);
continue;
}
//檢查如果 BytesRECV字段等于0,這就意味著一個(gè) WSARecv調(diào)用剛剛完成了所以從完成的WSARecv()調(diào)用中
//用BytesTransferred值更新 BytesRECV字段
if (PerIoData->BytesRECV == 0)
{
PerIoData->BytesRECV = BytesTransferred;
PerIoData->BytesSEND = 0;
}
else
{
PerIoData->BytesSEND += BytesTransferred;
}
if (PerIoData->BytesRECV > PerIoData->BytesSEND)
{
//發(fā)布另外一個(gè) WSASend()請(qǐng)求
//既然WSASend()不是 gauranteed去發(fā)送所有字節(jié)的請(qǐng)求
//繼續(xù)調(diào)用 WSASend()發(fā)送直到所有收到的字節(jié)被發(fā)送
ZeroMemory(&(PerIoData->Overlapped), sizeof(OVERLAPPED));
PerIoData->DataBuf.buf = PerIoData->Buffer + PerIoData->BytesSEND;
PerIoData->DataBuf.len = PerIoData->BytesRECV - PerIoData->BytesSEND;
if (WSASend(PerHandleData->Socket, &(PerIoData->DataBuf), 1, &SendBytes, 0,
&(PerIoData->Overlapped), NULL) == SOCKET_ERROR)
{
if (WSAGetLastError() != ERROR_IO_PENDING)
{
printf("WSASend() 發(fā)生了如下錯(cuò)誤: %d\n", WSAGetLastError());
return 0;
}
}
}
else
{
PerIoData->BytesRECV = 0;
//現(xiàn)在沒(méi)有更多的字節(jié)發(fā)送過(guò)去用來(lái)post另外一個(gè)WSARecv()請(qǐng)求
Flags = 0;
ZeroMemory(&(PerIoData->Overlapped), sizeof(OVERLAPPED));
PerIoData->DataBuf.len = DATA_BUFSIZE;
PerIoData->DataBuf.buf = PerIoData->Buffer;
if (WSARecv(PerHandleData->Socket, &(PerIoData->DataBuf), 1, &RecvBytes, &Flags,
&(PerIoData->Overlapped), NULL) == SOCKET_ERROR)
{
if (WSAGetLastError() != ERROR_IO_PENDING)
{
printf("WSARecv() 發(fā)生了如下錯(cuò)誤: %d\n", WSAGetLastError());
return 0;
}
}
}
}
}