【小游戏】在Excel中玩猜数字游戏(进阶版
- 2026-11-10 06:15:21
【小游戏】在Excel中玩猜数字游戏(进阶版 依旧展示一下粗糙的游戏界面。。。 

然后讲一下游戏规则(百度来的,也可以自行百度Bulls and Cows):
通常由两个人玩,一方出数字,一方猜。出数字的人要想好一个没有重复数字的4个数,不能让猜的人知道。猜的人就可以开始猜。每猜一个数字,出数者就要根据这个数字给出几A几B,其中A前面的数字表示位置正确的数的个数,而B前的数字表示数字正确而位置不对的数的个数。
如正确答案为 5234,而猜的人猜 5346,则是 1A2B,其中有一个5的位置对了,记为1A,而3和4这两个数字对了,而位置没对,因此记为 2B,合起来就是 1A2B。接着猜的人再根据出题者的几A几B继续猜,直到猜中(即 4A0B)为止。
游戏运行方法:
打开 Excel,按
Alt + F11进入 VBA 编辑器。插入一个标准模块(菜单:插入 → 模块),将以上代码粘贴进去。
关闭 VBA 编辑器,返回 Excel。
按下
Alt + F8,选择宏PlayGame并点击“执行”。根据弹出的输入框进行游戏,查看工作表 A 列的历史记录。
代码如下:
Option Explicit' 主游戏过程Sub PlayGame()Dim secret As String ' 秘密数字Dim guess As String ' 玩家猜测Dim A As Integer, B As Integer ' 反馈的A和B数量Dim guessCount As Integer ' 猜测次数Dim ws As Worksheet ' 用于记录的工作表Dim again As Integer ' 是否再玩一次的选择' 指定记录工作表(可根据需要修改为 "Sheet1" 或其他名称)Set ws = ThisWorkbook.Sheets("Sheet1")' 清空A列并写入标题ws.Columns(1).ClearContentsws.Cells(1, 1).Value = "猜测历史(猜测 -> 反馈)"' 生成四位不重复的秘密数字secret = GenerateSecret' 可选的调试输出(正式使用时请注释掉)' Debug.Print "秘密数字(仅供调试): " & secret' 显示游戏规则MsgBox "游戏开始!已生成一个四位不重复数字(0-9)。" & vbCrLf & _"每次输入四位数字,将得到 XAYB 的反馈:" & vbCrLf & _"X = 数字正确且位置正确" & vbCrLf & _"Y = 数字正确但位置错误" & vbCrLf & _"直到出现 4A0B 即为胜利。", vbInformation, "猜数字游戏"guessCount = 0' 主循环:反复获取猜测直到猜对或用户取消Doguess = GetGuess(ws) ' 获取玩家输入(取消时返回空字符串)If guess = "" Then ' 用户取消输入,退出游戏MsgBox "游戏已退出。", vbExclamation, "退出"Exit DoEnd IfguessCount = guessCount + 1' 计算本次猜测的A和BCalculateAB secret, guess, A, B' 将猜测记录写入工作表(从第2行开始)ws.Cells(guessCount + 1, 1).Value = guess & " -> " & A & "A" & B & "B"' 判断是否完全猜对If A = 4 ThenMsgBox "恭喜!你猜对了!秘密数字是 " & secret & vbCrLf & _"总猜测次数: " & guessCount, vbInformation, "胜利"' 询问是否再玩一局again = MsgBox("再玩一次?", vbYesNo + vbQuestion, "继续")If again = vbYes ThenPlayGame ' 重新开始游戏(递归调用)Exit Sub ' 结束当前实例,避免返回原循环ElseMsgBox "感谢游玩!", vbInformation, "结束"Exit SubEnd IfEnd IfLoopEnd Sub' 生成四位不重复的随机数字字符串(例如 "0123")Function GenerateSecret() As StringDim digits(0 To 9) As Integer ' 存放0-9的数字Dim i As Integer, j As IntegerDim temp As IntegerDim result As String' 初始化数组For i = 0 To 9digits(i) = iNext i' 随机打乱数组(Fisher-Yates洗牌算法)RandomizeFor i = 0 To 9j = Int((9 - i + 1) * Rnd + i) ' 随机位置 i~9temp = digits(i)digits(i) = digits(j)digits(j) = tempNext i' 取前四个数字拼接成字符串result = ""For i = 0 To 3result = result & CStr(digits(i))Next iGenerateSecret = resultEnd Function' 获取玩家输入,并进行有效性验证(必须为4位数字)' 返回有效猜测字符串,如果用户取消则返回空字符串Function GetGuess(ws As Worksheet) As StringDim inputStr As StringDim i As IntegerDim valid As BooleanDo' 使用 InputBox 获取输入(取消返回空字符串)inputStr = InputBox("请输入四位数字(例如 0123):", "猜数字游戏")' 如果用户取消,返回空字符串If inputStr = "" ThenGetGuess = ""Exit FunctionEnd If' 去除前后空格inputStr = Trim(inputStr)' 检查长度是否为4If Len(inputStr) <> 4 ThenMsgBox "必须输入4位数字!", vbExclamation, "输入错误"valid = FalseElsevalid = True' 检查每一位是否都是数字字符For i = 1 To 4If Not (Mid(inputStr, i, 1) Like "#") Thenvalid = FalseExit ForEnd IfNext iIf Not valid ThenMsgBox "只能包含数字(0-9)!", vbExclamation, "输入错误"End IfEnd IfLoop Until validGetGuess = inputStrEnd Function' 计算猜测与秘密数字的A和B' secret: 秘密数字字符串(4位)' guess: 猜测数字字符串(4位)' A: 返回数字和位置都正确的个数' B: 返回数字正确但位置错误的个数Sub CalculateAB(secret As String, guess As String, ByRef A As Integer, ByRef B As Integer)Dim i As Integer, j As IntegerDim secretChars(1 To 4) As String ' 秘密数字各位字符Dim guessChars(1 To 4) As String ' 猜测数字各位字符Dim matchedSecret(1 To 4) As Boolean ' 标记秘密数字的某位是否已被匹配(A或B)' 初始化数组For i = 1 To 4secretChars(i) = Mid(secret, i, 1)guessChars(i) = Mid(guess, i, 1)matchedSecret(i) = FalseNext iA = 0B = 0' 第一步:计算 A(位置和数字全对)For i = 1 To 4If secretChars(i) = guessChars(i) ThenA = A + 1matchedSecret(i) = True ' 标记该位已被匹配(用于B的计算)End IfNext i' 第二步:计算 B(数字对但位置错)' 遍历猜测中未匹配A的位置,检查该数字是否出现在秘密中未匹配的位置For i = 1 To 4' 只考虑当前猜测位不是A的情况If secretChars(i) <> guessChars(i) ThenFor j = 1 To 4' 秘密位未被匹配,且数字与猜测位相同If Not matchedSecret(j) And guessChars(i) = secretChars(j) ThenB = B + 1matchedSecret(j) = True ' 标记该秘密位已用于B,避免重复计数Exit ForEnd IfNext jEnd IfNext iEnd Sub
注意事项
如果工作表名称不是
Sheet1,请将代码开头的Set ws = ThisWorkbook.Sheets("Sheet1")中的名称改为实际工作表名。游戏过程中请勿手动修改 A 列内容,以免影响记录顺序。
每次新游戏会自动清空 A 列,原有记录会被覆盖。
如果对您有帮助,欢迎关注、留言、点赞、分享、收藏这个公众号,小编会不定期发布手写实用宏以及分享一些写代码过程中的语句,但是真的真的不定期哦!
本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。