第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 一串字符,用双引号 引用类型
小提示: 在游戏开发中,int和float是绝对的主力。比如玩家的血量、坐标位置,几乎天天跟它们打交道。double虽然精度高,但计算开销也大,做游戏时能不用就不用。

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"); // 替换
重点: 字符串在C#里是不可变的。你调用的所有方法,都不会改变原字符串,而是返回一个新字符串。比如上面的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();
    }
}

这个程序虽然简单,但包含了变量声明、类型转换、字符串插值、逻辑判断、控制台输入输出等我们今天学的所有知识点。你可以试着运行一下,看看效果。

好了,第一章的内容就到这里。说实话,这些基础语法看起来枯燥,但它们是所有游戏逻辑的基石。下一章咱们会聊更深入的控制流——条件判断和循环,到时候就能写出更“智能”的程序了。

记住,编程没有捷径,多敲代码才是王道。咱们下章见。