从零开发游戏需要学习的c#模块,第二章(循环,数组,列表)
上节课我们学习了变量和条件判断,完成了第一部分的学习,今天,我们来学习c#中的循环
让游戏自动循环——循环 (for 和 while)
还记得上一章学习的战斗吗?打一下,程序就结束了。真正的游戏是连续攻击,直到一方倒下。这个“直到一方倒下,否则一直打”的重复过程,就是循环。
简单来说就是不断重复一间事情,与此配合较多的就是条件判断,停止循环
首先是while
while 循环:只要……就一直做
while (条件)
{
// 只要条件为true,这里面的代码就会一遍又一遍地执行
}
举一个自动战斗直到一方死亡的例子
// 角色数据
int playerHp = 100;
int enemyHp = 60;
int playerAttack = 15;
int enemyAttack = 10;
Console.WriteLine("=== 自动战斗开始! ===\n");
// 只要玩家和敌人的血量都大于0,就继续战斗
while (playerHp > 0 && enemyHp > 0)
{
// --- 玩家攻击敌人 ---
Console.WriteLine("玩家攻击敌人,造成" + playerAttack + "点伤害");
enemyHp = enemyHp - playerAttack; // 敌人掉血
Console.WriteLine("敌人剩余血量:" + enemyHp);
// 检查敌人是否死了
if (enemyHp <= 0)
{
Console.WriteLine("\n敌人被击败了!");
break; // 立刻跳出整个循环,战斗结束
}
// --- 敌人攻击玩家 ---
Console.WriteLine("敌人攻击玩家,造成" + enemyAttack + "点伤害");
playerHp = playerHp - enemyAttack;
Console.WriteLine("玩家剩余血量:" + playerHp);
// 检查玩家是否死了
if (playerHp <= 0)
{
Console.WriteLine("\n你被击败了...");
break;
}
Console.WriteLine("-------------------"); // 每一轮的分隔线
}
Console.WriteLine("战斗结束!");
while (playerHp > 0 && enemyHp > 0):&& 是“并且”的意思。只要玩家和敌人都活着,就执行大括号里的东西。
执行一遍大括号里的代码,称为一次循环或一轮。
这一轮打完后,程序会自动回到 while 那行,再次检查条件。如果都还活着,就再打一轮。如此反复。
break; 是紧急出口,立刻终止整个循环,破坏。
上一章认真学习的小伙伴在这里应该能看懂代码,全是我们学过的代码
接下来是for循环
for 循环:做固定次数的事
for (初始化; 条件; 每次循环后做的事)
{
// 循环体
}
我们来写一个模拟十连抽的代码
Console.WriteLine("\n=== 金币十连抽 ===");
Random rand = new Random(); // 随机数生成器,用来模拟概率
for (int i = 1; i <= 10; i++) // i从1开始;只要i<=10就循环;每轮结束后i加1
{
Console.Write("第" + i + "抽:"); // Write不换行
int result = rand.Next(1, 101); // 生成1到100之间的随机整数
if (result <= 5) // 5%概率出SSR
{
Console.WriteLine("🌟🌟🌟 SSR!");
}
else if (result <= 20) // 15%概率出SR (5到20)
{
Console.WriteLine("⭐⭐ SR");
}
else // 其他80%概率是R
{
Console.WriteLine("⭐ R");
}
}
Console.WriteLine("十连抽结束!");
(这里有可能无法识别星号,换成*即可)

简单吧,仅仅只用了24行代码就完成了最简单的十连抽。我们来分析一下
int i = 1:只在循环开始前执行一次,创建一个计数器 i,初始为1。
i <= 10:每次循环开始前都会检查这个条件。如果为 true,就执行循环体;如果为 false,循环结束。
i++:每次循环体执行完毕后,都会执行这一步。i++ 就是 i = i + 1 的简写,让计数器加1。
如果还不理解的话,我给你解释一下运行逻辑
-
初始化,
i = 1。检查1 <= 10,通过。执行循环体,打印“第1抽”。 -
跑完循环体后,执行
i++,i变成2。 -
检查
2 <= 10,通过。执行循环体,打印“第2抽”。 -
……重复……
-
当第10次抽完后,
i++变成11。 -
检查
11 <= 10,不通过!循环结束。
好了,我们已经学习完了循环,学会了怎么制作抽卡模拟,接下来我们来学习一下如何制作背包类内容,关于数组和集合
你现在有10个抽卡结果,但之前的写法只是打印出来,无法保存。我们需要一个能装下多个同类型数据的容器。
数组 (Array):固定大小的盒子
// 创建一个能装5个分数的整数数组
int[] scores = new int[5]; // new int[5] 意思是“在内存里开辟5个连续的int大小的空格子”
// 给格子赋值。数组的序号(索引)是从0开始的!
scores[0] = 90; // 第1个格子放90
scores[1] = 85; // 第2个格子放85
scores[2] = 99;
scores[3] = 70;
scores[4] = 88;
// 打印第3个分数(索引是2)
Console.WriteLine("第三个分数是:" + scores[2]); // 输出 99
// 也可以用更简单的方式创建并直接装填
string[] team = { "战士", "法师", "牧师", "盗贼" };
Console.WriteLine("队伍第三人是:" + team[2]); // 输出"牧师",因为索引0是战士
-
索引从 0 开始数,不是1。
scores[2]是第三个格子。 -
数组一旦创建,大小就不能改变。
列表 (List<T>):可以伸缩的背包
它就像是游戏里的背包,可以随时获得新物品,也可以丢弃物品。这是游戏开发最常用的容器。
// 引入集合的命名空间,放在代码文件最上面
using System.Collections.Generic;
// ... 在Main方法里 ...
// 创建一个空列表,只能装 string
List<string> inventory = new List<string>();
// 往背包里加东西
inventory.Add("铁剑");
inventory.Add("生命药水");
inventory.Add("魔法卷轴");
Console.WriteLine("背包里有 " + inventory.Count + " 件物品。"); // .Count 获取列表元素数量
// 用 for 循环遍历背包,打印所有物品
Console.WriteLine("物品清单:");
for (int i = 0; i < inventory.Count; i++)
{
Console.WriteLine(" 第" + (i+1) + "格: " + inventory[i]); // 像数组一样用索引访问
}
// 冒险者使用了药水,从背包里移除
inventory.Remove("生命药水");
Console.WriteLine("\n使用了生命药水后,还剩 " + inventory.Count + " 件物品。");

-
Add(东西):往里加,背包自动变大。 -
Remove(东西):移除一个物品,背包自动变小。 -
你不需要在创建时就知道它要装多少东西,非常灵活。
ok,今天的学习就到这里了,今天我们学习了循环,数组和列表,大家巩固复习一下,关注我,下一章内容更精彩
更多推荐
所有评论(0)