二、洗牌 我刚才说错了,数字也要初始化的 // 初始化,poker[0]做为洗牌时的临时变量 int[] poker = new int[53]; // 赋初值1-52 for(int i = 1; i < 53; i ++) { poker[i] = i; } // 声明一个随机数生成变量用当前时间做为种子 Random rnd = new Random((int)DateTime.Now.Ticks); int j = 0; for(int i = 1; i < 53; i++) { j = rnd.Next(53-i); poker[0]=poker[53-i]; poker[53-i]=poker[j]; poker[j]=poker[0]; }
三、发牌 // 定义一个两维的数组表示4个玩家的牌,也可以定义4个一维的数组,下面赋值的时候就要用switch语句了 int[,] player = new int[4,13]; for(int i = 0; i < 52; i++) { int x = i % 4; // 取得余数,表示第几个玩家 int y = i / 4; // 取得商家,表示发第几轮的牌 player[x, y] = poker[i + 1]; }
using System; using System.Collections.Generic; using System.Text;namespace 控制台程序 { class 一张牌 { public byte 花色; // 1..4 public byte 点数; // 1..13 public 一张牌(byte 花色, byte 点数) { this.点数 = 点数; this.花色 = 花色; } public override string ToString() { string 花色名; switch (花色) { case 1: 花色名 = "黑"; break; case 2: 花色名 = "红"; break; case 3: 花色名 = "梅"; break; case 4: 花色名 = "方"; break; default: 花色名 = ""; break; } string 点数名; switch (点数) { case 1: 点数名 = "A"; break; case 11: 点数名 = "J"; break; case 12: 点数名 = "Q"; break; case 13: 点数名 = "K"; break; default: 点数名 = 点数.ToString(); break; } return string.Format("{0}{1}", 花色名, 点数名); } } class 一副牌 { public static List<一张牌> 牌列表 = new List<一张牌>(); public static Random 随机数 = new Random(); public 一副牌() { for (byte i = 1; i <= 4; i++) { for (byte j = 1; j <= 13; j++) { 牌列表.Add(new 一张牌(i, j)); } } } public 一张牌 发牌() { if (牌列表.Count <= 0) return null; 一张牌 返回值 = null; int i = (int)(牌列表.Count * 随机数.NextDouble()); 返回值 = 牌列表[i]; 牌列表.RemoveAt(i); return 返回值; } } class 程序 { static void Main(string[] args) { 一副牌 一副牌实例 = new 一副牌(); for (int i = 1; i <= 4; i++) { Console.Write("{0}:", i); for (int j = 1; j <= 13; j++) { 一张牌 一张牌实例 = 一副牌实例.发牌(); if (一张牌实例 != null) Console.Write(一张牌实例.ToString()); } Console.WriteLine(); } Console.ReadKey(); } } }
第一个类:一张牌(成员包括:点数,花色)第二个类:一副牌(成员包括数组[52] 洗牌方法发牌方法)最后在主程序中输出.
一、用什么样的变量表示牌面
二、洗牌
三、发牌
一、用什么样的变量表示牌面
我这里定义1-52的数字表示一副牌所有的牌面,1-52中任意一个数字除以4,商为点数(A-K、A=0、K=12)余数为花色(0=方块、1=梅花、2=红心、3=黑桃)
这样做法的优点是J=10,10*4=40,40-43就是方块J-黑桃J,我们要判断两张J哪一张花色大直接用>号就可以判断了
我刚才说错了,数字也要初始化的 // 初始化,poker[0]做为洗牌时的临时变量
int[] poker = new int[53]; // 赋初值1-52
for(int i = 1; i < 53; i ++)
{
poker[i] = i;
} // 声明一个随机数生成变量用当前时间做为种子
Random rnd = new Random((int)DateTime.Now.Ticks); int j = 0;
for(int i = 1; i < 53; i++)
{
j = rnd.Next(53-i);
poker[0]=poker[53-i];
poker[53-i]=poker[j];
poker[j]=poker[0];
}
// 定义一个两维的数组表示4个玩家的牌,也可以定义4个一维的数组,下面赋值的时候就要用switch语句了
int[,] player = new int[4,13]; for(int i = 0; i < 52; i++)
{
int x = i % 4; // 取得余数,表示第几个玩家
int y = i / 4; // 取得商家,表示发第几轮的牌
player[x, y] = poker[i + 1];
}
using System.Collections.Generic;
using System.Text;namespace 控制台程序
{
class 一张牌
{
public byte 花色; // 1..4
public byte 点数; // 1..13
public 一张牌(byte 花色, byte 点数)
{
this.点数 = 点数;
this.花色 = 花色;
}
public override string ToString()
{
string 花色名;
switch (花色)
{
case 1:
花色名 = "黑";
break;
case 2:
花色名 = "红";
break;
case 3:
花色名 = "梅";
break;
case 4:
花色名 = "方";
break;
default:
花色名 = "";
break;
}
string 点数名;
switch (点数)
{
case 1:
点数名 = "A";
break;
case 11:
点数名 = "J";
break;
case 12:
点数名 = "Q";
break;
case 13:
点数名 = "K";
break;
default:
点数名 = 点数.ToString();
break;
}
return string.Format("{0}{1}", 花色名, 点数名);
}
}
class 一副牌
{
public static List<一张牌> 牌列表 = new List<一张牌>();
public static Random 随机数 = new Random();
public 一副牌()
{
for (byte i = 1; i <= 4; i++)
{
for (byte j = 1; j <= 13; j++)
{
牌列表.Add(new 一张牌(i, j));
}
}
}
public 一张牌 发牌()
{
if (牌列表.Count <= 0) return null;
一张牌 返回值 = null;
int i = (int)(牌列表.Count * 随机数.NextDouble());
返回值 = 牌列表[i];
牌列表.RemoveAt(i);
return 返回值;
}
}
class 程序
{
static void Main(string[] args)
{
一副牌 一副牌实例 = new 一副牌();
for (int i = 1; i <= 4; i++)
{
Console.Write("{0}:", i);
for (int j = 1; j <= 13; j++)
{
一张牌 一张牌实例 = 一副牌实例.发牌();
if (一张牌实例 != null)
Console.Write(一张牌实例.ToString());
}
Console.WriteLine();
}
Console.ReadKey();
}
}
}