# 缘由
实习刚来闲的蛋疼,翻公司 SVN 文档发现了本 C 游戏编程入门与实践,打算想复现学习,结果发现是 DOS 系统,连编辑平台都不知道是什么,不过游戏制作的思路倒是挺清晰。
# 游戏制作思路
动画:根据变量运算结果对屏幕中变化的对象进行重画,从而实现动画效果
响应:对于来自盘、鼠标等输入设备和计算机内部如时间等中断进行响应
运算:根据各类具体响应通过计算和重新赋值来改变程序内变量数值
循环:反复进行动画、响应和运算的操作来实现游戏的真正进程
强烈建议去看看原著,写的很详细,可惜我不是那个时代出生的人,不然一定想办法复现。
# 猜字谜游戏
游戏规则:电脑在 0~9 这 10 个数字中,任意不重复地选择四个排列成四位数,然后让玩的人猜使用的是哪四个数字和数字在第几位;A 代表数字和位置都对了:B 表示数字对了但位置不对了,A、B 前的数字表示处于两种情况下的数字个数;举例,电脑给你猜的数字是 2943,你猜 2893,电脑就显示 2A1B。
# 怎么猜数字对不对?
实际上很简单,一个一个核对就行,两个 for 循环的事情。电脑给出的数字存储在一个数组,玩家输入猜测的数字,程序负责分解数字按位置比较,数字和位置相同变量 a 加一,数字对了但位置不对变量 b 加一,其余什么也不做。
answer [4]:用数组保存四位被猜数字的每一位的值
guess:接收玩者每次输入的数字和一点其他用处
a,b:保存 “几 A 几 B”,也就是每次玩者给出猜测答案的反馈;
times:猜了几次:
i:分别用来标示当前正在比较的被猜数字答案的位号和猜测答案的位号。
# 源代码
其实都是从书上 C 语言代码翻译过来的,但是要注意的是,matlab 分解数字默认为浮点类型,但我们需要向上取整的整数类型,所以需要 fix 函数。
rand_num = fix(rand()*10000); | |
answer = []; | |
pow = 1000; | |
for i = 1:+1:4 | |
answer(i) = fix(rand_num/pow); | |
rand_num = rand_num - fix(rand_num/pow)*pow; | |
pow = pow/10; | |
end | |
a = 0; b = 0; | |
times = 0; | |
while a < 4 | |
a = 0; b = 0; | |
times = times + 1; | |
fprintf('%d ', times); | |
prompt = 'Input number that what you guess '; | |
num = input(prompt); | |
if num >9999 | |
break | |
end | |
for i = 3:-1:0 | |
pow = 1; | |
for tmp = i:-1:1 | |
pow = pow*10; | |
end | |
for j = 1:+1:4 | |
if fix((num/pow)) == answer(j) | |
if i+j ==4 | |
a = a + 1; | |
else | |
b = b + 1; | |
end | |
end | |
end | |
num = num - fix((num/pow))*pow; | |
end | |
fprintf('%dA%dB\n',a,b); | |
end |