群里聊天的时候,一个学妹说她在做贪吃蛇的小作业,于是昨晚(5.20无聊只好撸代码/(ㄒoㄒ)/~~)花了2个小时撸了一个出来,早上又花了些时间完善功能,就有了这个还算比较完善的版本,当然代码结构比较混乱,没有抽像成类,后来搜索了博客园以前的,发现都只是实现了基本的功能,根本不能愉快的玩耍。

整个程序只定义了一个Pos类来保存点的x,y坐标值

    //位置类
class Pos
{
public int X;
public int Y;
public Pos(int x, int y)
{
X = x;
Y = y;
}
}

蛇身体用一个队列来保存Pos信息,使用队列虽然方便了蛇尾移出和蛇头添加,却不能直接得到蛇头信息,所以独立变量保存,食物也是一个独立的Pos变量记录其位置

        Pos food;        //食物位置
Queue<Pos> snake;//蛇身体队列
Pos head; //蛇头位置
int x,y; //横竖线条数
int cubeL = ; //格子大小

整个游戏节奏由定时器驱动,当蛇长度到达预定长度,定时器将会缩短时间间隔,加快游戏进度(到100毫秒的时候,已经丧病了)

        private void Speed()
{
if (snake.Count == )
{
timer1.Interval = ;
level = ;
} ........ else if (snake.Count == )
{
timer1.Interval = ;
level = ;
}
}

绘制代码就不详细解释了,有点乱,如果您有耐心可以把它们抽离出来写到一个Snake类里面

private void Form1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.TranslateTransform(20, 50);
    Pen pen = new Pen(Color.Green,1);
    //绘制网格
    for (int i = 0; i < x+1; i++)
    {
        e.Graphics.DrawLine(pen, i * cubeL, 0, i * cubeL, y * cubeL);
    }
    for (int j = 0; j < y+1; j++)
    {
        e.Graphics.DrawLine(pen, 0, j * cubeL, x * cubeL, j * cubeL);
    }
    SolidBrush brush = new SolidBrush(Color.Orange);
    //绘制蛇
    if (state != GameState.Init)
    {
        e.Graphics.FillRectangle(brush, food.X * cubeL, food.Y * cubeL, cubeL, cubeL);
        brush.Color = Color.DeepSkyBlue;
        foreach (var p in snake)
        {
            e.Graphics.FillRectangle(brush, p.X * cubeL, p.Y * cubeL, cubeL, cubeL);
        }
        brush.Color = Color.Blue;
        e.Graphics.FillRectangle(brush, head.X * cubeL, head.Y * cubeL, cubeL, cubeL);
        brush.Color = Color.Red;
    }
    //绘制状态提示
    if(state == GameState.Init)
    {
        brush.Color = Color.Red;
        e.Graphics.DrawString("S 开始游戏,空格 暂停/继续游戏 \n\r奔向死亡吧,骚年!", new Font("微软雅黑", 20), brush, 150, 120);
    }
    else if (state == GameState.Start)
    {
        if (!timer1.Enabled)
            e.Graphics.DrawString("游戏暂停,空格继续!", new Font("微软雅黑", 20), brush, 150, 120);
    }
    else
    {
        brush.Color = Color.Red;
        e.Graphics.DrawString("游戏结束,S 开始游戏!", new Font("微软雅黑", 20), brush, 150, 120);
    }
    e.Graphics.ResetTransform();
    string tip = "level:"+level.ToString()+" 长度: "+snake.Count.ToString()+ "  分数:"+(snake.Count*level*10).ToString();
    brush.Color = Color.Black;
    e.Graphics.DrawString(tip, new Font("微软雅黑", 15), brush, 360, 10);
}

键盘输入处理,输入的键被暂时保存在一个Direction枚举变量中,直到移动之后才确定为当前移动方向(否则会出现bug,比如先其他方向,再反方向就会出错)

        private void Form1_KeyDown(object sender, KeyEventArgs e)
{
switch(e.KeyCode)
{
case Keys.Up:
if(Dir != Direction.Down) //不能向当前方向的反方向移动
tmpDir = Direction.Up; //临时保存,移动之后才确定为当前方向
break;
          .......          case Keys.Space:
if(state == GameState.Start)
{
timer1.Enabled = !timer1.Enabled;
Invalidate();
}
break;
case Keys.S:
if (state == GameState.Start)
{
timer1.Enabled = false;
if (MessageBox.Show("确定重新开始游戏?", "提示", MessageBoxButtons.OKCancel) == DialogResult.Cancel)
{
timer1.Enabled = true;
break;
}
}
StartGame();
break; }
}
}

蛇的移动,食物,游戏是否结束判断

            switch (Dir) //使用策略模式来替代switch
{
case Direction.Up:
{
if (head.Y <= ) //撞墙
{
GameOver();
}
foreach (var po in snake)
{
if (po.Y + == head.Y && po.X == head.X) //吃掉自己
{
GameOver();
break;
}
}
if (state == GameState.Over)
break; if (food.Y + == head.Y && food.X == head.X) //吃掉食物
{
snake.Enqueue(food);
head = food;
GenerateFood();
}
else //向前移动一格
{
snake.Dequeue();
head = new Pos(head.X, head.Y - );
snake.Enqueue(head);
}
}
break;
case Direction.Down:

整个程序的结构到此介绍完毕,总的来说是一个比较完整的小游戏了,当然有很多地方可以优化,但个人也就没那个兴趣和精力了(笑)

下载地址:GreedySnake

人生就像一条加速奔向死亡的贪吃蛇【winform版】的更多相关文章

  1. CSDN日报20170328——《你看那个人他像一条狗》

    [程序人生]你看那个人他像一条狗 作者:清纯的微笑 今年三十了,到了传说中程序猿最应该迷茫的年龄了,那么我迷茫吗,没的说,依照华为34岁就要劝退的要求,我还有4年的程序生涯. [微信小程序]重磅!个人 ...

  2. 使用Cache防止多人同时修改同一条信息

    Default.aspx: <a href="Default2.aspx?id=123&type=11ad">打开第二个页面id=123</a>&l ...

  3. 新增16条设计规约!阿里巴巴Java开发手册(详尽版)开放下载!

    <阿里巴巴Java开发手册>是阿里内部Java工程师所遵循的开发规范,涵盖编程规约.单元测试规约.异常日志规约.MySQL规约.工程规约.安全规约等,这是近万名阿里Java技术精英的经验总 ...

  4. 程序游戏推荐(C语言贪吃蛇,python天天酷跑(需要安装pygame),js是狠人就坚持30s)

    下面是下载位置,我把他们上传到我的文件下了. C语言贪吃蛇:https://files.cnblogs.com/files/ITXiaoAng/%E8%B4%AA%E5%90%83%E8%9B%87. ...

  5. QT实现两条贪吃蛇

    Snake.pro文件 1 #------------------------------------------------- 2 # 3 # Project created by QtCreato ...

  6. 20172321 20172333 2017-2018 暑假作业APP

    20172321 20172333 2017-2018 暑假作业APP 项目介绍 项目成员 吴恒佚 20172321 严域俊 20172333 项目简介 从理论上来说,这是一个贪吃蛇游戏. <贪 ...

  7. C语言 贪吃蛇

    贪吃蛇(单人版): 本人先来介绍一个函数 -- bioskey函数: int bioskey (int cmd) 参数 (cmd) 基本功能 0 返回下一个从键盘键入的值(若不键入任何值,则将等下一个 ...

  8. UESTC_贪吃蛇 CDOJ 709

    相信大家都玩过贪吃蛇游戏吧. 在n×m的迷宫中,有着一条长度不超过9的贪吃蛇,它已经将所有的食物吃光了,现在的目标是移动到出口. 它走的时候不能碰到自己的身体,也不能碰到墙壁.(如果贪吃蛇的长度> ...

  9. c/c++ 贪吃蛇控制台版

    贪吃蛇控制台版(操作系统win7 64位:编译环境gcc, vs2017通过,其它环境未测试 不保证一定通过) 运行效果: #include <iomanip> #include < ...

随机推荐

  1. ConcurrentDictionary与Dictionary 替换

    本文导读:ASP.NET中ConcurrentDictionary是.Net4 增加的,相对于Dictionary的线程安全的集合, ConcurrentDictionary可实现一个线程安全的集合, ...

  2. ASP.NET MVC之从控制器传递数据到视图方式

    为了演示,先定义一个类 新建基本项目在Models文件夹下定义如下类: public class Person { public int Id { get; set; } public string ...

  3. c/c++ 有向无环图 directed acycline graph

    c/c++ 有向无环图 directed acycline graph 概念: 图中点与点之间的线是有方向的,图中不存在环.用邻接表的方式,实现的图. 名词: 顶点的入度:到这个顶点的线的数量. 顶点 ...

  4. ASP.NET -- WebForm -- Session的使用

    ASP.NET -- WebForm --  Session的使用 Session是服务器端状态保持机制. 1. Test4.aspx文件与Test4.aspx.cs文件 <%@ Page La ...

  5. Git&GitHub-进阶教程

    目录 1. 远程仓库-GitHub 1.1 本地电脑如何关联GitHub? 1.2. 创建并操控远程库GitHub (1) 把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库. ...

  6. Nginx使用教程(四):提高Nginx网络吞吐量之buffers优化

    请求缓冲区在NGINX请求处理中起着重要作用. 在接收到请求时,NGINX将其写入这些缓冲区. 这些缓冲区中的数据可作为NGINX变量使用,例如$request_body. 如果缓冲区与请求大小相比较 ...

  7. Loj 3058. 「HNOI2019」白兔之舞

    Loj 3058. 「HNOI2019」白兔之舞 题目描述 有一张顶点数为 \((L+1)\times n\) 的有向图.这张图的每个顶点由一个二元组 \((u,v)\) 表示 \((0\le u\l ...

  8. 设计模式のAdapterPattern(适配器模式)----结构模式

    一.产生背景 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能.举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器.您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本 ...

  9. CROI R1

    $CROI$ $R1$ 今天参加了一场比赛,什么比赛呢?CROI. CROI是什么呢? $Challestend$ $Rehtorbegnaro$ $OI$.总的来说就是我们机房的一些神仙出的题啦. ...

  10. 转://Oracle 数据备份与恢复微实践

    1.模拟控制文件丢失后的数据库恢复(完全恢复) 今天的主题是备份与恢复,目的就是保护数据的安全性,众所周知Oracle之所以在市场上占据了50%的份额,与它提供了强大的数据保护措施是分不开的,下面我们 ...