你不得不知道的编程基础之一个游戏的实现

最近一直在想一个问题 这样写好像也没有太大意义。
说是要写一点入门教程, 可最后渐渐的变味了。
做一件事容易, 但是做好一件事就有难度了,
这几天一直在写, 可最后写着写着就感觉不好, 写出一点有用的东西还是有难度的。
最后我决定换个方式来尝试。
我感觉这样也许会有效果, 刚开始就想要把所有的事情掰扯清楚这样的想法是错误的。
来跟着我编写一个猜数字小游戏, 我们每天慢慢的完善这个游戏。
这个游戏完善完毕, 你也真正入门编程这个大门了。
在此之前你还需要安装python这个软件, 我们主要是C语言, 但是不妨碍顺带着学python。
那么开始折腾吧, 首先打开我们的vs开发人员命令提示符
然后切换盘符:
输入命令:
d:
然后创建一个文件夹:
输入命令:
md guess
cd guess
md v1
cd v1
创建一个C语言源文件。
输入命令:
notepad game.c
打开记事本后写我们的第一个游戏版本。
找不到标点符号可以打开键盘帮助后:
shift+大键盘的任意键来寻找, 查看。
比如#是shift+大键盘数字3, 如此等等。
必须在英文输入法状态下, 输入标点符号。。
输入代码:
#include <stdio.h>

int main(void)
{
  printf("恭喜: 你猜对了。\n");
  return 0;
}
写完后CTRL+s保存, 如果是记事本必须这样做。
然后编译执行, alt+tab切换到命令提示符。。
输入命令:
cl game.c -o game.exe
game.exe
这样我们的第一个版本算是大功告成了, 看看python的代码:
创建python源文件:
输入命令:
notepad game.py
然后输入代码:
# --*-- Encoding: UTF-8 --*--
#! fileName: game.py
print("恭喜: 你猜对了")
保存, 切换到命令提示符。
执行python程序。
输入命令:
python game.py
好了, 到此两个程序都顺利运行。
感觉就像骗人一样, 所谓游戏, 直接给你输出一条消息就结束了?
不过我们可以完善, 就像玩游戏一样。
现在你得到了一个v1版本, 打开这个文件夹有如下几个文件:
game.c game.out game.exe game.py
好了, 可以开始动手了。
C也好, python也罢选择任意一个写, 当然可以比对一下两者有什么共同点。
其实python只需要一行代码足够:
print("恭喜: 你猜对了")
但是上面两行是一个良好的习惯, 有时候第一行代码避免不了。
如果运行结果出现乱码可以这样改:
# --*-- Encoding:gbk --*--
这里出现的--*--是一个样式, 不要也行。
gbk还是UTF-8都是字符编码。
encoding也可以写成:
coding
所以这样写也是没有问题的:
# coding:gbk
不管是在C语言; 还是python最主要的一行代码是:
c语言:printf();

python:print()
不管有没有f这两者的功能就是把括号里面的内容打印到命令提示符窗口。
所以叫print,
python的就是单纯的打印, 而C语言的是格式化打印, 所以多出了个f, 代表format。
printformat显得罗嗦, 所以人家就是这样起名字的, 没有办法。
名字类似, 功能现阶段相同所以他们俩有共同的名称函数。
printf是C标准函数,
print是python内置函数, 说法不一样, 意思一样, 都是可以直接使用的。
对比两种语言的代码, 我们很深切的感觉到什么叫, 层次, 什么叫抽象话。
C语言的好几行代码, 到python成了一行代码。
以后你能看到更多这样的例子。
此外两种语言的语法有一个显著的区别, C语言的每一条语句必须用分号来结束。
python可以是分号, 也可以是, 回车换行符, 但习惯用换行符来结束。
有什么不太明白的可以回交流……
 



2020-03-26 12:04:03 查看数:59     回复数:2 只看该作者

我们的第一个版本也太糊弄人了。
不过我们已经测试了各个方面运作正常, 从写代码到, 编译;运行都没有问题所以我们应该再进一步。
既然是游戏那么需要获取到玩家的输入, 复杂的键盘按键我们先不管,
我们需要从玩家那边获取内容, 比如数字, 比如是/否这样的选择。
那么开始吧。
打开vs开发人员命令提示符。
输入命令:
d:
cd guess
md v2
cd v2
notepad game.c
然后敲进如下代码:

//  game.c
// 我们小游戏的第二个版本
#include <stdio.h>

int main(void)
{
  printf("你随便猜一个整数, 回车提交\n");
  int res;   //  生命一个变量
  scanf("%d", &res);  //  从用户的输入里获取整数
  printf("你刚才输入的是: %d\n", res);  //  内容里携带者res变量里的整数值
  return 0;
}
还是老一套, alt+tab切换到命令提示符, 编译运行程序。
输入命令:
cl game.c
game.exe
看到提示信息, 随意输入一个整数回车。
就发现程序输出了你刚才输入的整数。
相对应的python程序。
输入命令:
notepad game.py
在打开的文件里。
输入代码:
# --*-- Encoding:UTF-8 --*--
#! fileName: game.py
# 我们游戏的第二个版本
res = input("请猜测一个整数, 按回车键提交\n") # 获取用户的输入, 结果是字符串
res = int(res) # 把用户输入的内容转换到整数类型
print("你刚才输入的整数是: %d" % (res)) # 和c代码一样, 内容里携带者用户输入的整数, 打印到命令提示符窗口。
切换到命令提示符窗口, 运行python程序。
输入命令:
python game.py
结果和上面的一模一样。
解说和理论, 你可以看看如下的解说, 能理解多少就理解多少。
这里出现了一些新的东西,
在c代码里可以使用
// 来做注释, 你可以使用简短的文字来说明情况。
因为你很有可能在日后修改代码, 有可能给其他人看你的代码。
所以使用这样的方式来做注释和说明。
此外你不想执行某一行代码可以用这样的方式来注释掉。
//  printf("xxxxx");
如果是这样, 那么这一行代码不会执行。
//是单行注释, 可以用多行注释, 不过不可嵌套多行注释, 类似这样:
/* 一行
二行
三行 */
根据情况选择一个使用就可以了。
在python里用警号号#来开头的是注释。
效果和C语言的//单行注释一样。
'''开头'''结尾的也算是多行注释, 和C语言的/* 内容 */一样的效果。
此外''' 内容 '''有其他用处, 这里按下不表。
两块代码里都有res变量, 里面存放的是用户的输入。
两种语言里的变量有什么共同点,有什么不同?
res变量的共同点是, 两者都能存放用户输入过来的数据, 或者其他数据。
反正程序里的所有的数据都可以放到变量里, 比如编辑器里的文章, 播放器里的歌去都可以放到变量里。
这里更多的是某种数字, 比如一个程序求长方形面积。
那么我们可以用三个变量来保存长方形的长度; 宽度和面基。
C语言里变量必须先声明, 然后在使用。
int s, a, b;
这个就是声明了三个变量。
然后初始化三个变量:
a = 80;
b = 50;
然后做运算, 把结果, 也就是长方形面基放到s变量里。
s = a * b;
这样s就求出了长方形的面基。
python里直接初始化, 不需要先声明:
直接打开python后实验一下。
a = 80
b = 50
s = a * b
在变量a里放了80这个数字; 在b变量里放了50。
最后变量a和变量b相乘得到两者的结果, 后在放到变量s里。
等号是赋值运算符, 给某个变量赋某个值。
*是数字运算符, 四则运算+-*/没什么好说的。
然后数字运算符优先级很高, 而赋值运算符优先级非常低。
所以s = a*b先运算a*b,得出结果后在算, s=结果。
更多情况以后在说。

两种语言给变量命名的规则也一样, 有什么细微差距我忘了, 但是给变量命名基本上一样。
可以用下划线大小写字母来开头, 中间和结尾允许包含数字, 不能有空白符, 其他特殊标点符号。
所谓空白符就是空格; 换行符; 制表符。
总而言之变量名可以是字母下划线和数字, 不能数字开头。
var1合法。
1var非法。
必须有意义, 可以是英文单词, 缩写, 汉字或者汉语拼音也可以, 不过习惯用英文单词和缩写。
写number或者num可以, 写shuzi或sz就不怎么好了。
其他的以后慢慢来。

不同点python的变量非常灵活, 而C语言的变量严格区分数据类型。
这是一个很大的话题, 先不说了。
这次主要是理解变量的命名规则, 运算符的使用。
打开python交互解释器好好折腾折腾。

此外这里出现了另外一些新的东西。
在C语言里有这样的语句:
scanf("%d", &res);
效果就是从用户的输入里获取一个int类型的整数, %d起这个作用。
而获取过来的整数放到res变量里, res变量前面的何浩&是取地址运算符。
整个功能是从用户获取一个整数类型的数据, 放到res所在的地址里。
这里说的地址就是内存里 的某个地址。
变量实际指向了某个内存地址, 如果对某个变量使用&运算符就能得到相对应的地址。
这里有几个例子可以尝试一下:
char c;
scanf("%c", &c);
printf("c的内容是: %c\n", c);

double d;
scanf("%f", &d);
printf("d的内容是: %f\n", d);
可以看看运行结果。
而python的就没有这么复杂了。
res = input("提示信息")
这样用户输入的一行内容都放到res变量里了。
不过在python里我们需要 做一个类型转换, input获取的是字符串, 我们需要的是整数, 所以我们做一个类型转换。
res = int(res)
这样就发生了一次类型转换。
再多的先不说。
总之python更简单, 更符合人类的思维习惯。
而C语言的话我们可以看到更多的东西。
C语言的变量是固定的, 大小一开始就决定好的。
而python的变量现在可以指向这个数据, 但下一刻谁知道某个变量指向哪个数据呢。
C语言变量的数据类型大小是一成不变的, 给某个产品贴上标签后不会轻易的改变。
python的变量就像指针, 管他什么类型的数据, 管他大小, 只要一句:
变量 = 数据就可以了, 至于这个数据是牛头, 还是马面无所谓, 不在意。
那么出现了个问题, 所谓C语言不是说, 很强大, 很灵活么?
看样子不是这样, 对编写程序的人施加的限制太大了?
实际上C语言有个叫指针的东西, 所以python能做的C也能做, 而且python本身就是用C语言来实现的。
只不过python隐藏了很多细节, 我们买个笔记本基本上马上能用上, 如果买来一个树莓派没有一些动手能力根本就没办法使用。
继续扯淡, 都快没边了, 打住, 以后在继续。
总之你观察一下C语言和python是如何从用户键盘获取内容的。
多次运行我们的2版本程序, 如果输入的不是数字是什么结果?
直接回车又是什么结果, 都可以实验一下, 在开发当中测试也是很重要的事情。
上一篇文章地址:
http://www.zd.hk/thread-76745.htm

 



本帖由老欧同学在2020-03-26 12:06:15编辑
2020-03-26 12:04:18 只看该作者
我们通过前两次的实验发现, 我们的输入, 从用户的键盘获取文本, 和输出, 给控制台显示文本正常运行。
这里说的所谓的控制台就是各种各样的命令解释程序, 比如命令提示符。
接下来我们让程序拥有对错判断能力。
还是老规矩, 打开vs2019开发人员命令提示符
输入命令:
d:
cd guess
md v3
cd v3
notepad game.c
然后编写我们的代码:
/* game.c */
/* 小游戏第三个版本 */
#include <stdio.h>

int main(void)
{
 int computer = 6 + 8; // 电脑一方出的题目
 int user;  //  用户的答案
 printf("请问: 6 + 8等于多少?\n");
 scanf("%d", &user);
 if (user == computer)  //  括号里的是布尔表达式, 最后的结果是两个, 真或者假
 {
   printf("回答正确\n"); // 如果结果是真的, 就运行这里的代码, 花括号里可以写多行代码
 }
 else
 {
   printf("回答错误\n"); //  如果布尔表达式结果是假的话执行这里的代码
 }
 printf("游戏结束\n");  //  跳出前面的分岔后这里合并, 继续往下。
 return 0;
}
编译运行。
切换到命令提示符窗口, 输入命令
cl game.c
game
然后测试, 输入14什么结果, 输入其他什么结果。
然后写python的,
notepad game.py
输入代码:
# --*-- Encoding: UTF-8 --*--
#! fileName:game.py
# 我们游戏的第三个版本

computer = 6 + 8
user = int(input("请问: 6 + 8 等于多少?\n")) # 这里把两行的代码嵌套使用了, 可以多层嵌套, 不过太多了就容易出现晦涩难懂的代码, 就像面条一样, 没完没了。
# 所以说, 不是代码越少越好, 而是让人容易看懂。
if user == computer:
 print("回答正确") # python里行首的空格不能少
else:
 print("回答错误")
# 这里留下一个带着注释的空行, 老忙写python的一个经验
print("游戏结束"()
运行python程序:
python game.py
奇怪, 出现了一大堆字母, 不知道什么情况?
我们看下
 File "game.py", line 14
game.py文件的第14行有错误。
SyntaxError: unexpected EOF while parsing
语法错误, 分析的时候出现了意外, 我们可以切换到编辑器CTRL+g, 输入出错的行号
14, 按回车, esc关闭跳行对话框后看这一行错误代码:
发现是空行, 那么我们可以看看前一行有没有问题
print("游戏结束"()
左右方向键一个一个字母的看,
最后发现多出了个左括号, 删掉后运行程序:
这次和我们预想的一样, 没有错误的运行。
理论和解说
如下的内容需要好好看看, 测试测试, 只有python的代码。
C的没有太大区别, 如果有我会说明。
这里我们做的事情比较多。
一个一个的说吧。
每一个编程语言有他的保留字, 你代码里的不管是变量名, 还是其他任何自定义的名称都不能和编程语言的保留字出现名称冲突。
当然字符串除外, 字符串"if not find", 只是普通的文本, 和程序里的自定义名称没有半毛钱关系。
但是你变量名, 不能是
if
int
else
当然写大写的IF; INT; 也是可以的。
但是谁会干这样的傻事, 名称千千万, 不要弄巧成拙。
不管是C语言; 还是python里自定义名称是大小写铭感的。
num和Num是不一样的两个变量。
而有些编程语言只要字母顺序对就可以了, 写大的; 小的都没有区别。
为了可读性, 不要剑走偏锋, 条条大路通罗马, 随着学习的深入, 你会知道那些不能使用的保留字的。
关键字, 保留字的一种, 就像我们的交通标志一样, 指明了程序往下执行的方向。
比如if和else:
if (布尔表达式)
代码块1
else
代码块2
就像两条路让你二选一走, 代码快1; 还是代码块2就看布尔表达式的结果了,
此外也是基本数据类型的名称比如int就是一个关键字。
有特别含义的关键字, 各类语言不尽相同, 这些需要牢记于心。
后续会用到更多的关键字。

布尔类型是一个很重要的概念, 我们普通的数学运算和数学表达式我们都知道。
那么布尔运算和布尔表达式也是很容易的东西,本质上和数学表达式没有区别, 这里说的所谓表达式就是数学题, 数据可以加减乘除; 比较大小; 长度; 相等不相等等等。。
数学表达式就是我们非常熟悉的加减乘除四则运算。
布尔表达式的话就是比较运算, 比如某个数据和某个数据是否相等?
长度是否一致,如下举个例子:
在Python交互解释器里看看结果:
x = 10
y = 20
x == y
False
x != y
True
x > y
False
x < y
True
x >= y
False
x <= y
True
这里出现了一个问题, >和>=有什么区别?
还是举一个例子:
r = 60
r >= 60
True
r > 60
False
r > 59
True
如果 r这个变量 大于或者等于 60 的话
输出考试及格这样的信息。
对应的python代码:
if r >= 60:
 print("考试及格")
#
这里你可以加else语句让程序显得更完整
r = int(input("你的考试成绩"))
if r >= 60:
 print("及格")
else:
 print("不及格")
#
我们可以这样写:
if r > 59:
省略....
相对应的<=和<也一样的道理。
最后看看==和!=的区别?
6 == 6
True
6 != 6
False
6 == 5
False
6 != 5
True
两者做了相反的比较, ==测试相等, !=测试不相等。
这样我们就对六个比较运算符有了很直观的认识。
运算符的优先级是不尽相同的, 不过我们可以使用小括号强制按照我们的顺序去运算, 比如:
10 + 5 * 2
20
(10 + 5) * 2
30
程序先运算数学表达式, 最后运算布尔表达式。
和数学表达式里先算乘除/ 后运算加减一样。
数学运算符的优先级比布尔运算符高。
如果你真的搞不清优先级可以使用小括号, 太过于复杂的运算可以写两行, 举个简单例子:
(10 + 5) * 2
可以写两行:
r = 10 + 5
r * 2
这里的变量r保存了中间结果。
当然我们的例子没有必要写两行, 如果运算符太多可以拆分成独立的几行, 用临时变量来保存中间结果。
始终是一个非常重要的原则, 不是代码越少越好, 最主要还是容易理解。
从前系统资源稀少, 几百kb的内存, 所以人们追求高校的代码, 现在不需要了。
而且你的代码被编译器自动优化, 所以可读性是最主要的。
我们前面说过逻辑运算符的优先级比数学运算符的优先级低, 所以不管多么复杂的运算最后可以得到两个结果。
正确, 真 true, 非0, 错误, 假false, 0NULL。
两个编程语言里概念都一样, 但是表现形式不尽相同。
在python里专门有一种数据类型叫布尔类型, 值只有两个:
True; False
没有第三个结果。
而C语言逻辑比较后得到一个int类型的值。
要么1; 要么0, 当然你也可以使用stdbool.h来使用true和false两个关键字。
另外在C语言里非0就算是true了。
又是一个差距, python更容易理解, 更友好, 而C语言的话容易和int类型混淆。
接下来我们该给程序添加范围了, 比如考试成绩只能在0到100之间, 那么我们如何拒绝不符合常规的输入:
printf("请输入考试成绩: 在0-100之间\n");
如果对方是好学生还好, 喜欢捣乱的学生呢, 给你输入120怎么办?
继续期待。


2020-03-26 12:04:36 只看该作者
访客