C#核心实践小项目--贪吃蛇(自己实现)

源码地址:oohSunset/-2-: 贪吃蛇(跟着老师实现)

贪吃蛇

本篇文章是先不看老师教程的情况下,自己独立来完成的,顺便记录一下实现的过程。

项目展示

方向控制:WSAD

确定键:J

需求分析(UML类图)

UML类图是老师提供的,因为以我现在的能力还画不出逻辑这么清晰的UML类图!

补充知识点:

检测键盘是否激活

Console.KeyAvailable == true;

注意使用后会使程序变慢,具体为什么我还不得而知,后面慢慢的积累学习我想我会弄明白的。

开始前:

按照UML类图逐个去写逐个去实现(但是有些模块我没有用上)

主要精力是放在了功能实现上

下面是我实现的过程

一、万事开头难--游戏类

(我先确定了开始着手的地方--游戏类,因为它是所有类和方法的汇聚地)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
 
//游戏类
 
namespace 自个先写CSharp核心小项目_贪吃蛇_
{
    enum E_Scene
    {
        BeginID,
        GamingID,
        FinishID,
    }
 
    class Game
    {
        public static int x;
        public static int y;
        public static E_Scene scene = new E_Scene();
        Begin begin = new Begin();
        Finish finish = new Finish();
 
        public Game()
        {
            x = 100;
            y = 30;
            scene = E_Scene.BeginID;
        }
 
        //初始化控制台
        public void Consoles()
        {
            //隐藏光标
            Console.CursorVisible = false;
            //设置舞台大小
            Console.SetWindowSize(x, y);
            Console.SetBufferSize(x, y);
 
        }
 
        //游戏主循环
        public void MajorCycle()
        {
            while (true)
            {
                //思考一下,为什么把开始场景和结束场景的类申明放在外面,而游戏场景的类申明放循环里面
                //因为开始结束场景是一成不变的,只需申明一次就够用了
                //而游戏场景进入一次就会执行出结果出来,每次结果都将不一样,所以每次都得重新申明
                switch (scene)
                {
                    case E_Scene.BeginID:
                        Console.Clear();
                        begin.newers();
                        break;
                    case E_Scene.GamingID:
                        Console.Clear();
                        GameScene gameScene = new GameScene();
                        gameScene.newers();
                        break;
                    case E_Scene.FinishID:
                        Console.Clear();
                        finish.newers();
                        break;
                    default:
                        break;
                }
            }
        }
 
        //场景切换
        public void SceneMove()
        {
 
        }
 
    }
}

二、游戏帧更新接口

1.更新接口

2.开始和结束场景基类

开始场景类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
//开始场景
 
namespace 自个先写CSharp核心小项目_贪吃蛇_
{
    class Begin : BeginAndFinish
    {
        public Begin()
        {
            str = "贪吃蛇";
            str1 = "开始游戏";
            str2 = "结束游戏";
        }
 
        //重写更新方法
        public override void newers()
        {
            Console.SetCursorPosition(48, 10);
            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine
c#贪吃蛇精简版 public void 创建蛇身() { //创建一个Label标签 Label lbl = new Label(); //设置背景颜色,如果是蛇头就添加不同的颜色 if (arr.Count == 0) {//蛇头 lbl.BackColor = Color.Blue; } else {//蛇身 lbl.BackColor = Color.Red; } //设置宽和高 lbl.Width = 19; lbl.Height = 19; //设置起始位置 lbl.Left = -20; //添加到Panel中 this.panel1.Controls.Add(lbl); //将这一节身体保存在ArrayList中,以方便将来对蛇的身体进行移动操作 arr.Add(lbl); } //定时器 private void timer1_Tick(object sender, EventArgs e) { //先移动身体,从尾巴开始移动 for (int i = arr.Count - 1; i > 0; i--) { //得到第i节身体 Label 身体i = (Label)arr[i]; //得到第i节身体的前一节身体 Label 前一节 = (Label)arr[i - 1]; //移动第i节身体 身体i.Left = 前一节.Left; 身体i.Top = 前一节.Top; } //得到蛇头 Label 蛇头 = (Label)arr[0]; //根据方向移动蛇头 if (fx == "上") 蛇头.Top -= 20; else if (fx == "下") 蛇头.Top += 20; else if (fx == "左") 蛇头.Left -= 20; else if (fx == "右") 蛇头.Left += 20; //判断撞墙了没有 if (蛇头.Left < 0 || 蛇头.Top < 0 || 蛇头.Left >= this.panel1.Width || 蛇头.Top >= this.panel1.Height) { this.timer1.Stop(); MessageBox.Show("你撞墙了。"); 重新开始游戏(); return; } //判断有没有撞自己 for (int i = 1; i < arr.Count; i++) { //取出第i节蛇身 Label 蛇身 = (Label)arr[i]; //判断有没有相撞 if (蛇头.Left == 蛇身.Left && 蛇头.Top == 蛇身.Top) { this.timer1.Stop(); MessageBox.Show("你撞到自己了。"); 重新开始游戏(); return; } }
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值