C#双人自行车控制台程序按键闪退问题求助及代码优化建议
问题:双人自行车控制台游戏按键后直接退出
我刚完成了一个双人自行车控制台游戏,但输入完两个颜色后,按下任意键程序就直接关闭了。找不到错误所在,希望有人帮忙排查,也欢迎给出代码优化建议。我刚接触C#编程,非常感谢帮助。
主程序代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Fahrrad { internal class Program { static void Main(string[] args) { Console.WriteLine("Geben sie die Farbe 'blau' oder 'gruen' ein: "); Velo Velo1 = new Velo(Console.ReadLine()); Console.WriteLine("Geben sie die andere Farbe ein: "); Velo Velo2 = new Velo(Console.ReadLine()); ConsoleKeyInfo input; input = Console.ReadKey(); switch(input.Key) { case ConsoleKey.UpArrow: Velo2.Gangwechsel(1); break; case ConsoleKey.DownArrow: Velo2.Gangwechsel(0); break; case ConsoleKey.LeftArrow: Velo2.Bremse(true); break; case ConsoleKey.RightArrow: Velo2.Fortbewegung(true); break; case ConsoleKey.W: Velo1.Gangwechsel(1); break; case ConsoleKey.S: Velo1.Gangwechsel(0); break; case ConsoleKey.A: Velo1.Bremse(true); break; case ConsoleKey.D: Velo1.Fortbewegung(true); break; } } } }
Velo类代码
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; namespace Fahrrad { internal class Velo { private double gaenge; private bool bremse; private string farbe; private double maxGang; private bool fahrend; // 构造函数 public Velo(string farbe) { this.gaenge = 1; this.farbe = farbe; if(farbe == "blau") { maxGang = 7; } else if (farbe == "gruen") { maxGang = 3; } else { Console.WriteLine("Falsche eingabe"); Console.ReadKey(); System.Environment.Exit(1); } } public void Gangwechsel(double schalten) { if(schalten == 0) { this.gaenge--; if(this.gaenge == 0 && this.fahrend == true) { this.gaenge = 1; Console.WriteLine("Sie sind bereits im tiefsten gang"); } } else if(schalten == 1 && this.fahrend == true) { this.gaenge++; if(this.gaenge > this.maxGang) { this.gaenge = this.maxGang; Console.WriteLine("Sie sind bereits im höchsten Gang"); } } else { Console.WriteLine("Sie müssen zum Gang wechseln fahren"); } Console.WriteLine("Sie sind momentan im " + this.gaenge + " gang"); } public void Bremse(bool bremse) { this.bremse = bremse; if(fahrend == true && this.bremse == true) { fahrend= false; Console.WriteLine("Sie haben die Fahrt beendet"); } } public void Fortbewegung(bool fahrend) { this.fahrend = fahrend; if(this.bremse == true && this.fahrend == true) { Console.WriteLine("Sie haben die Bremse noch angezogen"); this.fahrend = false; } else { this.fahrend = true; Console.WriteLine("Das " + this.farbe + "Fahrrad ist im" + this.gaenge + " Gang losgefahren"); } } } }
问题原因与修复
1. 程序执行完逻辑后直接退出
你的程序在处理完一次按键输入后,Main方法就执行完毕,程序自然会退出。有两种修复方式:
- 临时暂停:在
switch语句块末尾添加代码,让程序等待用户按键后再退出:Console.WriteLine("\n按任意键退出..."); Console.ReadKey(); - 持续运行游戏:用循环包裹按键监听逻辑,让程序一直接收输入直到用户主动退出(比如按ESC键):
while (true) { input = Console.ReadKey(true); // true参数不显示输入的字符 switch(input.Key) { // 原有的case逻辑保持不变 case ConsoleKey.Escape: Console.WriteLine("游戏结束"); return; } }
2. 输入验证的小问题
构造函数中对颜色的判断是大小写敏感的,用户输入Blau或GRUEN会被判定为错误输入,可以添加大小写转换优化:
farbe = farbe.Trim().ToLower(); if(farbe == "blau") { maxGang = 7; } else if (farbe == "gruen") { maxGang = 3; }
代码优化建议
1. 变量类型修正
档位gaenge和maxGang是整数,应该用int代替double,避免不必要的浮点运算:
private int gaenge = 1; private int maxGang;
对应的Gangwechsel方法参数也改为int:
public void Gangwechsel(int schalten)
2. 字符串拼接优化
用C#的字符串插值代替+拼接,可读性更强,还能避免原代码中farbe和Fahrrad之间缺少空格的问题:
Console.WriteLine($"Das {farbe} Fahrrad ist im {gaenge}. Gang losgefahren");
3. 字段初始化简化
可以在字段声明时直接设置默认值,减少构造函数中的重复代码:
private int gaenge = 1; private bool bremse = false; private bool fahrend = false;
4. 档位切换逻辑修复
原减档逻辑会先把档位降到0再改回1,逻辑不合理,应该先判断是否可以减档:
if(schalten == 0) { if (this.gaenge > 1 && this.fahrend) { this.gaenge--; Console.WriteLine($"Sie sind jetzt im {this.gaenge}. Gang"); } else if (this.gaenge == 1 && this.fahrend) { Console.WriteLine("Sie sind bereits im tiefsten Gang"); } else { Console.WriteLine("Sie müssen zum Gang wechseln fahren"); } }
内容的提问来源于stack exchange,提问作者Mhythik
相关产品推荐
相关产品推荐

