C#-wpf一个简单的井字棋程序
C#-wpf⼀个简单的井字棋程序
简单康乃馨的做法手工
前⾔
好久没有碰过代码了,上次看C#估计还是上个学期233,这次⽼师突然布置了⼀个C#语⾔编写的井字棋程序让我有点措⼿不及.不过,仗着微软爸爸的vs的强⼤的代码补全能⼒,最后还是将这个程序做好了(遇到了很多坑).
要求
该程序的要求还是有点多了,以下⼀⼀列举:
1. 在程序初始化时,要求输⼊玩家⽤户名,输⼊后出现提⽰⽂字,并选择是先⼿还是后⼿.
2. 点击Fight!后,进⼊游戏界⾯,在九宫格中下⼀步棋后,电脑(敌⼈)会判断形势并下第⼆部棋,如此直⾄有三⼦连成⼀线(玩家或电脑赢),或者格⼦被占满(和局).旁边有提⽰按钮,点击后会出现提⽰;得分按钮会出现具体的得分界⾯;退出按钮则会退出程序
3. 得分界⾯,点开后会显⽰⾃⼰的得分情况.最⾼得分按钮会记录玩家玩这个游戏以来所得的最⾼分;打印按钮则会打印⾃⼰的具体得分情况
主体
⾸先制作打开程序时出现的”登录”界⾯,即该程序的mainwindow:
样式:
这⾥要注意的是,只有当输⼊完姓名后才能出现下⾯的提⽰⽂字等控件,所以应事先将其属性定为隐藏,点击”commit”按钮后触发事件在玩家确定好是否先⼿后,就该点击Fight!按钮进⼊游戏界⾯了
private void btm_commit_click(object sender, RoutedEventArgs e)
{
if (TBox1.Text.Length >0&&TBox1.Text.Length <10)//判断玩家输⼊的⽂字长度,更为严谨的做法应该是判断字母+数字的长度,以及玩家输⼊的字符串不符            {
storage .name  = TBox1.Text ;//定义在storage 类中的静态变量,为了存储玩家名称,成绩等信息
TBlock2.Text  = "Hi " + storage .name  + ". Welcome to the battlefield!Now,lets begin the gameHey,do you want to place a bomb first?";//其实应该
TBlock2.Visibility  = Visibility .Visible ;//显⽰提⽰⽂本块
RB1.Visibility  = Visibility .Visible ;//显⽰单选按钮,让⽤户选择是否先⼿
RB2.Visibility  = Visibility .Visible ;//同上
btm_fight .Visibility  = Visibility .Visible ;//显⽰进⼊游戏界⾯的按钮
btm_commit .IsEnabled  = false ;//禁⽌玩家再次点击commit 按钮
}
}
函数单调性其次,开始制作井字棋程序最复杂的游戏部分,即mainpage
样式:
在拖好控件后,⾃然要去实现他们的功能.⾸先是九宫格,我的想法是玩家(假设是玩家先⼿,并永远下”X”棋)下出第⼀步棋后,按钮打印
出”X”字母,并且在后台的对应于该按钮的值变为1;⽽电脑(永远下”O”棋)下棋后,按钮打印出”O”字母,
并且在后台的对应于该按钮的值变为-1;⽽没有下任何棋的按钮则不会打印出任何字母,并且在后台的对应于该按钮的值为0.
三字连成⼀线的情况总共有8种,为了更快速的判断是否出现了特殊情况(两⼦⼀线,三⼦⼀线),可以将这些情况列成⼀个8⾏3列的数组以供判断函数或者电脑使⽤
private  void  to_main_page_click (object  sender, RoutedEventArgs e)
{
if (RB1.IsChecked==true )//玩家点击"yes"按钮时,设置静态布尔类型变量RButton 的值并进⼊游戏界⾯"mainpage"
{
RButton = true ;
this .Content = new  mainpage();
}
else  if  (RB2.IsChecked == true )//玩家点击"no"按钮后,类同yes
{
RButton = false ;
this .Content = new  mainpage();
}
else //玩家没有点击单选按钮的情形,出现提⽰信息并不触发进⼊游戏界⾯的事件,其实想想是否让程序预先设定好"yes"单选按钮就没有这⼀步了呢?            {
TBcheck.Visibility = Visibility.Visible;
}        }
搞鬼一家人private  void  Btm0_Click (object  sender, RoutedEventArgs e)//按钮点击触发事件,即玩家点击后的结果.9个按钮均与此类似
{
if  (btm[btm0]==0)//按钮与后台的值组成键值对的字典,判断当按钮后台的值为0时
{
btm0.Content="X";//按钮btm0的内容变为"X",打印出"X"字母
btm[btm0] = 1;//按钮后台的值变为1
computer();//电脑的操作,事实上除了下另⼀步棋外,还执⾏了判断是否赢或输或平局的函数,因此没有单独列出
}
}
private void update()
{
array_for_judge[0] = new int[3] { btm[btm0], btm[btm1], btm[btm2] };//第⼀⾏3⼦
array_for_judge[1] = new int[3] { btm[btm3], btm[btm4], btm[btm5] };//第⼆⾏3⼦
array_for_judge[2] = new int[3] { btm[btm6], btm[btm7], btm[btm8] };//第三⾏3⼦
array_for_judge[3] = new int[3] { btm[btm0], btm[btm3], btm[btm6] };//第⼀列3⼦
array_for_judge[4] = new int[3] { btm[btm1], btm[btm4], btm[btm7] };//第⼆列3⼦
array_for_judge[5] = new int[3] { btm[btm2], btm[btm5], btm[btm8] };//第三列3⼦
array_for_judge[6] = new int[3] { btm[btm0], btm[btm4], btm[btm8] };//右斜3⼦
array_for_judge[7] = new int[3] { btm[btm2], btm[btm4], btm[btm6] };//左斜3⼦
}
每次玩家或者电脑⾛完⼀步棋后,都得判断是否出现赢或输或平局的情况,若出现,将刷新棋盘并记录信息
private void judge()//判断函数
{
update();//更新信息
foreach (int[] tmp in array_for_judge)
{
if (Array.TrueForAll(tmp, isone => (isone == 1)) == true)//判断3⼦全为1,即玩家连成3⼦的情况                {
MessageBox.Show("you win!");//弹出消息框,玩家赢
storage.battle++;//storage类的静态变量,存储对局次数
storage.win++;//同,存储玩家赢的次数
flush();//刷新棋盘,即设置按钮⽂本全为空,后台值全为0,在此不单独列出该函数
}
else if (Array.TrueForAll(tmp, isone => (isone == -1)) == true)//判断3⼦全为-1,即电脑连成3⼦的情况                {
MessageBox.Show("you lose!");
storage.battle++;
storage.lose++;
flush();
}
}
if (btm.ContainsValue(0) == false)//最后判断没有⼦为0,即棋盘下满仍没有胜负的情况,平局            {
MessageBox.Show("draw!");
storage.battle++;
storage.tie++;
flush();
}
}
电脑也需要根据棋盘的形势下棋,在此列出3种情况:
1. 当电脑的棋⼦已有2⼦⼀线,并且该线⽆第3⼦时,下第3⼦取得胜利
2. 当玩家的棋⼦已有2⼦⼀线,并且该线⽆第3⼦时,下第3⼦阻⽌玩家取得胜利
3. 当⽆以上情况时,随机选择并落⼦
private int computer()//返回值是为了跳出该函数⽤的,并⽆太⼤意义
{
judge();//⾸先为玩家判断是否已出现能赢或平局的可能
if (btm.ContainsValue(1) == false&&btm.ContainsValue(-1)==false)//判断按钮的值全为0的情形,即棋盘已被刷新,跳出该函数            {
return0;
}
对联上下联
for (int i = 0; i < array_for_judge.Length; i++)//进⾏特殊情况判断
{
if (array_for_judge[i].Sum() == -2)//判断2⼦为-1,另1⼦为0的情况,即第⼀种情况
{
int j = Array.IndexOf(array_for_judge[i], 0);
btm[to_dic_int(i, j)] = -1;//这⾥我不知道如何从已列出特殊情形的数组中取得原本按钮的信息,只好采取最笨拙的⽅式--定义函数建⽴特殊情形数组与                    to_dic_int(i, j).Content()="O";//设置按钮的内容为"O"
judge();//再次进⾏胜负判断
return0;
}
if (array_for_judge[i].Sum() == 2)//阻⽌玩家获胜的情形
{
int j = Array.IndexOf(array_for_judge[i], 0);
btm[to_dic_int(i, j)] = -1;
to_dic_int(i, j).Background = Image2();
judge();
return1;
}无什么无什么的成语
}
Random random = new Random();//随机落⼦的情形
while (true)⽆限循环直⾄随机落⼦并且该按钮的值为0
{
int tmp = random.Next(24);
int itmp = tmp % 8;
int jtmp = tmp % 3;
if (array_for_judge[itmp][jtmp] == 0)
{
btm[to_dic_int(itmp, jtmp)] = -1;
to_dic_int(itmp, jtmp).Background = Image2();
judge();
return2;
}
就业好的专业
}
}
还要设置电脑先⼿的情况
if (MainWindow.RButton == false)//在游戏界⾯初始化时进⾏判断,当玩家之前选择false单选按钮时让电脑先执⾏⼀步
{
first_computer();//随机让电脑在九宫格中落⼦
}
Show Help按钮

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。