用C#窗体做猜数字小游戏
玩法规则
通常由两个人玩,一方出数字,一方猜。出数字的人要想好一个没有重复数字的4个数,不能让猜的人知道。猜的人就可以开始猜。每猜一个数字,出数者就要根据这个数字给出几A几B,其中A前面的数字表示位置正确的数的个数,而B前的数字表示数字正确而位置不对的数的个数。
如正确答案为 5234,而猜的人猜 5346,则是 1A2B,其中有一个5的位置对了,记为1A,而3和4这两个数字对了,而位置没对,因此记为 2B,合起来就是 1A2B。
接着猜的人再根据出题者的几A几B继续猜,直到猜中(即 4A0B)为止。
猜数字游戏通常设有猜测次数的上限。根据计算机测算,如果采用严谨的猜测策略,任何数字最多7次就可猜出(即达到 4A0B)。值得注意的是,在有些地方把次数上限定义为最多几次猜测以后就可以肯定数字是几,但这时或还需要再猜一次才能得到 4A0B 的结果。
标准的猜数字游戏由10个数码(0-9)和4个数位组成。可以通过变化数码或数位来丰富游戏。例如,可以使用9个数码玩4个数位的游戏。
猜数字游戏的一种变体允许重复的数码。这种规则的游戏被称为 Mastermind。其规则大致为:
除了上面的规则外,如果有出现重复的数字,则重复的数字每个也只能算一次,且以最优的结果为准。例如,如正确答案为5543,猜的人猜5255,则在这里不能认为猜测的第一个5对正确答案第二个,根据最优结果为准的原理和每个数字只能有一次的规则,两个比较后应该为1A1B,第一个5位子正确,记为1A;猜测数字中的第三个5或第四个5和答案的第二个5匹配,只能记为1B。当然,如果有猜5267中的第一个5不能与答案中的第二个5匹配,因此只能记作1A0B。
窗体界面
这里用button去控制游戏
显示用了label
主程序:
namespace WindowsFormsApp7
{
public partial class Form1 : Form
{
public static Form1 form; //创建一个可以在其他类调用的窗口属性
public String[] GuessNum = new String[4];//存放输入的数字
public String[] RightNum = new String[4];//存放正确的数字
public Form1()
{
InitializeComponent();
form = this; //赋值给窗口属性
}
private void beginGame()
{
//首先清空数组
for(int i=0; i<4;i++)
{
GuessNum[i] = null;
}
label5.Text = null;
label6.Text = null;
Class1.display(GuessNum);
}
//开始游戏
private void button11_Click(Object sender, EventArgs e)
{
beginGame();
Class1.random4(RightNum); //生成四个随机数
Class1.display(GuessNum);//调用显示函数
}
//重新开始
private void button12_Click(Object sender, EventArgs e)
{
beginGame();
button11_Click(sender, e); //调用开始游戏函数
}
//确定
private void button13_Click(Object sender, EventArgs e)
{
Class1.judgement(GuessNum, RightNum);
}
//退出游戏
private void button14_Click(Object sender, EventArgs e)
{
Application.Exit();//程序退出
}
//删除
private void button15_Click(Object sender, EventArgs e)
{
if (GuessNum[0] == null)
{
return;//整体函数结束
}
for(int i=GuessNum.Length-1;i>=0;i--)
{
if(GuessNum[i]==null)
{
continue;//跳出本循环
}
GuessNum[i] = null; //删除数字
Class1.display(GuessNum);//调用显示函数
break;//结束
}
}
//添加数字
private void button3_Click(Object sender, EventArgs e)
{
Class1.AddNum(GuessNum,((Button)sender).Text);//获取button的text并传入
}
private void button1_Click(Object sender, EventArgs e)
{
Class1.AddNum(GuessNum, ((Button)sender).Text);//获取button的text并传入
}
private void button2_Click(Object sender, EventArgs e)
{
Class1.AddNum(GuessNum, ((Button)sender).Text);//获取button的text并传入
}
private void button4_Click(Object sender, EventArgs e)
{
Class1.AddNum(GuessNum, ((Button)sender).Text);//获取button的text并传入
}
private void button5_Click(Object sender, EventArgs e)
{
Class1.AddNum(GuessNum, ((Button)sender).Text);//获取button的text并传入
}
private void button6_Click(Object sender, EventArgs e)
{
Class1.AddNum(GuessNum, ((Button)sender).Text);//获取button的text并传入
}
private void button7_Click(Object sender, EventArgs e)
{
Class1.AddNum(GuessNum, ((Button)sender).Text);//获取button的text并传入
}
private void button8_Click(Object sender, EventArgs e)
{
Class1.AddNum(GuessNum, ((Button)sender).Text);//获取button的text并传入
}
private void button9_Click(Object sender, EventArgs e)
{
Class1.AddNum(GuessNum, ((Button)sender).Text);//获取button的text并传入
}
private void button10_Click(Object sender, EventArgs e)
{
Class1.AddNum(GuessNum, ((Button)sender).Text);//获取button的text并传入
}
private void Form1_Load(Object sender, EventArgs e)
{
}
private void button16_Click(Object sender, EventArgs e)
{
Class1.display(RightNum);
}
}
}
定义了一个类
namespace WindowsFormsApp7
{
class Class1
{
//显示数字方法
public static void display(String[] RightNum)
{
//把传进来的值Form1 中的label
Form1.form.label1.Text = RightNum[0];//个位
Form1.form.label2.Text = RightNum[1];//十位
Form1.form.label3.Text = RightNum[2];//百位
Form1.form.label4.Text = RightNum[3];//千位
}
//写数字
public static void AddNum(String[] GuessNum, String wei)
{
if (GuessNum[3] != null)
{
return; //如果第三位为不为null 跳出次函数
}
for (int i = 0; i < GuessNum.Length; i++) //循环赋值
{
if (GuessNum[i] == null)
{
GuessNum[i] = wei; //获取传入的label的text
display(GuessNum);
break;
}
}
}
//生成四个不重复的0—9
public static void random4(String[] RightNum)
{
//有重复的用goto重复执行
ran:
Random num = new Random();//生成四个随机数
for (int i = 0; i < 4; i++)
{
string ran = num.Next(0,9).ToString();
RightNum[i] = ran;
}
if ((RightNum[0] == RightNum[1])||(RightNum[0] == RightNum[2]) ||(RightNum[0] == RightNum[3]) ||(RightNum[1] == RightNum[2])||(RightNum[1] == RightNum[3]) ||(RightNum[2] == RightNum[3]) )
{
goto ran;//判断是否存在重复的,一个个比较,这个方法比较有局限
}
else
{
return;//结束本函数
}
}
// 判断几A几B
public static void judgement(string []GuessNum,String[] RightNum)
{
int A = 0;
int B = 0;
int C = 0;
for(int i=0;i<4;i++)
{
if(GuessNum[i]==RightNum[i])
{
A++; //正确的数字和猜的数字按位比较,输出A为位置正确的数字
}
for(int j=0;j<4;j++)
{
if(GuessNum[i]==RightNum[j])//正确的数字每位都和猜的数字每位比较 一共16次
{
B++; //B表示位正确的数字和位置不对但数对的和
}
}
}
C = B - A;//位置不对但数对的个数
if(C<=0)//C可能存在负数的情况
{
C = 0;
}
Form1.form.label5.Text = A.ToString();
Form1.form.label6.Text = C.ToString();
}
}
}
注意在这里需要把label改成public 因为label在其他类调用的
实际效果
刚学C#程序中还有很多可以补充的,多多指教 。