你的位置:首页 > 软件开发 > ASP.net > 【趣味分享】C#实现回味童年的24点算法游戏

【趣味分享】C#实现回味童年的24点算法游戏

发布时间:2016-12-26 11:00:09
一、24点游戏玩法规则效果展示1、初始化界面2、开始游戏界面3、游戏超时界面 4、查看答案界面 5、答对界面6、答错界面7、计算表达式的验证界面 8、一副牌算完开始新一副牌界面 到这里24点算法基本操作图就结束了,下面来看看示例代码吧。二、完整代码演示 关于代 ...

 一、24点游戏玩法规则效果展示

1、初始化界面

【趣味分享】C#实现回味童年的24点算法游戏

2、开始游戏界面

【趣味分享】C#实现回味童年的24点算法游戏

3、游戏超时界面

 【趣味分享】C#实现回味童年的24点算法游戏

4、查看答案界面

 【趣味分享】C#实现回味童年的24点算法游戏

5、答对界面

【趣味分享】C#实现回味童年的24点算法游戏

6、答错界面

【趣味分享】C#实现回味童年的24点算法游戏

7、计算表达式的验证界面

【趣味分享】C#实现回味童年的24点算法游戏

 【趣味分享】C#实现回味童年的24点算法游戏

8、一副牌算完开始新一副牌界面

【趣味分享】C#实现回味童年的24点算法游戏

 到这里24点算法基本操作图就结束了,下面来看看示例代码吧。

二、完整代码演示

 关于代码解释,为了方便读者浏览时更好理解代码的含义,我把注释都写在代码里面了。因为一开始我只考虑到功能上的实现并没有考虑代码的优化所以代码我就全写在一个页面了。至于那些生成扑克牌类、计算类等代码优化方面的内容就留给想要实现这个24点算法游戏的读者自己去完善吧。

【趣味分享】C#实现回味童年的24点算法游戏【趣味分享】C#实现回味童年的24点算法游戏
 1 using System; 2 using System.Collections; 3 using System.Collections.Generic; 4 using System.ComponentModel; 5 using System.Data; 6 using System.Draget='_blank'>wing; 7 using System.IO; 8 using System.Linq; 9 using System.Text; 10 using System.Threading.Tasks; 11 using System.Windows.Forms; 12  13 namespace XF_24Point 14 { 15   public partial class frnMain : Form 16   { 17     private int A, B, C, D;//牌面大小对应的数字大小也用于交换数字的位置 18     private int NumberA, NumberB, NumberC, NumberD;//牌面大小对应的数字大小 19     private int topCard;//显示在窗体四张牌中扑克牌的编号(1-52) 20     DateTime beginTime;//记录开始时间 21     22     #region 一副牌的生成 23     //结构: 值得一提的是,在C++中,struct的功能得到了强化,struct不仅可以添加成员变量,还可以添加成员函数,和class类似。 24     struct card 25     { 26       public int face;//牌面大小,数字大小 27       public int suit;//牌面花色,如梅花、黑桃、红心、方块,只能有四张 28       public int count;//牌面点数,牌面上的的图案点数 29       public bool faceup;//牌面是否向上 30     } 31     private card[] PlayingCards;//一副牌 32  33     //生成一副牌 34     private void GetPlayingCareds() 35     { 36       PlayingCards = new card[53]; 37       int i;//牌面大小 38       int j;//牌面花色 39       for (i = 0; i < 13; i++) 40       { 41         for (j = 1; j <= 4; j++) 42         { 43           PlayingCards[j + i * 4].face = i + 1;//PlayingCards[j + i * 4]:指的是:j + i * 4 =>获取文件图片扑克牌的序号 44           PlayingCards[j + i * 4].suit = j;//牌面花色,如梅花、黑桃、红心、方块,只能有四张 45           if (i < 10) 46           { 47             PlayingCards[j + i * 4].count = i + 1;//牌面点数,牌面上的的图案点数 48           } 49           else 50           { 51             PlayingCards[j + i * 4].count = 10; 52           } 53           PlayingCards[j + i * 4].faceup = false; 54         } 55       } 56     } 57     //洗牌 :Shuffle 58     private void Shuffle() 59     { 60       Random random = new Random((int)DateTime.Now.Ticks); 61       card middleCard;//作为临时交换牌顺序的变量 62       int j, k; 63       for (int i = 0; i < 1000; i++) 64       { 65         j = (int)random.Next(1, 52); 66         k = (int)random.Next(1, 52); 67         //打乱牌的顺序(随机交换牌的顺序) 68         middleCard = PlayingCards[j]; 69         PlayingCards[j] = PlayingCards[k]; 70         PlayingCards[k] = middleCard; 71       } 72     } 73     //开始游戏的时候发四张牌 74     private void btnStart_Click(object sender, EventArgs e) 75     { 76       lblInput.Text = ""; 77       GetPlayingCareds();//生成一副牌 78       Shuffle();//洗牌 79       topCard = 0;//显示在窗体四张牌中扑克牌的编号(1-52) 80       int imageNum;//文件夹中扑克牌图片的编号(文件名) 81       string path; 82       //画第一张牌 83       topCard = topCard = 1; 84       pictureBox1.Visible = true; 85       //获得文件中某张牌并且知道是什么花色对应的编号计算公式: 86       //牌面花色(1、2、3、4):要获得某张牌的的花色 87       //(牌面数字大小-1)*4:要获得的某张牌的前一个牌面大小如:要获得的牌是10,前一个牌面就是9 88       //牌面花色(1、2、3、4)+(牌面数字大小-1)*4 89       imageNum = PlayingCards[topCard].suit + (PlayingCards[topCard].face - 1) * 4;//文件图片编号 90       path = Directory.GetCurrentDirectory() + @"\images\" + imageNum.ToString() + ".bmp"; 91       pictureBox1.Image = Image.FromFile(path); 92       NumberA = Convert.ToInt32(PlayingCards[topCard].face);//牌面大小对应的数字大小 93       btnNumber1.Text = NumberA.ToString(); 94       //画第二张牌 95       topCard = topCard + 1; 96       pictureBox2.Visible = true; 97       imageNum = PlayingCards[topCard].suit + (PlayingCards[topCard].face - 1) * 4; 98       path = Directory.GetCurrentDirectory() + @"\images\" + imageNum.ToString() + ".bmp"; 99       pictureBox2.Image = Image.FromFile(path);100       NumberB = Convert.ToInt32(PlayingCards[topCard].face);101       btnNumber2.Text = NumberB.ToString();102       //画第三张牌103       topCard = topCard + 1;104       pictureBox3.Visible = true;105       imageNum = PlayingCards[topCard].suit + (PlayingCards[topCard].face - 1) * 4;106       path = Directory.GetCurrentDirectory() + @"\images\" + imageNum.ToString() + ".bmp";107       pictureBox3.Image = Image.FromFile(path);108       NumberC = Convert.ToInt32(PlayingCards[topCard].face);109       btnNumber3.Text = NumberC.ToString();110       //画第四张牌111       topCard = topCard + 1;112       pictureBox4.Visible = true;113       imageNum = PlayingCards[topCard].suit + (PlayingCards[topCard].face - 1) * 4;114       path = Directory.GetCurrentDirectory() + @"\images\" + imageNum.ToString() + ".bmp";115       pictureBox4.Image = Image.FromFile(path);116       NumberD = Convert.ToInt32(PlayingCards[topCard].face);117       btnNumber4.Text = NumberD.ToString();118       //初始化界面控件119       btnStart.Visible = false;//开始游戏120       groupBox1.Visible = true;//计算表达式121       groupBox2.Visible = true;//查看答案122       groupBox3.Visible = true;//游戏规则123       lblShowTime.Visible = true;//显示时间124       timer1.Enabled = true;//启用时钟125       beginTime = DateTime.Now;126     }127     #endregion128 129     public frnMain()130     {131       InitializeComponent();132       Initialize();//初始化窗体上的控件的方法133     }134 135     //初始化窗体上的控件的方法,一开始隐藏136     private void Initialize()137     {138       pictureBox1.Visible = false;139       pictureBox2.Visible = false;140       pictureBox3.Visible = false;141       pictureBox4.Visible = false;142       groupBox1.Visible = false;143       groupBox2.Visible = false;144       groupBox3.Visible = false;145       lblResult.Visible = false;146       lblShowTime.Visible = false;147     }148 149     #region 计算表达式的输入150     //第一张牌151     private void btnNumber1_Click(object sender, EventArgs e)152     {153       lblInput.Text = lblInput.Text + btnNumber1.Text.Trim();154     }155     //第二张牌156     private void btnNumber2_Click(object sender, EventArgs e)157     {158       lblInput.Text = lblInput.Text + btnNumber2.Text.Trim();159     }160     //第三张牌161     private void btnNumber3_Click(object sender, EventArgs e)162     {163       lblInput.Text = lblInput.Text + btnNumber3.Text.Trim();164     }165     //第四章牌166     private void btnNumber4_Click(object sender, EventArgs e)167     {168       lblInput.Text = lblInput.Text + btnNumber4.Text.Trim();169     }170     //加号171     private void btnAdd_Click(object sender, EventArgs e)172     {173       lblInput.Text = lblInput.Text + btnAdd.Text.Trim();174     }175     //减号176     private void btnMinus_Click(object sender, EventArgs e)177     {178       lblInput.Text = lblInput.Text + btnMinus.Text.Trim();179     }180     //乘号181     private void btnMulti_Click(object sender, EventArgs e)182     {183       lblInput.Text = lblInput.Text + btnMulti.Text.Trim();184     }185     //除号186     private void btnDivide_Click(object sender, EventArgs e)187     {188       lblInput.Text = lblInput.Text + btnDivide.Text.Trim();189     }190     //左括号191     private void btnLeft_Click(object sender, EventArgs e)192     {193       lblInput.Text = lblInput.Text + btnLeft.Text.Trim();194     }195     //右括号196     private void btnRight_Click(object sender, EventArgs e)197     {198       lblInput.Text = lblInput.Text + btnRight.Text.Trim();199     }200     //删除最后一个字符201     private void btnDelete_Click(object sender, EventArgs e)202     {203       string input = lblInput.Text.Trim();204       lblInput.Text = input.Substring(0, input.Length - 1);205     }206     //清除所有字符207     private void btnClear_Click(object sender, EventArgs e)208     {209       lblInput.Text = "";210     }211 212     #endregion213 214     //确定按钮215     private void btnEnter_Click(object sender, EventArgs e)216     {217       if (lblInput.Text.Trim()== "")218       {219         MessageBox.Show("计算表达式不能为空!");220         return;221       }222       if (CheckForNumber(lblInput.Text.Trim()))//检查输入表达式中输入的数字是否匹配223       {224         //计算表达式的结果第一层225         int result = Deal(lblInput.Text.Trim());//调用Deal()处理方法,对用户输入的表达式做一系列判断计算,返回最终的结果226         lblResult.Visible = true;227         if (result == 24)228         {229           lblResult.Text = "<<---恭喜您,答对了!--->>";230           timer1.Enabled = false;//暂停时钟231         }232         else233         {234           lblResult.Text = "<<--抱歉,您的回答有误!-->>";235         }236       }237     }238 239     #region 验证确定按钮包含的一系列方法:检查计算用户输入表达式结果是否正确240     //处理Deal谓词表达式中的括号241     private int Deal(string InputExp)242     {243       int result = 0;244       while (InputExp.IndexOf(')') != -1)//判断是否存在括号 input.IndexOf(')') !=-1,表明存在括号245       {246         //3*8÷(9-8)=24、(10+2)*(3-1)=24247         int rightLoc = InputExp.IndexOf(')');//右括号的位置248         string temp = InputExp.Substring(0, rightLoc);//从0(开始位置)到右括号的位置,不包括右括号(10+2249         int leftLoc = temp.LastIndexOf('(');//左括号的位置0250         string first = InputExp.Substring(0, leftLoc);//从0到左括号的位置,空251         string middle = InputExp.Substring(leftLoc + 1, rightLoc - leftLoc - 1);//括号中间的部分10+2252         string last = InputExp.Substring(rightLoc + 1);//右括号后面的部分*(3-1)253         //计算表达式的结果第二层254         InputExp = first + Formula(middle) + last; //""+10+2+*(3-1)注意:+表示连接,连接两个字符串255       }256       //计算表达式的结果第二层257       result = Formula(InputExp);//调用用户输入表达式检查、计算方法,返回用户输入表达式的结果Formula:公式258       return result;259     }260 261     //最简式运算 Formula:公式262     private int Formula(string InputExp)263     {264       int length = InputExp.Length;//验证表达式的长度265       ArrayList OpeLoc = new ArrayList();//记录运算操作符位置  266       ArrayList Ope = new ArrayList();//记录运算操作符 267       ArrayList Value = new ArrayList();//记录数值内容 ,也就是记录输入表达式的数字的值268       int i;//全局变量i,运用于方法体内每个循环269       for (i = 0; i < length; i++)270       {271         if (IsOperator(InputExp[i]))//检查获判断一个符号是否是基本算符 272         {273           OpeLoc.Add(i);//记录并添加运算操作符位置x274           Ope.Add(InputExp[i]);//记录并添加运算操作符 275         }276       }277       if (OpeLoc.Count == 0)278       {279         return int.Parse(InputExp);//处理无运算符的情况280       }281       //计算表达式的结果第三层282       RebuildOperator(ref OpeLoc, ref Ope);//对运算符进行重新组合,把负号和减号区分开来283       if (!CheckFunction(OpeLoc, length))284       {285         return 0;//检查功能,判断运算符组是否合法 ,也就是运算符位置是否正确286       }287       int j = 0;288       for (i = 0; i < OpeLoc.Count; i++)289       {290         Value.Add(int.Parse(InputExp.Substring(j, Convert.ToInt32(OpeLoc[i]) - j)));291         j = Convert.ToInt32(OpeLoc[i]) + 1;//最后一个数值的索引292       }293       //substring(开始索引,字符长度)294       Value.Add(int.Parse(InputExp.Substring(j, length - j)));//处理最后一个数值的添加295       //计算表达式的结果第四层296       return Calculate(Ope, Value);//调用用户输入表达式的计算方法,参数1:运算符,参数2:数值297     }298 299     //处理四则混合运算等基础运算(+-*/)300     private int Calculate(ArrayList Ope, ArrayList Values)301     {302       int i;//全局变量i,运用于方法体内每个循环303       for (i = 0; i < Ope.Count; i++)//处理乘法、除法 304       {305         switch (Convert.ToChar(Ope[i]))306         {307           case '*':308             Values[i] = Convert.ToInt32(Values[i]) * Convert.ToInt32(Values[i + 1]);309             Values.RemoveAt(i + 1);310             Ope.RemoveAt(i);311             i--;312             break;313           case '/':314             Values[i] = Convert.ToInt32(Values[i]) * Convert.ToInt32(Values[i + 1]);315             Values.RemoveAt(i + 1);316             Ope.RemoveAt(i);317             i--;318             break;319         }320       }321       for (i = 0; i < Ope.Count; i++)//处理加法和减法 322       {323         switch ((char)Ope[i])324         {325           case '+':326             Values[i] = Convert.ToInt32(Values[i]) + Convert.ToInt32(Values[i + 1]);327             Values.RemoveAt(i + 1);328             Ope.RemoveAt(i);329             i--;330             break;331           case '-':332             Values[i] = Convert.ToInt32(Values[i]) - Convert.ToInt32(Values[i + 1]); ;333             Values.RemoveAt(i + 1);334             Ope.RemoveAt(i);335             i--;336             break;337         }338       }339       return Convert.ToInt32(Values[0].ToString());340     }341 342     //判断运算符组是否合法343     private bool CheckFunction(ArrayList OpeLoc, int length)344     {345       if (Convert.ToInt32(OpeLoc[0]) == 0)//判断第一个运算符的的索引是否为0,也就是运算符排在表达式第一个346         return false;347       int i;348       for (i = 1; i < OpeLoc.Count; i++)349       {350         if (Convert.ToInt32(OpeLoc[i]) - Convert.ToInt32(OpeLoc[i - 1]) == 1)//检查判断两个运算符是否连续351           return false;352       }353       //判断最后一个运算符的的索引是否等于表达式索引的,也就是该运算符排在表达式末尾354       if (Convert.ToInt32(OpeLoc[OpeLoc.Count - 1]) == length - 1)355         return false;356       return true;357     }358     //对负号的处理和重构359     private void RebuildOperator(ref ArrayList OpeLoc, ref ArrayList Ope)360     {361       ArrayList DelItem = new ArrayList();362       if (Convert.ToInt32(OpeLoc[0].ToString()) == 0 && Convert.ToChar(Ope[0]) == '-')//判断第一个符号是否是负号 ,索引为0的符号363       {364         DelItem.Add(0);365       }366       int i;367       for (i = 1; i < OpeLoc.Count; i++)368       {369         //判断是否有相邻的算符且后一个是负号,且后一个运算符-前一个运算符==1370         if (Convert.ToChar(Ope[i]) == '-' && Convert.ToChar(Ope[i - 1]) != '-' && (Convert.ToInt32(OpeLoc[i]) - Convert.ToInt32(OpeLoc[i - 1])) != 1)371         {372           DelItem.Add(i);373         }374       }375       for (i = DelItem.Count - 1; i > 0; i--)//将负号和减号分开处理 376       {377         //移除运算符和所在运算符所在位置378         Ope.RemoveAt(Convert.ToInt32(DelItem[i]));379         OpeLoc.RemoveAt(Convert.ToInt32(DelItem[i]));380       }381     }382     //判断一个符号是否是基本算符 383     private bool IsOperator(char c)384     {385       if (c == '+' || c == '-' || c == '*' || c == '/')386         return true;//判断是否是四则混合运算算符387       else388         return false;389     }390     //检查输入的计算公式是否有错误,牌是否有重复或则输入有误或输入的牌超过四张391     private bool CheckForNumber(string InputExp)//InputExp:用户输入的表达式如:(6*2)*(6/3)392     {393       bool result = true;394       //先找出分隔符,再返回用户输入以这些分隔符分隔的的string类型数字数组395       string[] str = InputExp.Split(new char[] { '+', '-', '*', '/', '(', ')' }, StringSplitOptions.RemoveEmptyEntries);396       if (str.Length != 4)397       {398         MessageBox.Show("抱歉,输入有误!请重新输入");399         result = false;400         return result;401       }402       int[] InputNums = new int[4];//用户输入计算表达式的数字403       int[] CreatNums = { NumberA, NumberB, NumberC, NumberD };//生成的四张牌对应的数字,在生成牌时已经赋值404       Array.Sort(CreatNums);//排序:升序405       for (int i = 0; i < 4; i++)406       {407         InputNums[i] = Convert.ToInt32(str[i]);//用户输入的数字408       }409       Array.Sort(InputNums);//排序:升序410       for (int i = 0; i < 4; i++)411       {412         if (InputNums[i] != CreatNums[i])//判断生成的牌对应的数字与用户输入的数字是否一一匹配,如果不匹配则表明牌有重复413         {414           result = false;415           MessageBox.Show("抱歉,每张牌只能使用一次!");416           return result;417         }418       }419       return result;420     }421 422     #endregion423 424     //查看答案按钮425     private void btnAnswer_Click(object sender, EventArgs e)426     {427 428       int index = 1;//记录答案个数429       #region 点击查看答案按钮,输入按钮禁用,时钟停止,清空答案栏430       btnAdd.Enabled = false;431       btnMinus.Enabled = false;432       btnDivide.Enabled = false;433       btnMulti.Enabled = false;434       btnNumber1.Enabled = false;435       btnNumber2.Enabled = false;436       btnNumber3.Enabled = false;437       btnNumber4.Enabled = false;438       btnDelete.Enabled = false;439       btnClear.Enabled = false;440       btnLeft.Enabled = false;441       btnRight.Enabled = false;442       btnEnter.Enabled = false;443       timer1.Enabled = false;//停止时钟444       txtAnswer.Text = "";//清空答案栏445       #endregion446       #region 首先:(ABCD位置)24种情况的遍历,然后:计算24点的方法,接着:把字符表达式转为数值表达式447       for (int i = 1; i <= 24; i++)448       {449         ChangeOfPosition24(i);//24种情况的位置转换的方法450         ArrayList first = new ArrayList();//数字集合对象451         ArrayList firstStr = new ArrayList();//字符集合对象452         first.Add(A.ToString());453         firstStr.Add("A");454         //此方法的核心思路:本来一开始是有ABCD四张牌,第一次对A、B进行加减乘除,再把得到的结果result返回去,第二次调用对result、C重复第一次操作455         //第三次也是重复,不过这次返回去的结果就是计算出来的结果456         cal(ref first, ref firstStr, B, 'B');457         cal(ref first, ref firstStr, C, 'C');458         cal(ref first, ref firstStr, D, 'D');459 460         for (int j = 0; j < first.Count; j++)461         {462           if (Convert.ToInt32(Convert.ToDouble(first[j].ToString())) == 24)463           {464             //replaceString参数(字符表达式,'字符',数值),此方法的核心思想是,一个一个字符替换为对应的数值465             firstStr[j] = replaceString(firstStr[j].ToString(), 'A', A);466             firstStr[j] = replaceString(firstStr[j].ToString(), 'B', B);467             firstStr[j] = replaceString(firstStr[j].ToString(), 'C', C);468             firstStr[j] = replaceString(firstStr[j].ToString(), 'D', D);469             //追加文本答案470             txtAnswer.AppendText("答案" + index + ": " + firstStr[j].ToString() + "=24;" + "\r\n");471             index++;472           }473         }474       }475       if (txtAnswer.Text.Trim() == "")476       {477         txtAnswer.Text = "此题无解";478       }479       #endregion480     }481 482     #region 点击查看答案按钮要做的一系列处理计算483     //1、(ABCD)24种情况的位置转换484     public void ChangeOfPosition24(int i)485     {486       //24种位置转换 487       //此方法的核心思想:要让A/B/C/D四个数两两算一次,如:+加号运算符488       //(A+B) (A+C) (A+D) (B+C) (B+D) (C+D)一共有6种情况,以此类推减号也有6种情况,489       //加减乘除四种运算符加起来总共就有24种情况490       //补充:上面的意思是A在第一个位置有6种情况,同理491       //B在第一个位置也有6种情况,C在第一个位置也有6种情况,D在第一个位置也有6种情况492       switch (i)493       {494         case 1:495           A = NumberA; B = NumberB; C = NumberC; D = NumberD;496           break;497         case 2:498           A = NumberA; B = NumberB; D = NumberC; C = NumberD;499           break;500         case 3:501           A = NumberA; C = NumberB; B = NumberC; D = NumberD;502           break;503         case 4:504           A = NumberA; C = NumberB; D = NumberC; B = NumberD;505           break;506         case 5:507           A = NumberA; D = NumberB; B = NumberC; C = NumberD;508           break;509         case 6:510           A = NumberA; D = NumberB; C = NumberC; B = NumberD;511           break;512         case 7:513           B = NumberA; A = NumberB; C = NumberC; D = NumberD;514           break;515         case 8:516           B = NumberA; A = NumberB; D = NumberC; C = NumberD;517           break;518         case 9:519           B = NumberA; C = NumberB; A = NumberC; D = NumberD;520           break;521         case 10:522           B = NumberA; C = NumberB; D = NumberC; A = NumberD;523           break;524         case 11:525           B = NumberA; D = NumberB; A = NumberC; C = NumberD;526           break;527         case 12:528           B = NumberA; D = NumberB; C = NumberC; A = NumberD;529           break;530         case 13:531           C = NumberA; A = NumberB; B = NumberC; D = NumberD;532           break;533         case 14:534           C = NumberA; A = NumberB; D = NumberC; B = NumberD;535           break;536         case 15:537           C = NumberA; B = NumberB; A = NumberC; D = NumberD;538           break;539         case 16:540           C = NumberA; B = NumberB; D = NumberC; A = NumberD;541           break;542         case 17:543           C = NumberA; D = NumberB; A = NumberC; B = NumberD;544           break;545         case 18:546           C = NumberA; D = NumberB; B = NumberC; A = NumberD;547           break;548         case 19:549           D = NumberA; A = NumberB; B = NumberC; C = NumberD;550           break;551         case 20:552           D = NumberA; A = NumberB; C = NumberC; B = NumberD;553           break;554         case 21:555           D = NumberA; B = NumberB; A = NumberC; C = NumberD;556           break;557         case 22:558           D = NumberA; B = NumberB; C = NumberC; A = NumberD;559           break;560         case 23:561           D = NumberA; C = NumberB; A = NumberC; B = NumberD;562           break;563         case 24:564           D = NumberA; C = NumberB; B = NumberC; A = NumberD;565           break;566       }567     }568 569     //2、24点计算方法(加减乘除)570     //注意:ref:传入传出,out:传出571     //此方法的核心思路:本来一开始是有ABCD四张牌,第一次对A、B进行加减乘除,再把得到的结果result返回去,第二次调用对result、C重复第一次操作572     //第三次也是重复,不过这次返回去的结果就是计算出来的结果573     private void cal(ref ArrayList num, ref ArrayList numStr, int num2, char num2Str)//传入参数A=6,"A",B=4,"B"574     {575       ArrayList newNum = new ArrayList();//数值集合对象576       ArrayList newNumStr = new ArrayList();//字符集合对象577       int temp;578       for (int i = 0; i < num.Count; i++)579       {580         int num1 = Convert.ToInt32(num[i].ToString());581 582         #region 加法的情况583         temp = num1 + num2;584         newNum.Add(temp.ToString());//数字:6+4585         newNumStr.Add(numStr[i].ToString() + "+" + num2Str);//字符A+B586         #endregion587 588         #region 减法的情况589         if (num1 > num2)590         {591           temp = num1 - num2;592           newNum.Add(temp.ToString());//数字:6-4593           newNumStr.Add(numStr[i].ToString() + "-" + num2Str);//字符A-B594         }595         else596         {597           temp = num2 - num1;598           newNum.Add(temp.ToString());599           //检查是否存在+-运算符,若查找返回索引的结果不等于-1,表示存在+-运算符600           if (numStr[i].ToString().IndexOf('+') != -1 || numStr[i].ToString().IndexOf('-') != -1)601           {602             newNumStr.Add(num2Str + "-" + "(" + numStr[i].ToString() + ")");//B-(A)603           }604           else605           {606             newNumStr.Add(num2Str + "-" + numStr[i].ToString());//B-A607           }608         }609         #endregion610 611         #region 乘法的情况612         temp = num1 * num2;613         newNum.Add(temp.ToString());614         //利用IndexOf()检查是否有+-运算符-1:指的是没有615         if (numStr[i].ToString().IndexOf("+") == -1 && numStr[i].ToString().IndexOf("-") == -1)616         {617           newNumStr.Add(numStr[i].ToString() + "*" + num2Str);//A*B618         }619         else620         {621           newNumStr.Add("(" + numStr[i].ToString() + ")" + "*" + num2Str);//(A+B)*C622         }623         #endregion624 625         #region 除法的情况626         if (num1 > num2)627         {628           if (num2 != 0 && num1 % num2 == 0)//除数不为0,而且两数相除余数要为0,也就是要能整除629           {630             temp = num1 / num2;631             newNum.Add(temp.ToString());632             if (numStr[i].ToString().IndexOf("+") == -1 && numStr[i].ToString().IndexOf("-") == -1)633             {634               newNumStr.Add(numStr[i].ToString() + "/" + num2Str);//A/B635             }636             else637             {638               newNumStr.Add("(" + numStr[i].ToString() + ")" + "/" + num2Str);//(A+B)/C639             }640           }641         }642         else643         {644           if (num1 != 0 && num2 % num1 == 0)645           {646             temp = num2 / num1;647             newNum.Add(temp.ToString());648             if (numStr[i].ToString().IndexOf("+") == -1 && numStr[i].ToString().IndexOf("-") == -1)649             {650               newNumStr.Add(num2Str + "/" + numStr[i].ToString());651             }652             else653             {654               newNumStr.Add(num2Str + "/" + "(" + numStr[i].ToString() + ")");655             }656           }657         }658         #endregion659       }660       //要返回的集合结果661       num = newNum;662       numStr = newNumStr;663     }664 665     //3、用数值表达式替换字符串表达式的方法,此方法的核心思想是,一个一个字符替换为对应的数值666     private object replaceString(string ExpressionStr, char NumStr, int Num)667     {668       //参数(字符表达式=(A-B)*C+D,'字符'=A,数值=5)=>数值表达式=(13-12)*8+3669       int loc = ExpressionStr.IndexOf(NumStr);670       string first = ExpressionStr.Substring(0, loc);671       ExpressionStr = first + Convert.ToInt16(Num) + ExpressionStr.Substring(loc + 1);672       return ExpressionStr;673     }674 675     #endregion676 677     //点击下一轮按钮678     private void btnNext_Click(object sender, EventArgs e)679     {680       #region 点击下一轮按钮更新初始化数据681       btnAdd.Enabled = true;682       btnMinus.Enabled = true;683       btnDivide.Enabled = true;684       btnMulti.Enabled = true;685       btnNumber1.Enabled = true;686       btnNumber2.Enabled = true;687       btnNumber3.Enabled = true;688       btnNumber4.Enabled = true;689       btnDelete.Enabled = true;690       btnClear.Enabled = true;691       btnLeft.Enabled = true;692       btnRight.Enabled = true;693       btnEnter.Enabled = true;694       lblInput.Text = "";695       txtAnswer.Text = "";696       lblResult.Visible = false;697       lblShowTime.Text = "";698       timer1.Enabled = true;699       beginTime = DateTime.Now;700       #endregion701 702       int imageNum;703       string path;704       //画第一张牌705       if (topCard >= 52)706       {707         MessageBox.Show("恭喜你已算完整副牌,开始新的一副牌。");708         topCard = 0;709         Shuffle();//洗牌710       }711       topCard = topCard + 1;712       imageNum = PlayingCards[topCard].suit + (PlayingCards[topCard].face - 1) * 4;713       path = Directory.GetCurrentDirectory() + @"\images\" + imageNum.ToString() + ".bmp";714       pictureBox1.Image = Image.FromFile(path);715       NumberA = Convert.ToInt32(PlayingCards[topCard].face);716       btnNumber1.Text = NumberA.ToString();717       //画第二张牌718       if (topCard >= 52)719       {720         MessageBox.Show("恭喜你已算完整副牌,开始新的一副牌。");721         topCard = 0;722         Shuffle();723       }724       topCard = topCard + 1;725       imageNum = PlayingCards[topCard].suit + (PlayingCards[topCard].face - 1) * 4;726       path = Directory.GetCurrentDirectory() + @"\images\" + imageNum.ToString() + ".bmp";727       pictureBox2.Image = Image.FromFile(path);728       NumberB = Convert.ToInt32(PlayingCards[topCard].face);729       btnNumber2.Text = NumberB.ToString();730       //画第三张牌731       if (topCard >= 52)732       {733         MessageBox.Show("恭喜你已算完整副牌,开始新的一副牌。");734         topCard = 0;735         Shuffle();736       }737       topCard = topCard + 1;738       imageNum = PlayingCards[topCard].suit + (PlayingCards[topCard].face - 1) * 4;739       path = Directory.GetCurrentDirectory() + @"\images\" + imageNum.ToString() + ".bmp";740       pictureBox3.Image = Image.FromFile(path);741       NumberC = Convert.ToInt32(PlayingCards[topCard].face);742       btnNumber3.Text = NumberC.ToString();743       //画第四张牌744       if (topCard >= 52)745       {746         MessageBox.Show("恭喜你已算完整副牌,开始新的一副牌。");747         topCard = 0;748         Shuffle();749       }750       topCard = topCard + 1;751       imageNum = PlayingCards[topCard].suit + (PlayingCards[topCard].face - 1) * 4;752       path = Directory.GetCurrentDirectory() + @"\images\" + imageNum.ToString() + ".bmp";753       pictureBox4.Image = Image.FromFile(path);754       NumberD = Convert.ToInt32(PlayingCards[topCard].face);755       btnNumber4.Text = NumberD.ToString();756     }757 758     //计时器759     private void timer1_Tick(object sender, EventArgs e)760     {761       TimeSpan ts = DateTime.Now - beginTime;762       lblShowTime.Text = "用时:" + ts.Minutes + "分" + ts.Seconds.ToString() + "秒";763       if (ts.Seconds == 30|ts.Seconds==59)764       {765         MessageBox.Show("我等到花儿都谢了,怎么还没算出来呀,需要帮助的话就点击查看答案哦!!!", "时间警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);766         lblShowTime.ForeColor = Color.Red;767       }768     }769   }770 }

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:【趣味分享】C#实现回味童年的24点算法游戏

关键词:C#

C#
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录