You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:20:22