嗯,有点简陋...
为什么不用goto?对,因为我不喜欢用它
按照脚本的思路来,把一个普通的文本剧情游戏分成设置类,剧情类,交互类以及主程序
首先是设置类
class Set
{
public void clean()//清除方法
{
ReadLine();
Clear();
}
public void Achievement()//创建成就
{
var achievement = Combine(GetFolderPath(SpecialFolder.Personal),"Chengjiu","Chengjiu01","Chengjiu");
WriteLine(achievement);
CreateDirectory(achievement);
string a = Combine(achievement, "成就.txt");//创建成就txt 文本文件
StreamWriter text = File.CreateText(a);
text.WriteLine("谢谢你的游玩:)");//写入文本
text.Close();
}
}
设置类是全部类的基类,其中的清除方法给予每个类使用。而使用成就方法以此来让玩家触发真真正的真结局时获得成就txt文件
我们可以用Directory,Path,Environment类来管理目录,用File来管理文件
交互类:
class Ui : Set
{
public string Name { get; set; }
public void Say()//开局欢迎词抽取方法
{
Random a = new Random();
int b = a.Next(1, 5);
switch (b)
{
case 1:
WriteLine("欢迎来到此游戏");
clean();
break;
case 2:
WriteLine("本劣质游戏由本博主制作");
clean();
break;
case 3:
WriteLine("不要问国家为你做了什么,而是问你为国家做了什么--肯尼迪");
clean();
break;
case 4:
WriteLine("我本可以忍受这黑暗,如果我未曾见过太阳--狄金森");
clean();
break;
}
}
public void Getname()//获取名字方法
{
Ui ui = new Ui();
WriteLine("给我你的名字");
string getname = ReadLine();
Name = getname;
if (Name.Length == 0)
{
Name = "赛恩";
}
WriteLine($"你叫{Name}");
ui.clean();
}
}
使用一个属性来获取名字,当无输入时则默认为赛恩,其实这里可以用正则表达式但有点麻烦
剧情类:
class Poal : Ui
{
public bool checkpoint1 = false;
public bool checkpoint2 = false;
public bool checkpoint3 = false;
public void Start1()//开头1
{
Say();
Getname();
WriteLine($"你是这个国度最负盛名的圣骑士,你的画像被挂在家家户户中,你掌握着最强大的咒语");
WriteLine("但你十分清楚,再强大的咒语也无法击散人心中的黑暗......");
clean();
WriteLine("在一次执行任务之中,你从敌人手中救走了一个奄奄一息的小女孩");
WriteLine("在你的细心照顾下,小女孩很快就痊愈了");
clean();
WriteLine("小家伙天天陪在你身边,你也渐渐对她产生了眷念,但你知道这种感情是不被允许的。");
WriteLine("当她向你提出离开时,你也只能放任她离去");
clean();
WriteLine("一天,你梦到了那个小女孩,在梦中她奄奄一息地躺在地上");
WriteLine("你惊醒了过来,在你的脑海中不断地播放着小女孩的身影");
WriteLine("你穿上盔甲,在背包里塞了几个护身符便匆匆上路");
clean();
branch1();
}
public void Start2()
{
WriteLine("好吧,我们都已经知道这劣质游戏的那无聊开头了");
clean();
branch1();
}
public void branch1()//分支1
{
WriteLine("你来到了黑暗石林,空气中的血腥味扑面而来,过了一会,你抵达了一个三叉入口,入口上的牌子告诫路上的行人不要向前走,你决定");
WriteLine("1.向左走 2向右走 3向前走");
string a = ReadLine();
Clear();
switch (a)
{
case "1":
Clear();
WriteLine("你拨开草丛顺着小路不断向前,天快黑时一座马戏团帐篷出现在你的眼前");
clean();
WriteLine("一个戴着小丑面具的人走了过来,对你说");
WriteLine("你好");
WriteLine("我是这个马戏团的团长,欢迎来到马戏团");
clean();
WriteLine("你向他挤出了个笑容,向马戏团内走去");
clean();
WriteLine("小丑面具下的脸露出了阴冷的笑容");
WriteLine($"{Name},真是好久不见了呢");
WriteLine("小丑男退后一步消失在了黑暗中");
clean();
WriteLine("赶路的疲惫彻底征服了你,你在床上滚了几下便进入了梦中");
clean();
WriteLine("午夜,你再次被梦像惊醒.你下定决心要尽快找到小女孩");
WriteLine("这时你感知到了一股黑暗能量在马戏团内蠢蠢欲动");
WriteLine("你决定: 1去看看 2不理它");
clownline1();//调用小丑线1号方法
return;
case "2":
WriteLine("在穿过了几片密林后,一个小镇出现在你的眼前");
WriteLine("你来到小镇,小镇墙外贴的都是关于双子先知的事迹");
clean();
WriteLine("很快你便找到了双子先知。");
WriteLine("透过了双子先知的水晶球,你发现了小女孩死亡的情况");
clean();
WriteLine("虽然一路上你一直在猜测这种情况,但你还是骗自己小女孩并没死");
WriteLine("你离开了小镇,漫无目的地到处乱逛。");
WriteLine("你返回家中,但你依旧感到一股空虚的感觉充斥在你的心头。");
clean();
WriteLine("这天,在接待远渡重洋的客人时你听见木叶村中有人掌握着把死人复活的秘术");
WriteLine("你决定1:去看看 2:不去");
Went();
return;
case "3":
WriteLine("你走了一会,前方再次出现了一个警告行人的牌子,你决定:1继续前进 2返回入口");
Dyingmethod();//调用死亡线一号方法
return;
default:
WriteLine("输入错误");
break;
}
}
public void clownline1()//小丑线1号方法
{
string a = ReadLine();
Clear();
if (a == "1")
{
WriteLine("你带着圣器跟随着那丝黑暗能量来到了马戏团的中央");
clean();
WriteLine("你踏进表演的帐篷,空中的黑暗能量都向幕后聚集");
WriteLine("你揭开帷幕,发现马戏团团长拿着黑魔之心");
WriteLine("随着黑暗之心的跳动,空气中的黑暗能量不断被泵进团长的体内");
clean();
WriteLine("你大吼一声:你知道你在干什么嘛?");
clean();
WriteLine("团长掏出魔杖,大喊一声:阿瓦达索命,一阵绿光向你射来");
WriteLine("你甩出魔杖,障碍重重.两道光在空中相撞,绿光直直地击中了团长");
clean();
WriteLine($"但他并没有像你预想中的直直倒下,\"很惊讶吧?{Name}\"");
WriteLine("中了索命没有死让你惊讶透顶了吧!这就是黑暗带来的力量");
WriteLine("他摘下面具,昔日熟悉的脸庞浮现在你的眼前\"想我了么?追捕了我这个老朋友这么久,也该好好地叙上一叙了吧\"");
clean();
WriteLine("\"克莱恩,是你!\"");
clean();
WriteLine("\"克莱恩已经死了!现在在你面前的只不过是一具残壳罢了\"克莱恩大步向你奔来,\"斩杀术\",一个残影划到你的面前");
WriteLine("\"不好\"你微微一侧,一道血线被划了出来");
clean();
WriteLine("你掏出圣器,圣器上的能量使得克莱恩的动作缓了一下");
WriteLine("你抓住时机一个重斩 叮 强大的反震力让克莱恩的刀脱手飞出");
clean();
WriteLine("克莱恩双手一拉,两个傀儡向你扑了过来");
WriteLine("刺拉一声,其中一个傀儡被圣器戳了个透心凉");
WriteLine("你对着另外一个傀儡连开3枪,很快那个傀儡也倒地了");
clean();
WriteLine("你望向四周,克莱恩失去了踪影");
WriteLine("\"阿瓦达--\"克莱恩突然出现在你的身后");
clean();
WriteLine("你抬手连开数枪,克莱恩应身倒地");
WriteLine("\"唯物主义的胜利\"你大吼道");
clean();
WriteLine("克莱恩捂住伤口,戴上了小丑面具。一股浓郁的黑暗能量自克莱恩身上散发");
WriteLine("\"好吧,看来太过理性也不是什么好事\"你拔出圣器冲向了克莱恩");
clean();
WriteLine("这时,圣器突然再次出现了能量波动。克莱恩身形一顿,你抓准时机猛然一剑突出");
WriteLine("克莱恩抓住圣器左手聚集黑暗能量洞穿了你的肩膀");
WriteLine("你的圣器也穿透了克莱恩的胸膛");
clean();
WriteLine("你退后几步,克莱恩身上的黑暗能量逐渐减少");
WriteLine("\"呵呵,终究还是不敌你么?\"克莱恩摘下面具");
clean();
WriteLine("\"你为什么要走到这步?\"");
WriteLine("\"呵呵,你这个太阳说什么也不会懂的吧\"克莱恩掏出一张早已泛黄的照片,\"我能为了世界,世界又能为了我么?\"");
clean();
WriteLine("克莱恩吐出一口鲜血,你知道当年那件事让他无法释怀");
WriteLine("\"克莱恩你......\"");
clean();
WriteLine("\"前方深渊,深透地狱!\"克莱恩用尽力气说出了最后一句话。");
WriteLine("你看着昔日战友心中很不是滋味");
clean();
WriteLine("台前的帷幕缓缓降下");
clean();
WriteLine("戏,已落幕");
clean();
WriteLine("解锁昔日战友结局");
clean();
checkpoint1 = true;
}
else
{
WriteLine("你并没有去管黑暗能量,正当你想睡觉时");
WriteLine("一大股黑暗能量把你围了起来,你想去拿圣器,但早已为时已晚");
clean();
WriteLine("假结局");
clean();
}
}
public void Went()
{
string a = ReadLine();
if (a == "1")
{
WriteLine("你带上小女孩的头发前往寻找木叶村");
WriteLine("过了三年后,民间流传着木叶村出现了一位强大的圣骑士,在他的身边有个小女孩与他作伴");
clean();
WriteLine("作者难得给的好结局");
clean();
checkpoint2 = true;
}
else
{
WriteLine("你最终决定还是任由这丝思念在心中不断的消散");
clean();
WriteLine("假结局");
clean();
}
}
public void Dyingmethod()//死亡线1号方法
{
string a = ReadLine();
if (a == "1")
{
WriteLine("你正想继续往前走,突然一发绿光命中了你");
Clear();
WriteLine("???:\"哪来的碍事家伙?终于可以为安息镇\"");
WriteLine("???:\"不过幸好死了,现在继续为安息镇循找双子先知吧\"");
clean();
WriteLine("游戏结束,你解锁了愚蠢的结局");
clean();
checkpoint3 = true;
}
else
{
branch1();
}
}
public void TrueEnd()//真正的真结局
{
WriteLine("你凭着梦中的记忆来到了一个山洞");
WriteLine("你拿出圣器与山洞中的怪物决战");
clean();
WriteLine("一阵搏杀后怪物被你击杀在地");
WriteLine("你走近后却发现怪物的尸体慢慢变成了小女孩的模样");
clean();
WriteLine("你不敢相信你的眼睛,仔细摸索却发现了小女孩尸体上还戴着你送给她的护身符");
WriteLine("你无法分辨出现实与梦境的区别,最后你挖去了自己的双眼");
clean();
WriteLine("你也许找到了答案,但它也许充满了黑暗");
WriteLine("本博主掌握着一切");
clean();
WriteLine("看在你浪费了这么多时间玩我的游戏,就勉为其难的给你个成就吧");
Achievement();
clean();
}
}
主要运行
class A : Poal
{
static void Main(string[] args)
{
A a = new A();
do
{
if(a.checkpoint1 == true || a.checkpoint2 == true || a.checkpoint3 == true)
{//用来判断是否通过一个结局
a.Start2();
}
else
{
a.Start1();
}
if (a.checkpoint2 == true && a.checkpoint1 == true && a.checkpoint3 == true)
{
break;
}
} while (true);
a.TrueEnd();
}
}
全部代码如下:
using System;
using static System.Console;
using System.IO;
using static System.IO.Directory;
using static System.IO.Path;
using static System.Environment;
namespace ConsoleApp5
{
class Set
{
public void clean()
{
ReadLine();
Clear();
}
public void Achievement()//创建成就
{
var achievement = Combine(GetFolderPath(SpecialFolder.Personal),"Chengjiu","Chengjiu01","Chengjiu");
WriteLine(achievement);
CreateDirectory(achievement);
string a = Combine(achievement, "成就.txt");//创建成就txt 文本文件
StreamWriter text = File.CreateText(a);
text.WriteLine("谢谢你的游玩:)");//写入文本
text.Close();
}
}
class Ui : Set
{
public string Name { get; set; }
public void Say()//开局欢迎词抽取方法
{
Random a = new Random();
int b = a.Next(1, 5);
switch (b)
{
case 1:
WriteLine("欢迎来到此游戏");
clean();
break;
case 2:
WriteLine("本劣质游戏由本博主制作");
clean();
break;
case 3:
WriteLine("不要问国家为你做了什么,而是问你为国家做了什么--肯尼迪");
clean();
break;
case 4:
WriteLine("我本可以忍受这黑暗,如果我未曾见过太阳--狄金森");
clean();
break;
}
}
public void Getname()//获取名字方法
{
Ui ui = new Ui();
WriteLine("给我你的名字");
string getname = ReadLine();
Name = getname;
if (Name.Length == 0)
{
Name = "赛恩";
}
WriteLine($"你叫{Name}");
ui.clean();
}
}
class Poal : Ui
{
public bool checkpoint1 = false;
public bool checkpoint2 = false;
public bool checkpoint3 = false;
public void Start1()//开头1
{
Say();
Getname();
WriteLine($"你是这个国度最负盛名的圣骑士,你的画像被挂在家家户户中,你掌握着最强大的咒语");
WriteLine("但你十分清楚,再强大的咒语也无法击散人心中的黑暗......");
clean();
WriteLine("在一次执行任务之中,你从敌人手中救走了一个奄奄一息的小女孩");
WriteLine("在你的细心照顾下,小女孩很快就痊愈了");
clean();
WriteLine("小家伙天天陪在你身边,你也渐渐对她产生了眷念,但你知道这种感情是不被允许的。");
WriteLine("当她向你提出离开时,你也只能放任她离去");
clean();
WriteLine("一天,你梦到了那个小女孩,在梦中她奄奄一息地躺在地上");
WriteLine("你惊醒了过来,在你的脑海中不断地播放着小女孩的身影");
WriteLine("你穿上盔甲,在背包里塞了几个护身符便匆匆上路");
clean();
branch1();
}
public void Start2()
{
WriteLine("好吧,我们都已经知道这劣质游戏的那无聊开头了");
clean();
branch1();
}
public void branch1()//分支1
{
WriteLine("你来到了黑暗石林,空气中的血腥味扑面而来,过了一会,你抵达了一个三叉入口,入口上的牌子告诫路上的行人不要向前走,你决定");
WriteLine("1.向左走 2向右走 3向前走");
string a = ReadLine();
Clear();
switch (a)
{
case "1":
Clear();
WriteLine("你拨开草丛顺着小路不断向前,天快黑时一座马戏团帐篷出现在你的眼前");
clean();
WriteLine("一个戴着小丑面具的人走了过来,对你说");
WriteLine("你好");
WriteLine("我是这个马戏团的团长,欢迎来到马戏团");
clean();
WriteLine("你向他挤出了个笑容,向马戏团内走去");
clean();
WriteLine("小丑面具下的脸露出了阴冷的笑容");
WriteLine($"{Name},真是好久不见了呢");
WriteLine("小丑男退后一步消失在了黑暗中");
clean();
WriteLine("赶路的疲惫彻底征服了你,你在床上滚了几下便进入了梦中");
clean();
WriteLine("午夜,你再次被梦像惊醒.你下定决心要尽快找到小女孩");
WriteLine("这时你感知到了一股黑暗能量在马戏团内蠢蠢欲动");
WriteLine("你决定: 1去看看 2不理它");
clownline1();//调用小丑线1号方法
return;
case "2":
WriteLine("在穿过了几片密林后,一个小镇出现在你的眼前");
WriteLine("你来到小镇,小镇墙外贴的都是关于双子先知的事迹");
clean();
WriteLine("很快你便找到了双子先知。");
WriteLine("透过了双子先知的水晶球,你发现了小女孩死亡的情况");
clean();
WriteLine("虽然一路上你一直在猜测这种情况,但你还是骗自己小女孩并没死");
WriteLine("你离开了小镇,漫无目的地到处乱逛。");
WriteLine("你返回家中,但你依旧感到一股空虚的感觉充斥在你的心头。");
clean();
WriteLine("这天,在接待远渡重洋的客人时你听见木叶村中有人掌握着把死人复活的秘术");
WriteLine("你决定1:去看看 2:不去");
Went();
return;
case "3":
WriteLine("你走了一会,前方再次出现了一个警告行人的牌子,你决定:1继续前进 2返回入口");
Dyingmethod();//调用死亡线一号方法
return;
default:
WriteLine("输入错误");
break;
}
}
public void clownline1()//小丑线1号方法
{
string a = ReadLine();
Clear();
if (a == "1")
{
WriteLine("你带着圣器跟随着那丝黑暗能量来到了马戏团的中央");
clean();
WriteLine("你踏进表演的帐篷,空中的黑暗能量都向幕后聚集");
WriteLine("你揭开帷幕,发现马戏团团长拿着黑魔之心");
WriteLine("随着黑暗之心的跳动,空气中的黑暗能量不断被泵进团长的体内");
clean();
WriteLine("你大吼一声:你知道你在干什么嘛?");
clean();
WriteLine("团长掏出魔杖,大喊一声:阿瓦达索命,一阵绿光向你射来");
WriteLine("你甩出魔杖,障碍重重.两道光在空中相撞,绿光直直地击中了团长");
clean();
WriteLine($"但他并没有像你预想中的直直倒下,\"很惊讶吧?{Name}\"");
WriteLine("中了索命没有死让你惊讶透顶了吧!这就是黑暗带来的力量");
WriteLine("他摘下面具,昔日熟悉的脸庞浮现在你的眼前\"想我了么?追捕了我这个老朋友这么久,也该好好地叙上一叙了吧\"");
clean();
WriteLine("\"克莱恩,是你!\"");
clean();
WriteLine("\"克莱恩已经死了!现在在你面前的只不过是一具残壳罢了\"克莱恩大步向你奔来,\"斩杀术\",一个残影划到你的面前");
WriteLine("\"不好\"你微微一侧,一道血线被划了出来");
clean();
WriteLine("你掏出圣器,圣器上的能量使得克莱恩的动作缓了一下");
WriteLine("你抓住时机一个重斩 叮 强大的反震力让克莱恩的刀脱手飞出");
clean();
WriteLine("克莱恩双手一拉,两个傀儡向你扑了过来");
WriteLine("刺拉一声,其中一个傀儡被圣器戳了个透心凉");
WriteLine("你对着另外一个傀儡连开3枪,很快那个傀儡也倒地了");
clean();
WriteLine("你望向四周,克莱恩失去了踪影");
WriteLine("\"阿瓦达--\"克莱恩突然出现在你的身后");
clean();
WriteLine("你抬手连开数枪,克莱恩应身倒地");
WriteLine("\"唯物主义的胜利\"你大吼道");
clean();
WriteLine("克莱恩捂住伤口,戴上了小丑面具。一股浓郁的黑暗能量自克莱恩身上散发");
WriteLine("\"好吧,看来太过理性也不是什么好事\"你拔出圣器冲向了克莱恩");
clean();
WriteLine("这时,圣器突然再次出现了能量波动。克莱恩身形一顿,你抓准时机猛然一剑突出");
WriteLine("克莱恩抓住圣器左手聚集黑暗能量洞穿了你的肩膀");
WriteLine("你的圣器也穿透了克莱恩的胸膛");
clean();
WriteLine("你退后几步,克莱恩身上的黑暗能量逐渐减少");
WriteLine("\"呵呵,终究还是不敌你么?\"克莱恩摘下面具");
clean();
WriteLine("\"你为什么要走到这步?\"");
WriteLine("\"呵呵,你这个太阳说什么也不会懂的吧\"克莱恩掏出一张早已泛黄的照片,\"我能为了世界,世界又能为了我么?\"");
clean();
WriteLine("克莱恩吐出一口鲜血,你知道当年那件事让他无法释怀");
WriteLine("\"克莱恩你......\"");
clean();
WriteLine("\"前方深渊,深透地狱!\"克莱恩用尽力气说出了最后一句话。");
WriteLine("你看着昔日战友心中很不是滋味");
clean();
WriteLine("台前的帷幕缓缓降下");
clean();
WriteLine("戏,已落幕");
clean();
WriteLine("解锁昔日战友结局");
clean();
checkpoint1 = true;
}
else
{
WriteLine("你并没有去管黑暗能量,正当你想睡觉时");
WriteLine("一大股黑暗能量把你围了起来,你想去拿圣器,但早已为时已晚");
clean();
WriteLine("假结局");
clean();
}
}
public void Went()
{
string a = ReadLine();
if (a == "1")
{
WriteLine("你带上小女孩的头发前往寻找木叶村");
WriteLine("过了三年后,民间流传着木叶村出现了一位强大的圣骑士,在他的身边有个小女孩与他作伴");
clean();
WriteLine("作者难得给的好结局");
clean();
checkpoint2 = true;
}
else
{
WriteLine("你最终决定还是任由这丝思念在心中不断的消散");
clean();
WriteLine("假结局");
clean();
}
}
public void Dyingmethod()//死亡线1号方法
{
string a = ReadLine();
if (a == "1")
{
WriteLine("你正想继续往前走,突然一发绿光命中了你");
Clear();
WriteLine("???:\"哪来的碍事家伙?终于可以为安息镇\"");
WriteLine("???:\"不过幸好死了,现在继续为安息镇循找双子先知吧\"");
clean();
WriteLine("游戏结束,你解锁了愚蠢的结局");
clean();
checkpoint3 = true;
}
else
{
branch1();
}
}
public void TrueEnd()//真正的真结局
{
WriteLine("你凭着梦中的记忆来到了一个山洞");
WriteLine("你拿出圣器与山洞中的怪物决战");
clean();
WriteLine("一阵搏杀后怪物被你击杀在地");
WriteLine("你走近后却发现怪物的尸体慢慢变成了小女孩的模样");
clean();
WriteLine("你不敢相信你的眼睛,仔细摸索却发现了小女孩尸体上还戴着你送给她的护身符");
WriteLine("你无法分辨出现实与梦境的区别,最后你挖去了自己的双眼");
clean();
WriteLine("你也许找到了答案,但它也许充满了黑暗");
WriteLine("本博主掌握着一切");
clean();
WriteLine("看在你浪费了这么多时间玩我的游戏,就勉为其难的给你个成就吧");
Achievement();
clean();
}
}
class A : Poal
{
static void Main(string[] args)
{
A a = new A();
do
{
if(a.checkpoint1 == true || a.checkpoint2 == true || a.checkpoint3 == true)
{
a.Start2();
}
else
{
a.Start1();
}
if (a.checkpoint2 == true && a.checkpoint1 == true && a.checkpoint3 == true)
{
break;
}
} while (true);
a.TrueEnd();
}
}
}
下期再见 :)
没用的知识3:
在C++中你可以用vector来存储信息,它是动态的可以在运行时添加和删除元素