Ninetynine.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace FinalProject
{
class Ninetynine
{
//欄位
private int tableNumber=0;
private int nextPlayerNum = 0;
public bool gameEnd = false;
public bool CCW = true;
public delegate void GameOverEventHandler(int losePlayerNum);
public GameOverEventHandler gameOver;
//屬性
public int TableNumber
{
get { return tableNumber; }
set
{
if (value < 0)
tableNumber = 0;
else if (value > 99)
gameEnd = true;
else
tableNumber = value;
}
}
public int NextPlayerNum
{
get { return nextPlayerNum; }
set
{
if (value > 3)
nextPlayerNum = 0;
else if (value < 0)
nextPlayerNum = 3;
else
nextPlayerNum = value;
}
}
//方法
public void Card(int cardRank, int playerNum, string str)//判斷桌面上的排,num用以傳入目前出牌玩家號碼,str用以傳入+或-
{
switch (cardRank)
{
case 4:
Four();
break;
case 5:
nextPlayerNum = Five(playerNum);
break;
case 10:
Ten(str);
break;
case 11:
TableNumber = tableNumber + 0;
break;
case 12:
Queen(str);
break;
case 13:
King();
break;
default:
CountNumber(cardRank);
break;
}
if (gameEnd)
gameOver(playerNum);
if (CCW)
NextPlayerNum = playerNum + 1;
else
NextPlayerNum = playerNum - 1;
}
public void CountNumber(int num)//計算牌面上點數
{
TableNumber = TableNumber + num;
}
private bool Four()//點數4的功能
{
CCW = !CCW;
return CCW;
}
private int Five(int num)//點數5的功能
{
Random rand = new Random();
int playerNum=num;
//Random到與num不同的數字便跳出
while (playerNum == num)
{
playerNum = rand.Next(4);
}
return playerNum;
}
private void Ten(string str)//點數10的功能
{
if (str == "+")
{
TableNumber = tableNumber + 10;
}
else if (str == "-")
{
TableNumber = tableNumber - 10;
}
}
private void Queen(string str)//點數12的功能
{
if (str == "+")
{
TableNumber = tableNumber + 20;
}
else if (str == "-")
{
TableNumber = tableNumber - 20;
}
}
private void King()//點數13的功能
{
tableNumber = 99;
}
}
}
Cardeck.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FinalProject;
namespace FinalProject
{
class CardDeck
{
public PokerCardUseUnitCode[] Cards;
public int TopIndex = 0;
public int number = 52;
public CardDeck()
{
Cards = new PokerCardUseUnitCode[52];
CreateDeck();
ResetDeck();
}
public CardDeck(int number)
{
this.number = number;
Cards = new PokerCardUseUnitCode[number];
}
public void CreateDeck() //產生出??個PokerCardUseUnitCode的物件
{
for (int i = 0; i < number; i++)
{
Cards[i] = new PokerCardUseUnitCode();
}
}
public void ResetDeck() //牌堆回復原始狀態
{
for (int i = 0; i < number; i++)
{
Cards[i].Suit = i / 13 + 3;
Cards[i].Rank = i % 13 + 1;
}
}
public void Shuffle() //洗牌
{
Random rand = new Random();
PokerCardUseUnitCode temp;
int T;
for (int i = 0; i < number; i++)
{
T = rand.Next(number);
temp = Cards[i];
Cards[i] = Cards[T];
Cards[T] = temp;
}
TopIndex = 0;
}
public PokerCardUseUnitCode Draw()
{
if (Cards[TopIndex + 1] == null)
{
Shuffle();
}
return Cards[TopIndex++];
}
}
}
PokerCardUseUnitCode.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FinalProject
{
class PokerCardUseUnitCode
{
public int Suit; //花色
public int Rank; //點數
public string RankToStr() //將點數轉為字串
{
string[] RankString = new string[] {"0", "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
return RankString[Rank];
}
public string SuitToUnicode() //將花色轉為 UnitCode 字元碼
{
string[] SuitUnitcode = new string[4] { "\u2663", "\u2666", "\u2665", "\u2660" }; //梅花 方塊 紅心 黑桃
return SuitUnitcode[Suit - 3];
}
public string ToPicString()
{
return (Suit-3).ToString() + "_" +Rank.ToString();
}
public override string ToString()
{
return RankToStr()+SuitToUnicode();
}
}
}
Player.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace FinalProject
{
abstract class Player
{
public bool _isPass = false;
public List _handCard = new List();
public int _number = 0;
public string _name = "";
public delegate PokerCardUseUnitCode Draw();
public Draw draw;
abstract public void Play(int number);//number[0]是計數 number[1]是humanplayer 出牌的index
public void LicensingCard(CardDeck Deck)//發牌5張
{
LicensingCard(Deck, 5);
}
public void LicensingCard(CardDeck Deck, int CardNum)//發牌
{
for (int i = 0; i < CardNum; i++)
{
_handCard.Add(Deck.Cards[Deck.TopIndex]);
Deck.TopIndex++;
}
}
public void DrawCard()//抽牌
{
_handCard.Add(draw());
}
}
}
HumanPlayer.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace FinalProject
{
class HumanPlayer:Player
{
public delegate void CardMessage(int playerNum, int cardNum);
public CardMessage cardMessage;
public override void Play(int cardNum)
{
cardMessage(_number, cardNum);
_handCard.RemoveAt(cardNum);
}
}
}
ComputerPlayer.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace FinalProject
{
class ComputerPlayer : Player
{
public delegate void CardMessage(int playerNum, int cardNum, out int tableNumber);
public CardMessage cardMessage;
//Ninetynine ninetynine = new Ninetynine();
//AI出牌,出牌方式:若牌面點數為99則依照K>J>4>5>10>Q,小於99則選擇非功能牌之點數最大且與牌面點數相加不超過99者
//若5張手排皆為功能牌也依照牌面點數為99時出牌
public override void Play(int tableNumber)
{
int index = 0;
if (tableNumber == 99 || ScanCard())
{
index = SpecialCard();
}
else
{
for (int i = 0; i < _handCard.Count; i++)
{
if (notSpecialCard(_handCard[i]))
{
if((!notSpecialCard(_handCard[index])))//初始值index=0可能會為特殊牌之情形
{
index=i;
}
if (_handCard[i].Rank >= _handCard[index].Rank && tableNumber + _handCard[i].Rank <= 99)
index = i;
}
}
}
cardMessage(_number, index,out tableNumber);
_handCard.RemoveAt(index); //移出手牌
DrawCard();
}
private bool ScanCard()//掃描5張手牌判斷是否皆為功能牌
{
for (int i = 0; i < _handCard.Count; i++)
{
if (notSpecialCard(_handCard[i]))
{
return false;
}
}
return true;
}
private int SpecialCard()//功能牌之出牌
{
int index = 0;
for (int i = 0; i < _handCard.Count; i++)
{
if (_handCard[i].Rank == 13)
{
index = i;
}
else if (_handCard[i].Rank == 11 && _handCard[index].Rank!=13)
{
index = i;
}
else if (_handCard[i].Rank == 4 && _handCard[index].Rank != 13 && _handCard[index].Rank != 11)
{
index = i;
}
else if (_handCard[i].Rank == 5 && _handCard[index].Rank != 13 && _handCard[index].Rank != 11 && _handCard[index].Rank != 4)
{
index = i;
}
else if (_handCard[i].Rank == 10 && _handCard[index].Rank != 13 && _handCard[index].Rank != 11 && _handCard[index].Rank != 4 && _handCard[index].Rank != 5)
{
index = i;
}
else if (_handCard[i].Rank == 12 && _handCard[index].Rank != 13 && _handCard[index].Rank != 11 && _handCard[index].Rank != 4 && _handCard[index].Rank != 5 && _handCard[index].Rank != 10)
{
index = i;
}
else
{
if (_handCard[i].Rank >= _handCard[index].Rank)
index = i;
}
}
return index;
}
private bool notSpecialCard(PokerCardUseUnitCode Card)
{
switch (Card.Rank)
{
case 4:
return false;
case 5:
return false;
case 10:
return false;
case 11:
return false;
case 12:
return false;
case 13:
return false;
default:
return true;
}
}
}
}
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.VisualBasic;
using System.Threading;
namespace FinalProject
{
public partial class Form1 : Form
{
PictureBox[][] PokerCardPic = new PictureBox[4][];
PictureBox[] PlayCardPic = new PictureBox[4];
CardDeck Deck1 = new CardDeck();
CardDeck Deck2 = new CardDeck(32);
Player[] Players = new Player[4];
Ninetynine ninetynine = new Ninetynine();
string[] playerName = { "無名", "祝英台", "聶小倩", "白素貞" };
public Form1()
{
InitializeComponent();
//四個玩家picturebox 存成矩陣方便後續處理
PokerCardPic[0] = new PictureBox[] { pic_1_1, pic_1_2, pic_1_3, pic_1_4, pic_1_5 };
PokerCardPic[1] = new PictureBox[] { pic_2_1, pic_2_2, pic_2_3, pic_2_4, pic_2_5 };
PokerCardPic[2] = new PictureBox[] { pic_3_1, pic_3_2, pic_3_3, pic_3_4, pic_3_5 };
PokerCardPic[3] = new PictureBox[] { pic_4_1, pic_4_2, pic_4_3, pic_4_4, pic_4_5 };
//玩家出的牌
PlayCardPic = new PictureBox[] { pic_PlayCardPlayer0, pic_PlayCardPlayer1, pic_PlayCardPlayer2, pic_PlayCardPlayer3 };
//new出4個玩家
Players[0] = new HumanPlayer();
Players[1] = new ComputerPlayer();
Players[2] = new ComputerPlayer();
Players[3] = new ComputerPlayer();
for (int i = 0; i < 4; i++)
{
Players[i]._number = i;
HumanPlayer hPlayer = Players[i] as HumanPlayer;
ComputerPlayer cPlayer = Players[i] as ComputerPlayer;
if (cPlayer != null)
cPlayer.cardMessage += ShowPokerCard;
if (hPlayer != null)
hPlayer.cardMessage += ShowPokerCard;
Players[i].draw += new Player.Draw(Deck1.Draw);
}
ninetynine.gameOver += GameOver;
//輸入名稱 inputbox
string name = Interaction.InputBox("請輸入玩家名稱");
if (name == "")
groupBox1.Text = "無名";
else
groupBox1.Text = name;
//對玩家每個picturebox加入點擊事件
foreach (PictureBox Pic in PokerCardPic[0])
{
Pic.Click += new EventHandler(PicClick);
}
rbtn_plus.CheckedChanged += new EventHandler(btn_PlayCardEnabled);
rbtn_minus.CheckedChanged += new EventHandler(btn_PlayCardEnabled);
cbo_player.SelectedIndexChanged += new EventHandler(btn_PlayCardEnabled);
Restart();
}
private void btn_Restart_Click(object sender, EventArgs e)
{
Restart();
}
//出牌
private void btn_PlayCard_Click(object sender, EventArgs e)
{
int PicNum = 0;
//找出哪張pic被點擊
foreach (PictureBox pic in PokerCardPic[0])
{
if (pic.Top == 0)
{
PicNum = int.Parse(pic.Name.Substring(6));
PlayCardPic[0].Image = Image.FromFile(Players[0]._handCard[PicNum - 1].ToPicString() + ".jpg");
pic.Top = 15;
break;
}
}
Players[0].Play(PicNum - 1);
Players[0].DrawCard();
for (int i = 0; i < 5; i++)
{
PokerCardPic[0][i].Image = Image.FromFile(Players[0]._handCard[i].ToPicString() + ".jpg");
PokerCardPic[0][i].Refresh();
}
groupBox1.Refresh();
if(cbo_player.SelectedIndex!=-1)
ninetynine.NextPlayerNum = cbo_player.SelectedIndex+1;
btn_PlayCard.Enabled = false;
lbl_YourTurn.Visible = false;
rbtn_plus.Enabled = false;
rbtn_plus.Visible = false;
rbtn_minus.Enabled = false;
rbtn_minus.Visible = false;
cbo_player.Enabled = false;
cbo_player.Visible = false;
cbo_player.SelectedIndex= -1;
while (!ninetynine.gameEnd)
{
if (ninetynine.NextPlayerNum == 0)
break;
Thread.Sleep(1000);
Players[ninetynine.NextPlayerNum].Play(ninetynine.TableNumber);
}
lbl_YourTurn.Visible = true;
}
private void Restart()
{
//deck
Deck1.Shuffle();//洗牌
for (int i = 0; i < 4; i++)
{
Players[i]._handCard.Clear();
Players[i].LicensingCard(Deck1);//發牌
//Players[i]._handCard.Sort(CompareByRank);//排序
}
//人類玩家
for (int i = 0; i < 5; i++)
{
PokerCardPic[0][i].Top = 15;
PokerCardPic[0][i].BringToFront();//把picture照先後順序排好
PokerCardPic[0][i].Image = Image.FromFile(Players[0]._handCard[i].ToPicString() + ".jpg");//把玩家的排顯示到picturebox
}
for (int i = 0; i < 5; i++)
{
PokerCardPic[0][i].Image = Image.FromFile(Players[0]._handCard[i].ToPicString() + ".jpg");
PokerCardPic[0][i].Refresh();
}
//電腦玩家
for (int j = 1; j < 4; j++)
{
for (int i = 0; i < 5; i++)
{
PokerCardPic[j][i].BringToFront();
Image image = Image.FromFile("0_0.jpg");
//Image image = Image.FromFile(Players[j]._handCard[i].ToPicString() + ".jpg");
if (j % 2 != 0)
image.RotateFlip(RotateFlipType.Rotate90FlipNone);//左右玩家要把排橫著顯示
PokerCardPic[j][i].Image = image;
}
}
ninetynine.NextPlayerNum = 0;
ninetynine.TableNumber = 0;
ninetynine.gameEnd = false;
ninetynine.CCW = true;
//介面
for (int i = 0; i < 4; i++)
{
PlayCardPic[i].Image = null;
}
txt_Count.Text = "0";
btn_PlayCard.Enabled = false;
rbtn_plus.Visible = false;
rbtn_plus.Checked = false;
rbtn_minus.Visible = false;
rbtn_minus.Checked = false;
cbo_player.Visible = false;
cbo_player.SelectedIndex = -1;
cbo_player.Enabled = true;
lbl_lose.Visible = false;
}
//PictureBox點擊後真正執行的程式
private void PicClick(object sender, EventArgs e)
{
PictureBox pic = sender as PictureBox;
int PicNum = int.Parse(pic.Name.Substring(6));
rbtn_minus.Visible = false;
rbtn_minus.Enabled = false;
rbtn_plus.Visible = false;
rbtn_plus.Enabled = false;
cbo_player.Visible = false;
cbo_player.Enabled = false;
if (pic.Top == 15)
{
foreach (PictureBox pics in PokerCardPic[0])
pics.Top = 15;
pic.Top = 0;
if (Players[0]._handCard[PicNum - 1].Rank == 5)
{
cbo_player.Visible = true;
cbo_player.Enabled = true;
}
else if (Players[0]._handCard[PicNum - 1].Rank == 10 || Players[0]._handCard[PicNum - 1].Rank == 12)
{
rbtn_minus.Visible = true;
rbtn_minus.Enabled = true;
rbtn_plus.Visible = true;
rbtn_plus.Enabled = true;
}
else
btn_PlayCard.Enabled = true;
}
else
{
pic.Top = 15;
btn_PlayCard.Enabled = false;
}
}
private void btn_PlayCardEnabled(object sender, EventArgs e)
{
btn_PlayCard.Enabled = true;
}
private void GameOver(int losePlayerNum)
{
lbl_lose.Visible = true;
if (losePlayerNum != 0)
lbl_lose.Text = playerName[losePlayerNum] + "輸了!";
else
lbl_lose.Text = "您輸了!";
}
//玩家出牌委託
public void ShowPokerCard(int playerNum, int cardNum)
{
string[] strArr = { "+", "-" };
string str = "";
if (rbtn_plus.Checked)
str = strArr[0];
else if (rbtn_minus.Checked)
str = strArr[1];
PlayCardPic[playerNum].Image = Image.FromFile(Players[playerNum]._handCard[cardNum].ToPicString() + ".jpg");
PlayCardPic[playerNum].Refresh();
ninetynine.Card(Players[playerNum]._handCard[cardNum].Rank, 0, str);
txt_Count.Text = ninetynine.TableNumber.ToString();
txt_Count.Refresh();
}
public void ShowPokerCard(int playerNum, int cardNum, out int tableNumber)
{
PlayCardPic[playerNum].Image = Image.FromFile(Players[playerNum]._handCard[cardNum].ToPicString() + ".jpg");
PlayCardPic[playerNum].Refresh();
ninetynine.Card(Players[playerNum]._handCard[cardNum].Rank, playerNum, "-");
tableNumber = ninetynine.TableNumber;
txt_Count.Text = ninetynine.TableNumber.ToString();
txt_Count.Refresh();
}
}
}
沒有留言:
張貼留言