C#三打一网络扑克游戏软件开发(一)
C#三打一網絡撲克游戲軟件開發(一)
——玩家叫分
該游戲主要是參照云南大理本地居民休閑時所玩的撲克游戲開發,其規則與之完全相同。因此,為了讓大家能更清楚的理解整個開發過程,在開始時有必要先對整個游戲規則作個介紹。
由于本文討論的是玩家叫分模塊的開發,因此這里就先介紹叫分的規則,其余規則待討論時再進行介紹。
在游戲開始時,首先隨機選定一名玩家進行第一個叫分,之后按逆時針方向依次輪換,直到有三個玩家均選擇“不叫”時,則可確定本局牌莊家為剩下的那名玩家。
在叫分時,會有一些細則進行約束。具體如下:
(先做個名詞解釋:)
常主:在該游戲中,王、7、2被稱作常主。
1、? 如果玩家有7張常主,那么該玩家在本局牌中必須叫一次莊(也就是自己在第一次叫莊時不能選擇“不叫”);
2、? 如果第一個叫莊的玩家選擇80分,其余三名玩家均選擇不叫,那叫80分的玩家在本局牌中勝出,輸的玩家為其余三名玩家中常主數最多的玩家。如果常主數相同,則輸家為在逆時針方向挨近莊家的玩家。
3、? 第一個叫莊的玩家在第一次叫莊時只能在80分和50分范圍內(包含80分和50分);
4、? 如果第一個叫莊的玩家在第一次叫莊時叫了80分,則他在本局牌中失去了叫莊資格;
5、? 如果當前玩家所叫出的莊分大于50,則后面的玩家所叫的莊分不能低于50,只有當其中一名玩家叫了50分后,后面的玩家才能叫小于50的莊分(包括“擺光”);
6、? 如果其中一名玩家選擇了“不叫”,則它在本局牌中失去了后續的叫莊資格;
7、? 每個玩家所叫的莊分只能低于當前所叫出的莊分;
8、? 在叫莊沒有結束時,玩家可以無限次數的叫“擺光”,每叫一次“擺光”,輸贏的倍率乘以二(即:莊家所輸的分為基本分乘以倍率)
以上就是三打一撲克游戲的整個叫分過程,下面我們討論怎么樣通過代碼來實現這個模塊。
在該部分中,涉及到的條件很多,如果將這部分的代碼放到和游戲主程序代碼一起來開發的話,整個邏輯會變得雜亂無章,也不利于后期的測試和維護。因此,決定采用面向對象的方法,叫莊這個模塊單獨封裝為一個對象,在這個對象中提供一些和主程序進行數據對接的接口,就可以完成整個功能。
通過上面的分析,結合VS2005平臺的特點,決定將整個叫分模塊作為一個控件來開發,最后主程序中使用的時候只需從工具箱中拖出來即可。
在新建項目的選擇對話框中,我們選擇“Windows窗體控件庫”,便可進入到控件開發界面。該界面和Windows應用程序開發界面基本一至,開發方法也如出一轍,只不過這里開發出來的是一個.dll文件的控件,Windows應用程序開發出來的是一個應用程序。
在這個界下,我們先從工具箱中拖出一些我們需要的控件來組成叫分模塊的界面。如下圖:
這個控件包含了一些按鈕,每個按鈕代表不同的莊分值。叫莊時,玩家所點擊的按鈕代表的分值就為當前該名玩家所叫的莊分。在游戲中,通過該控件從主程序獲取的數據來動態控制其各個按鈕的Enab le屬性,以達到約束玩家當前能叫哪些莊分的目的。需要說明的是,這個過程由該控件自己完成,主程序只把約束條件中的一些數據提供給它,控件便可根據這些數據來控制玩家當前該如何叫莊。
所涉及的代碼如下:
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};
??????? }
?
??????? //保存我方的叫莊的次數
??????? private int jiaoZhuangCount=1;
??????? public int JiaoZhuangCount
??????? {
??????????? get
??????????? {
??????????????? return jiaoZhuangCount;
??????????? }
??????????? set
??????????? {
??????????????? jiaoZhuangCount = value;
??????????????? //如果我方是第一次叫莊,并且我手中的常主數大于或等于7,則本次必須叫莊
??????????????? if (jiaoZhuangCount == 1 && changZhuCount >= 7)
??????????????? {
??????????????????? button19.Visible = false;
??????????????? }
??????????????? else
??????????????? {
??????????????????? button19.Visible = true;//是否顯示“不叫”按鈕
??????????????? }
?
??????????? }
??????? }
?
??????? //保存我方手中的牌常主的數目
??????? private int changZhuCount;
??????? public int ChangZhuCount
??????? {
??????????? get
??????????? {
??????????????? return changZhuCount;
??????????? }
??????????? set
??????????? {
??????????????? changZhuCount = value;
??????????????? //如果我方手中的常數大于或等于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//如果我不是第一個叫莊,則要看上一個玩家所叫莊的分數
??????????????? {
??????????????????? if (UpPlayerFeng > 50)//如果上一個玩家所叫的分不小于50,則我方現在只能叫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;
??????????? }
??????? }
?
??????? //一局牌結束后,將叫分按鈕全部顯示
??????? 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控件數組Button[] jf里面,目的是為了后面能夠通過for循環對它們的Enable值進行批量更改;
2、???? 在各button控件的Click事件中,全都使用了一個this.OnValidating(new CancelEventArgs()),其原因是在游戲主程序中這個叫莊模塊將作為一個整體的控件使用,無法再對這個控件上的各個button按鈕的Click事件進行綁定。因此,在開發該控件的時候便通過上述語句把每個button按鈕的Click事件綁定到該控件的驗證事件上。游戲中玩家在叫莊時點擊了莊分所對應的按鈕,就觸發了該控件的OnValidating事件,這此我們只需在主程序中對叫莊控件的OnValidating進行綁定,便可知道當前玩家所選擇的莊分。
好了,關于叫莊模塊的開發就先討論到這,也許你看得一頭霧水,這很正常,因為你還不了解這個模塊是怎么使用的。我相信,通過后續的討論,你能很好的掌握它,并通過自己的思考開發出更獨到的東西,我相信你。
總結
以上是生活随笔為你收集整理的C#三打一网络扑克游戏软件开发(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何将宿舍门变成指纹开锁?
- 下一篇: 使用Apache Ignite瘦客户端–