C#三打一网络扑克游戏软件开发(一)
C#三打一網(wǎng)絡(luò)撲克游戲軟件開發(fā)(一)
——玩家叫分
該游戲主要是參照云南大理本地居民休閑時所玩的撲克游戲開發(fā),其規(guī)則與之完全相同。因此,為了讓大家能更清楚的理解整個開發(fā)過程,在開始時有必要先對整個游戲規(guī)則作個介紹。
由于本文討論的是玩家叫分模塊的開發(fā),因此這里就先介紹叫分的規(guī)則,其余規(guī)則待討論時再進行介紹。
在游戲開始時,首先隨機選定一名玩家進行第一個叫分,之后按逆時針方向依次輪換,直到有三個玩家均選擇“不叫”時,則可確定本局牌莊家為剩下的那名玩家。
在叫分時,會有一些細則進行約束。具體如下:
(先做個名詞解釋:)
常主:在該游戲中,王、7、2被稱作常主。
1、? 如果玩家有7張常主,那么該玩家在本局牌中必須叫一次莊(也就是自己在第一次叫莊時不能選擇“不叫”);
2、? 如果第一個叫莊的玩家選擇80分,其余三名玩家均選擇不叫,那叫80分的玩家在本局牌中勝出,輸?shù)耐婕覟槠溆嗳婕抑谐V鲾?shù)最多的玩家。如果常主數(shù)相同,則輸家為在逆時針方向挨近莊家的玩家。
3、? 第一個叫莊的玩家在第一次叫莊時只能在80分和50分范圍內(nèi)(包含80分和50分);
4、? 如果第一個叫莊的玩家在第一次叫莊時叫了80分,則他在本局牌中失去了叫莊資格;
5、? 如果當(dāng)前玩家所叫出的莊分大于50,則后面的玩家所叫的莊分不能低于50,只有當(dāng)其中一名玩家叫了50分后,后面的玩家才能叫小于50的莊分(包括“擺光”);
6、? 如果其中一名玩家選擇了“不叫”,則它在本局牌中失去了后續(xù)的叫莊資格;
7、? 每個玩家所叫的莊分只能低于當(dāng)前所叫出的莊分;
8、? 在叫莊沒有結(jié)束時,玩家可以無限次數(shù)的叫“擺光”,每叫一次“擺光”,輸贏的倍率乘以二(即:莊家所輸?shù)姆譃榛痉殖艘员堵?#xff09;
以上就是三打一撲克游戲的整個叫分過程,下面我們討論怎么樣通過代碼來實現(xiàn)這個模塊。
在該部分中,涉及到的條件很多,如果將這部分的代碼放到和游戲主程序代碼一起來開發(fā)的話,整個邏輯會變得雜亂無章,也不利于后期的測試和維護。因此,決定采用面向?qū)ο蟮姆椒?#xff0c;叫莊這個模塊單獨封裝為一個對象,在這個對象中提供一些和主程序進行數(shù)據(jù)對接的接口,就可以完成整個功能。
通過上面的分析,結(jié)合VS2005平臺的特點,決定將整個叫分模塊作為一個控件來開發(fā),最后主程序中使用的時候只需從工具箱中拖出來即可。
在新建項目的選擇對話框中,我們選擇“Windows窗體控件庫”,便可進入到控件開發(fā)界面。該界面和Windows應(yīng)用程序開發(fā)界面基本一至,開發(fā)方法也如出一轍,只不過這里開發(fā)出來的是一個.dll文件的控件,Windows應(yīng)用程序開發(fā)出來的是一個應(yīng)用程序。
在這個界下,我們先從工具箱中拖出一些我們需要的控件來組成叫分模塊的界面。如下圖:
這個控件包含了一些按鈕,每個按鈕代表不同的莊分值。叫莊時,玩家所點擊的按鈕代表的分值就為當(dāng)前該名玩家所叫的莊分。在游戲中,通過該控件從主程序獲取的數(shù)據(jù)來動態(tài)控制其各個按鈕的Enab le屬性,以達到約束玩家當(dāng)前能叫哪些莊分的目的。需要說明的是,這個過程由該控件自己完成,主程序只把約束條件中的一些數(shù)據(jù)提供給它,控件便可根據(jù)這些數(shù)據(jù)來控制玩家當(dāng)前該如何叫莊。
所涉及的代碼如下:
private Button[] jf;
??????? public JiaoFeng()
??????? {
??????????? InitializeComponent();
??????????? jf = new Button[19]{button1,button2,button3,button4,button5,button6,button7,button8,button9,button10,
????????????????????????????? button11,button12,button13,button14,button15,button16,button17,button18,button19};
??????? }
?
??????? //保存我方的叫莊的次數(shù)
??????? private int jiaoZhuangCount=1;
??????? public int JiaoZhuangCount
??????? {
??????????? get
??????????? {
??????????????? return jiaoZhuangCount;
??????????? }
??????????? set
??????????? {
??????????????? jiaoZhuangCount = value;
??????????????? //如果我方是第一次叫莊,并且我手中的常主數(shù)大于或等于7,則本次必須叫莊
??????????????? if (jiaoZhuangCount == 1 && changZhuCount >= 7)
??????????????? {
??????????????????? button19.Visible = false;
??????????????? }
??????????????? else
??????????????? {
??????????????????? button19.Visible = true;//是否顯示“不叫”按鈕
??????????????? }
?
??????????? }
??????? }
?
??????? //保存我方手中的牌常主的數(shù)目
??????? private int changZhuCount;
??????? public int ChangZhuCount
??????? {
??????????? get
??????????? {
??????????????? return changZhuCount;
??????????? }
??????????? set
??????????? {
??????????????? changZhuCount = value;
??????????????? //如果我方手中的常數(shù)大于或等于7,并且我是第一次叫莊,則本次必須叫莊
??????????????? if (changZhuCount >= 7 && jiaoZhuangCount == 1)
??????????????? {
??????????????????? button19.Visible = false;
??????????????? }
??????????????? else
??????????????? {
??????????????????? button19.Visible = true;//是否顯示“不叫”按鈕
??????????????? }
?
??????????? }
??????? }
?
??????? //保存上一個玩家所叫的分
??????? private int upPlayerFeng=-15;
??????? public int UpPlayerFeng
??????? {
??????????? get
??????????? {
??????????????? return upPlayerFeng;
??????????? }
??????????? set
??????????? {
??????????????? upPlayerFeng = value;
??????????????? if (upPlayerFeng != -15 && upPlayerFeng != -10)//-15為變量的初始值,-10為玩家先不叫的值,-5為擺光的值
??????????????? {
??????????????????? if (upPlayerFeng == -5)//如果叫了擺光,則要把80——0分的按鈕都隱藏掉
??????????????????? {
??????????????????????? upPlayerFeng = 0;
??????????????????? }
??????????????????? //如果我不是第一個叫莊,則只能叫比上一玩家所叫分低的分
??????????????????? for (int i = 0; i <= Math.Abs(upPlayerFeng - 80) / 5; i++)
??????????????????? {
??????????????????????? jf[i].Visible = false;
??????????????????? }
??????????????? }
??????????? }
??????? }
?
??????? //保存我方是第幾個叫莊(相對于所有玩家而言)
??????? private int jiaoZhuangList;
??????? public int JiaoZhuangList
??????? {
??????????? get
??????????? {
??????????????? return jiaoZhuangList;
??????????? }
??????????? set
??????????? {
??????????????? jiaoZhuangList = value;
??????????????? //如果我是第一個叫莊,則只能叫50—80,不能不叫或叫擺光
??????????????? if (jiaoZhuangList == 1)
??????????????? {
??????????????????? for (int i = 7; i < 19; i++)
??????????????????? {
??????????????????????? jf[i].Visible = false;
??????????????????? }
???????? ???????}
??????????????? else//如果我不是第一個叫莊,則要看上一個玩家所叫莊的分?jǐn)?shù)
??????????????? {
??????????????????? if (UpPlayerFeng > 50)//如果上一個玩家所叫的分不小于50,則我方現(xiàn)在只能叫50—80之間的
??????????????????? {
??????????????????????? for (int i = 0; i < 19; i++)
??????????????????????? {
??????????????????????????? jf[i].Visible = false;
??????????????????????? }
??????????????????????? for (int j = 0; j < 7; j++)
??????????????????????? {
??????????????????????????? jf[j].Visible = true;
??????????????????????? }
??????????????????????? UpPlayerFeng = upPlayerFeng;
??????????????????? }
??????????????????? else
??????????????????? {
??????????????????????? for (int i = 0; i < 19; i++)
??????????????????????? {
??????????????????????????? jf[i].Visible = true;
??????????????????????? }
??????????????????????? UpPlayerFeng = upPlayerFeng;
??????????????????????? if (UpPlayerFeng == 50)//如果上一個玩家所叫的分是50分
??????????????????????? {
??????????????????????????? button18.Visible = false;
??????????????????????? }
??????????????????????? else
?? ?????????????????????{
??????????????????????????? button18.Visible = true;
??????????????????????? }
??????????????????? }
??????????????????? //UpPlayerFeng = upPlayerFeng;
??????????????? }
??????????? }
??????? }
?
??????? //保存自己所叫的莊分
??????? private int myFeng;
??????? public int MyFeng
??????? {
??????????? get
??????????? {
??????????????? return myFeng;
??????????? }
??????????? set
??????????? {
??????????????? myFeng = value;
??????????? }
??????? }
?
??????? //一局牌結(jié)束后,將叫分按鈕全部顯示
??????? public void SetGameInfo()
??????? {
??????????? MyFeng = 0;
??????????? JiaoZhuangList = 0;
??????????? UpPlayerFeng = -15;
??????????? ChangZhuCount = 0;
??????????? JiaoZhuangCount = 1;
??????????? for (int i = 0; i < 19; i++)
??????????? {
??????????????? jf[i].Visible = true;
??????????? }
??????? }
?
?
??????? private void button1_Click(object sender, EventArgs e)
??????? {
??????????? MyFeng = 80;
??????????? jiaoZhuangCount = jiaoZhuangCount + 1;
??????????? this.OnValidating(new CancelEventArgs());
??????? }
?
??????? private void button2_Click(object sender, EventArgs e)
??????? {
??????????? MyFeng = 75;
??????????? jiaoZhuangCount = jiaoZhuangCount + 1;
??????????? this.OnValidating(new CancelEventArgs());
??????? }
?
??????? private void button3_Click(object sender, EventArgs e)
??????? {
??????????? MyFeng = 70;
??????????? jiaoZhuangCount = jiaoZhuangCount + 1;
??????????? this.OnValidating(new CancelEventArgs());
??????? }
?
??????? private void button4_Click(object sender, EventArgs e)
??????? {
??????????? MyFeng = 65;
??????????? jiaoZhuangCount = jiaoZhuangCount + 1;
??????????? this.OnValidating(new CancelEventArgs());
??????? }
?
??????? private void button5_Click(object sender, EventArgs e)
??????? {
??????????? MyFeng = 60;
??????????? jiaoZhuangCount = jiaoZhuangCount + 1;
??????????? this.OnValidating(new CancelEventArgs());
??????? }
?
??????? private void button6_Click(object sender, EventArgs e)
??????? {
??????????? MyFeng = 55;
??????????? jiaoZhuangCount = jiaoZhuangCount + 1;
??????????? this.OnValidating(new CancelEventArgs());
??????? }
?
??????? private void button7_Click(object sender, EventArgs e)
??????? {
??????????? MyFeng = 50;
??????????? jiaoZhuangCount = jiaoZhuangCount + 1;
??????????? this.OnValidating(new CancelEventArgs());
??????? }
?
??????? private void button8_Click(object sender, EventArgs e)
??????? {
??????????? MyFeng = 45;
??????????? jiaoZhuangCount = jiaoZhuangCount + 1;
??????????? this.OnValidating(new CancelEventArgs());
??????? }
?
??????? private void button9_Click(object sender, EventArgs e)
??????? {
??????????? MyFeng = 40;
??????????? jiaoZhuangCount = jiaoZhuangCount + 1;
??????????? this.OnValidating(new CancelEventArgs());
??????? }
?
??????? private void button10_Click(object sender, EventArgs e)
??????? {
??????????? MyFeng = 35;
??????????? jiaoZhuangCount = jiaoZhuangCount + 1;
??????????? this.OnValidating(new CancelEventArgs());
??????? }
?
??????? private void button11_Click(object sender, EventArgs e)
??????? {
??????????? MyFeng = 30;
??????????? jiaoZhuangCount = jiaoZhuangCount + 1;
??????????? this.OnValidating(new CancelEventArgs());
??????? }
?
??????? private void button12_Click(object sender, EventArgs e)
??????? {
???????? ???MyFeng = 25;
??????????? jiaoZhuangCount = jiaoZhuangCount + 1;
??????????? this.OnValidating(new CancelEventArgs());
??????? }
?
??????? private void button13_Click(object sender, EventArgs e)
??????? {
??????????? MyFeng = 20;
??????????? jiaoZhuangCount = jiaoZhuangCount + 1;
??????????? this.OnValidating(new CancelEventArgs());
??????? }
?
??????? private void button14_Click(object sender, EventArgs e)
??????? {
??????????? MyFeng = 15;
??????????? jiaoZhuangCount = jiaoZhuangCount + 1;
??????????? this.OnValidating(new CancelEventArgs());
??????? }
?
??????? private void button15_Click(object sender, EventArgs e)
??????? {
??????????? MyFeng = 10;
??????????? jiaoZhuangCount = jiaoZhuangCount + 1;
??????????? this.OnValidating(new CancelEventArgs());
??????? }
?
??????? private void button16_Click(object sender, EventArgs e)
??????? {
??????????? MyFeng = 5;
??????????? jiaoZhuangCount = jiaoZhuangCount + 1;
??????????? this.OnValidating(new CancelEventArgs());
??????? }
?
??????? private void button17_Click(object sender, EventArgs e)
??????? {
??????????? MyFeng = 0;
??????????? jiaoZhuangCount = jiaoZhuangCount + 1;
??????????? this.OnValidating(new CancelEventArgs());
??????? }
?
??????? private void button18_Click(object sender, EventArgs e)
??????? {
??????????? MyFeng = -5;//擺光
??????????? jiaoZhuangCount = jiaoZhuangCount + 1;
??????????? this.OnValidating(new CancelEventArgs());
??????? }
?
??????? private void button19_Click(object sender, EventArgs e)
??????? {
??????????? MyFeng = -10;//不叫
??????????? jiaoZhuangCount = jiaoZhuangCount + 1;
??????????? this.OnValidating(new CancelEventArgs());
??????? }
}
?
這些代碼均有注釋,這里便不再詳解。僅說明一下特殊的地方。
1、???? 在該控件中,所涉及到了19個Button控件,我們把它保存到了一個Button控件數(shù)組Button[] jf里面,目的是為了后面能夠通過for循環(huán)對它們的Enable值進行批量更改;
2、???? 在各button控件的Click事件中,全都使用了一個this.OnValidating(new CancelEventArgs()),其原因是在游戲主程序中這個叫莊模塊將作為一個整體的控件使用,無法再對這個控件上的各個button按鈕的Click事件進行綁定。因此,在開發(fā)該控件的時候便通過上述語句把每個button按鈕的Click事件綁定到該控件的驗證事件上。游戲中玩家在叫莊時點擊了莊分所對應(yīng)的按鈕,就觸發(fā)了該控件的OnValidating事件,這此我們只需在主程序中對叫莊控件的OnValidating進行綁定,便可知道當(dāng)前玩家所選擇的莊分。
好了,關(guān)于叫莊模塊的開發(fā)就先討論到這,也許你看得一頭霧水,這很正常,因為你還不了解這個模塊是怎么使用的。我相信,通過后續(xù)的討論,你能很好的掌握它,并通過自己的思考開發(fā)出更獨到的東西,我相信你。
總結(jié)
以上是生活随笔為你收集整理的C#三打一网络扑克游戏软件开发(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何将宿舍门变成指纹开锁?
- 下一篇: c# char unsigned_dll