第1章:C#编程基础(上)——变量与数据类型、运算符、字符串操作、控制台输入输出
大家好,欢迎来到《零基础游戏客户端开发入门实战》的第一章。我是你们的老朋友,一个在游戏开发坑里摸爬滚打多年的工程师。
今天咱们要聊的,是C#编程最基础的东西。别觉得基础就简单,我见过太多新手一上来就急着写游戏逻辑,结果连变量类型都搞混,debug到怀疑人生。嗯,咱们还是先把地基打牢。
1.1 变量与数据类型——程序里的“小盒子”
变量是什么?说白了,就是程序里用来存数据的一个“小盒子”。每个盒子都有名字,也有自己的“类型”——你总不能把水装在漏底的篮子里吧?
C#是强类型语言,这意味着每个变量在声明时,必须明确告诉编译器:我要存什么类型的数据。
1.1.1 常用的数据类型
我个人习惯把数据类型分成两大类:值类型和引用类型。今天咱们先接触最常用的几种。
| 类型 | 关键字 | 取值范围/说明 | 占用字节 |
|---|---|---|---|
| 整型 | int | -21亿 ~ 21亿 | 4 |
| 长整型 | long | 非常大,适合存大数值 | 8 |
| 浮点型 | float | 约±3.4E38,精度7位 | 4 |
| 双精度浮点 | double | 约±1.7E308,精度15位 | 8 |
| 字符型 | char | 单个Unicode字符,用单引号 | 2 |
| 布尔型 | bool | true 或 false | 1 |
| 字符串 | string | 一串字符,用双引号 | 引用类型 |
1.1.2 声明和赋值
声明变量很简单,格式是:类型 变量名 = 初始值;
int playerLevel = 1; // 玩家等级
float playerSpeed = 5.5f; // 移动速度,注意f后缀
string playerName = "勇者"; // 玩家名字
bool isAlive = true; // 是否存活
这里有个坑,我当年刚学的时候踩过——float类型的字面量必须加f后缀,否则编译器会当成double处理,报类型不匹配。你想想看,一个不小心,编译就红了。
1.2 运算符——让数据动起来
有了变量,咱们得让它们“干活”。运算符就是干这个的。
1.2.1 算术运算符
加减乘除,小学就会。但在C#里,有几个细节要注意。
int a = 10;
int b = 3;
int sum = a + b; // 13
int diff = a - b; // 7
int product = a * b; // 30
int quotient = a / b; // 3,注意!整数除法会丢掉小数部分
int remainder = a % b; // 1,取余运算
10 / 3.0f 才会得到 3.333... 我在项目中遇到过有人用int算伤害百分比,结果永远算不对,排查了半天才发现是整数除法的问题。
1.2.2 赋值运算符与复合赋值
除了最基础的=,还有一堆“偷懒”写法:
int score = 0;
score += 10; // 等价于 score = score + 10;
score -= 5; // 等价于 score = score - 5;
score *= 2; // 等价于 score = score * 2;
score /= 3; // 等价于 score = score / 3;
我个人特别喜欢用+=和-=,写起来快,读起来也直观。你想想看,每次玩家得分都写score = score + 10,多累啊。
1.2.3 比较运算符与逻辑运算符
这两个在游戏里太常用了。比如判断玩家是否升级、是否触发某个事件。
int level = 5;
bool canEnter = level >= 10; // false,等级不够
bool hasKey = true;
bool hasPermission = false;
bool canOpenDoor = hasKey && hasPermission; // false,两个条件都得满足
bool canTry = hasKey || hasPermission; // true,至少有一个满足
逻辑运算符里,&&(与)和||(或)有“短路”特性。什么意思?比如A && B,如果A已经是false,那B根本不会执行。我曾经在项目里利用这个特性,把可能报错的判断放在后面,避免程序崩溃。嗯,算是个小技巧。
1.3 字符串操作——跟文字打交道
游戏里到处都是文字:角色名字、对话、提示信息……字符串操作是基本功。
1.3.1 字符串拼接
最直接的方式是用+号:
string firstName = "林";
string lastName = "克";
string fullName = firstName + lastName; // "林克"
但拼接多了,代码会变得很难看。我个人更推荐用string.Format或者C# 6.0引入的字符串插值:
string name = "林克";
int hp = 100;
string message = $"玩家{name}当前生命值为{hp}";
Console.WriteLine(message); // 输出:玩家林克当前生命值为100
看到那个$符号了吗?它后面的大括号里可以直接写变量,甚至表达式。比如$"你的等级是{level + 1}"。这个写法我每天都在用,强烈推荐。
1.3.2 常用字符串方法
这里列几个最常用的,记下来,以后天天见。
string text = " Hello, Unity! ";
int len = text.Length; // 获取长度(包括空格)
string upper = text.ToUpper(); // 转大写
string lower = text.ToLower(); // 转小写
string trimmed = text.Trim(); // 去掉首尾空格
bool contains = text.Contains("Unity"); // 是否包含子串
string replaced = text.Replace("Unity", "Unreal"); // 替换
text.ToUpper(),text本身还是小写,你得用一个新的变量接住返回值。这个特性我刚开始也犯过迷糊。
1.4 控制台输入输出——跟程序“对话”
虽然游戏开发最终用的是图形界面,但在学习阶段,控制台是我们最好的朋友。它能帮我们快速验证想法,调试逻辑。
1.4.1 输出到控制台
用Console.WriteLine()输出一行,自动换行。用Console.Write()输出,不换行。
Console.WriteLine("欢迎来到游戏世界!");
Console.Write("请输入你的名字:");
1.4.2 从控制台读取输入
用Console.ReadLine()读取用户输入,返回的是字符串。
Console.Write("请输入你的名字:");
string inputName = Console.ReadLine();
Console.WriteLine($"你好,{inputName}!欢迎加入冒险!");
这里有个常见问题:如果你要读数字,不能直接用Console.ReadLine()赋值给int变量。因为读进来的是字符串,需要类型转换。
Console.Write("请输入你的年龄:");
string ageStr = Console.ReadLine();
int age = int.Parse(ageStr); // 将字符串转为int
Console.WriteLine($"明年你就{age + 1}岁了。");
int.Parse()如果遇到非数字的输入,会直接报错。更安全的做法是用int.TryParse(),它不会抛异常,而是返回一个bool告诉你是否转换成功。我在做新手引导系统时,就因为这个吃了不少苦头——玩家乱输入,程序直接崩了。
1.5 综合小练习——做一个简单的“角色创建”程序
学完上面的内容,咱们来写一个完整的例子。把今天讲的东西串起来。
using System;
class Program
{
static void Main()
{
Console.WriteLine("=== 角色创建系统 ===");
Console.Write("请输入角色名称:");
string name = Console.ReadLine();
Console.Write("请输入初始等级(1-100):");
string levelInput = Console.ReadLine();
int level = int.Parse(levelInput);
Console.Write("请输入初始生命值:");
string hpInput = Console.ReadLine();
int hp = int.Parse(hpInput);
bool isVIP = level >= 50;
string summary = $"角色名称:{name}\n" +
$"等级:{level}\n" +
$"生命值:{hp}\n" +
$"VIP状态:{isVIP}";
Console.WriteLine("\n=== 角色信息 ===");
Console.WriteLine(summary);
Console.WriteLine("\n按任意键退出...");
Console.ReadKey();
}
}
这个程序虽然简单,但包含了变量声明、类型转换、字符串插值、逻辑判断、控制台输入输出等我们今天学的所有知识点。你可以试着运行一下,看看效果。
好了,第一章的内容就到这里。说实话,这些基础语法看起来枯燥,但它们是所有游戏逻辑的基石。下一章咱们会聊更深入的控制流——条件判断和循环,到时候就能写出更“智能”的程序了。
记住,编程没有捷径,多敲代码才是王道。咱们下章见。