首页 > 编程语言 >C#实现贪吃蛇游戏

C#实现贪吃蛇游戏

时间:2024-03-20 17:58:05浏览次数:21  
标签:Direction Console 游戏 C# int 贪吃蛇 static snake dir

 

定义贪吃蛇和游戏逻辑

  1. 定义数据结构:创建一个类来表示贪吃蛇的每个部分(通常是一个具有X和Y坐标的结构体或类)。
  2. 定义游戏状态:包括蛇的位置、方向、长度以及食物的位置。
  3. 处理键盘输入:重写窗体的键盘事件处理函数,以便玩家可以使用键盘控制蛇的移动方向。
  4. 更新游戏状态:在每个游戏循环中,更新蛇的位置(根据当前方向和移动速度),并检查是否吃到食物、撞到墙壁或自己。
  5. 绘制游戏画面:在窗体的Paint事件中,根据当前的游戏状态绘制蛇和食物。
using System;
using System.Collections.Generic;
using System.Threading;

class Program
{
    // 游戏区域大小
    static int width = 20;
    static int height = 10;

    // 蛇的方向
    enum Direction { Up, Down, Left, Right };
    static Direction dir = Direction.Right;

    // 蛇的初始位置
    static List<int[]> snake = new List<int[]> { new int[] { 3, 1 }, new int[] { 2, 1 }, new int[] { 1, 1 } };

    // 食物的位置
    static int[] food = new int[2];

    // 游戏是否结束
    static bool gameOver = false;

    static void Main(string[] args)
    {
        Console.CursorVisible = false;
        Console.SetWindowSize(width + 1, height + 1);

        // 设置初始食物位置
        GenerateFood();

        // 游戏循环
        while (!gameOver)
        {
            Draw();
            Input();
            Move();
            CheckCollision();
            Thread.Sleep(100);
        }

        Console.SetCursorPosition(width / 2 - 4, height / 2);
        Console.WriteLine("Game Over!");
        Console.ReadKey();
    }

    static void Draw()
    {
        Console.Clear();

        // 画蛇
        foreach (var segment in snake)
        {
            Console.SetCursorPosition(segment[0], segment[1]);
            Console.Write("o");
        }

        // 画食物
        Console.SetCursorPosition(food[0], food[1]);
        Console.Write("X");
    }

    static void Input()
    {
        if (Console.KeyAvailable)
        {
            ConsoleKeyInfo key = Console.ReadKey(true);
            switch (key.Key)
            {
                case ConsoleKey.W:
                    if (dir != Direction.Down)
                        dir = Direction.Up;
                    break;
                case ConsoleKey.S:
                    if (dir != Direction.Up)
                        dir = Direction.Down;
                    break;
                case ConsoleKey.A:
                    if (dir != Direction.Right)
                        dir = Direction.Left;
                    break;
                case ConsoleKey.D:
                    if (dir != Direction.Left)
                        dir = Direction.Right;
                    break;
            }
        }
    }

    static void Move()
    {
        int[] head = new int[] { snake[0][0], snake[0][1] };
        switch (dir)
        {
            case Direction.Up:
                head[1]--;
                break;
            case Direction.Down:
                head[1]++;
                break;
            case Direction.Left:
                head[0]--;
                break;
            case Direction.Right:
                head[0]++;
                break;
        }

        // 添加新的头部
        snake.Insert(0, head);

        // 如果吃到了食物
        if (head[0] == food[0] && head[1] == food[1])
        {
            GenerateFood();
        }
        else
        {
            // 移除尾部
            snake.RemoveAt(snake.Count - 1);
        }
    }

    static void GenerateFood()
    {
        Random rnd = new Random();
        bool validPosition = false;

        // 确保食物不在蛇身上
        while (!validPosition)
        {
            food[0] = rnd.Next(0, width);
            food[1] = rnd.Next(0, height);
            validPosition = true;

            foreach (var segment in snake)
            {
                if (food[0] == segment[0] && food[1] == segment[1])
                {
                    validPosition = false;
                    break;
                }
            }
        }
    }

    static void CheckCollision()
    {
        // 检查蛇头是否碰到边界
        if (snake[0][0] < 0 || snake[0][0] >= width || snake[0][1] < 0 || snake[0][1] >= height)
        {
            gameOver = true;
            return;
        }

        // 检查蛇头是否碰到自己的身体
        for (int i = 1; i < snake.Count; i++)
        {
            if (snake[0][0] == snake[i][0] && snake[0][1] == snake[i][1])
            {
                gameOver = true;
                return;
            }
        }
    }
}

这段代码创建了一个简单的贪吃蛇游戏,你可以在控制台中运行它。玩家可以使用WASD键来控制蛇的移动,目标是尽可能地吃到食物而不与蛇的身体相撞。

标签:Direction,Console,游戏,C#,int,贪吃蛇,static,snake,dir
From: https://blog.csdn.net/zhaoyu_1979/article/details/136882676

相关文章

  • Socketserver模块
    Socketserver模块socketserver主要是针对服务端来做的,所以对于客户端代码,并没有太多的改变网络协议的最底层就是socket,基于原有socket模块,又封装了一层,就是socketserversocketserver为了实现tcp协议,server端的并发首先,你必须通过子类化BaseRequestHandler类并重......
  • MySQL varchar详解
    ......
  • WPF MVVM模式ListBox下ContextMenu绑定Command的方法以及将所选的Item的数据传回去
    需求:ListBoxItem上右键,将数据传参。疑问:ContextMenu不继承DataContext,导致直接用RelativeSource找根的方式也绑定不到。解决方法:在ListBox.ContextMenu里写菜单,就可以直接绑定到ViewModel层的命令了,参数先用RelativeSource找到ContextMenu,再绑定PlacementTarget.SelectedItem。......
  • mfc进程方面处理
    //获取某个进程IDDWORDGetTaskManagerProcessId(){ DWORDtaskManagerProcessId=0; PROCESSENTRY32pe32; pe32.dwSize=sizeof(PROCESSENTRY32); HANDLEhProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if(hProcessSnap==INVALID_HANDLE_VAL......
  • CF1091F 题解
    blog。提供线性做法,各方面完爆反悔贪心。先钦定能不飞就不飞,最后再分配盈余的能量。可能会在飞Lava的时候不够能量,只需要在前面来回移动,刷能量即可。由于Swim比Walk快,所以能Swim就全部用Swim刷能量,不能就Walk。最后是分配盈余能量。显然优先把Walk换成Fly,换一......
  • Chocolatey安装与使用
    目录使用Chocolatey完成一键盘安装Windows环境下的所有程序依赖Chocolatey安装Chocolatey安装前提条件安装要求Chocolatey组成安装ChocolateyChocolatey用法常用命令常用安装包补充search命令install命令update命令更新包卸载安装包uninstall命令如果你不想在命令行中搜索和安装......
  • python coding with ChatGPT 打卡第23天| 回溯算法:理论基础
    文章目录视频讲解回溯法的效率解决的问题如何理解回溯法回溯框架视频讲解回溯算法理论篇回溯是递归的副产品,只要有递归就会有回溯。回溯法的效率回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法......
  • Android第一行代码——快速入门 Kotlin 编程(3.6 Activity 的最佳实践)
    目录3.6        Activity的最佳实践3.6.1    知晓当前是在哪一个Activity3.6.2    随时随地退出程序 3.6.3    启动Activity的最佳写法3.6        Activity的最佳实践        关于Activity,你已经掌握了非常多......
  • c++简介
    C++(cplusplus)是一种计算机高级程序设计语言,由C语言扩展升级而产生[17],最早于1979年由本贾尼·斯特劳斯特卢普在AT&T贝尔工作室研发。C++既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的......
  • Docker安装MinIO保姆级安装
    文章目录前言一、前提二、安装步骤1.首先在你想安装位置下创建一个文件目录,进入目录后创建一个docker-compose.yml文件2.编辑docker-compose.yml文件3.当前路径下新建文件夹config,新建配置文件nginx.conf4编写配置文件nginx.conf5.启动&测试6.访问测试总结前......