2 patricia1997 patricia1997 于 2016.02.12 18:32 提问

程序媛小白求助:C#贪吃蛇精灵游戏

我编了一个贪吃蛇的游戏,代码如下。编译无错误,但运行后蛇不会动啊~我真的真的不知道问题出在哪儿。多谢各位大神指教~
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Timers;

namespace GreedySnake3
{

public partial class Form2 : Form
{
    Snake snack1 = new Snake(4);
    private System.Drawing.Color foodColor = System.Drawing.Color.Red;
    Bean food = new Bean();                  
    bool play = false;                       
    bool foodDraw = false;
    private void Form2_Load(object sender, EventArgs e)
    {
           pictureBox1.Paint += pictureBox1_Paint;
           timer1.Tick+=timer1_Tick;
    }

    public Form2()
    {
        InitializeComponent();
    }



    private void button1_Click(object sender, EventArgs e)
    {
        play = true;
        this.timer1.Enabled = true;
        this.timer1.Interval = 500;


    }
    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = e.Graphics;            
        DrawGameFrame(e.Graphics);   

        snack1.DrawSnack(e.Graphics);   

        if (foodDraw == false)
        {
            food.GetFoodPoint();
            foodDraw = true;
        }
        food.DrawFood(e.Graphics);   

        if (play)
        {
            snack1.SnackMoce(e.Graphics);

        }
        if (this.timer1.Enabled == true)
        {
            this.button1.Focus();
        }


    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (play)
        {
            snack1.Addsnack();
        }
        if (snack1.HeadPoint == food.Origin)
        {

            foodDraw = false;
            snack1.Addsnack();



        }
        if (snack1.Diedif())
        {
            timer1.Enabled = false;
            play = false;
            MessageBox.Show("Game Over!");

        }
    }


    public void DrawGameFrame(Graphics g)
    {
        for (int i = 0; i < this.pictureBox1.Width; i += 10)
            for (int j = 0; j < this.pictureBox1.Height; j += 10)
            {
                g.FillEllipse(Brushes.LightGreen, i, j, 10, 10);
            }
    }


    private void button1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.A  && snack1.Direction != 1)
            snack1.Direction = 2;
        else if (e.KeyCode == Keys.D && snack1.Direction != 2)
            snack1.Direction = 1;
        else if (e.KeyCode == Keys.W && snack1.Direction != 4)
            snack1.Direction = 3;
        else if (e.KeyCode == Keys.S && snack1.Direction != 3)
            snack1.Direction = 4;


    }



    private void button2_Click(object sender, EventArgs e)
    {
        this.Close();
    }




}
public class Bean
{
    Point origin=new Point(100,100);
    public Point Origin
    {
        get { return origin; }
        set { origin = value; }
    }
    public void GetFoodPoint()
        {
            Random random = new Random();
            int x = random.Next(1, 40)*10;
            int y = random.Next(1, 30)*10;
            origin = new Point(x, y);
        }
        public void DrawFood(Graphics g)
        {
            g.FillEllipse(Brushes.Red, origin.X, origin.Y, 10, 10);
        }
    }



public class Snake
{
    public Point startPoint = new Point(0, 0);
    Point addPoint;
    public ArrayList snackPoint = new ArrayList();
    Point headPoint;
    public Point HeadPoint
    {
        get { return headPoint; }
        set { headPoint = value; }
    }
    int direction = 1;
    public int Direction
    {
        get { return direction; }
        set { direction = value; }
    }


    public Snake(int lenth)
    {
        for (int i = 0; i < lenth; i++)
        {
            snackPoint.Add(startPoint);
            if (i == lenth - 1)
            {
                HeadPoint = startPoint;
                return;
            }
            startPoint = new Point(startPoint.X + 10, startPoint.Y);
        }
    }
    public void DrawSnack(Graphics g)
    {
        for (int i = 0; i < snackPoint.Count; i++)
        {
            g.FillEllipse(Brushes.Blue, ((Point)snackPoint[i]).X, ((Point)snackPoint[i]).Y, 10, 10);
        }
    }

    public void Addsnack()
    {
        if (direction == 1)
            addPoint = new Point(headPoint.X + 10, headPoint.Y);
        else if (direction == 2)
            addPoint = new Point(headPoint.X - 10, headPoint.Y);
        else if (direction == 3)
            addPoint = new Point(headPoint.X, headPoint.Y - 10);
        else if (direction == 4)
            addPoint = new Point(headPoint.X, headPoint.Y + 10);
        snackPoint.Add(addPoint);
        headPoint = addPoint;
    }


    public void RemoveSnackNode()
    {
        snackPoint.RemoveAt(0);
    }


    public void SnackMoce(Graphics g)
    {
        DrawSnack(g);
        RemoveSnackNode();
    }

    public bool Diedif()
    {
        for (int i = 0; i < snackPoint.Count - 1; i++)
        {
            if ((Point)snackPoint[i] == headPoint)
                return true;
        }

        if (headPoint.X < 0 || headPoint.X > 400 || headPoint.Y < 0 || headPoint.Y > 300)
            return true;
        return false;
    }
}

}

4个回答

Alickqubes
Alickqubes   2016.02.17 16:34
已采纳

pictureBox1 的paint 事件不会时时触发 在timer1_tick中添加 pictureBox1.Refresh(); 让它定时触发paint 重新绘制自己
private void timer1_Tick(object sender, EventArgs e)
{
if (play)
{
pictureBox1.Refresh();
snack1.Addsnack();

        }
        if (snack1.HeadPoint == food.Origin)
        {
            pictureBox1.Refresh();
            foodDraw = false;
            snack1.Addsnack();



        }
        if (snack1.Diedif())
        {
            pictureBox1.Refresh();
            timer1.Enabled = false;
            play = false;
            MessageBox.Show("Game Over!");

        }
    }
caozhy
caozhy   Ds   Rxr 2016.02.12 21:41

你的代码是直接复制粘贴的么?选中你的PictureBox1,在属性窗格里点闪电按钮,看Paint事件关联给pictureBox1_Paint了没有。

sinat_32124195
sinat_32124195   2016.02.13 14:49

你的timer好像没有start

patricia1997
patricia1997 谢谢~在Form2_load里加了start之后还是不动
2 年多之前 回复
enpterexpress
enpterexpress   Rxr 2016.02.13 19:33

图片说明没有错误么

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
c#窗体实现贪吃蛇游戏
C#窗体实现贪吃蛇,程序简单易懂,开发平台vs2010
CSharp 贪吃蛇源代码
注释明了,并有图片参考。初学者容易接受!! 注意:如有什么疑问,请留言!
C#Form窗体编程贪吃蛇小游戏
用Form窗体编程的贪吃蛇游戏,通过使用类的继承与调用完成编程。
C#游戏编程:《控制台小游戏系列》之《六、贪吃蛇实例》
一、游戏分析   1976年,Gremlin平台推出一款经典街机游戏Blockade,则为贪吃蛇的原型,这款简单的小游戏很受欢迎,给80后这代人带来不可磨灭的记忆。作为未来程序员的我们,玩自己设计出的贪吃蛇比玩现有的更加有趣,我们可以添加我们所想到的各种特征,即使游戏多么另类都不觉得奇怪,我的游戏我做主!   贪吃蛇的设计并不复杂,是很多游戏编程爱好者入门的首选项目之一,老衲也一样。整观这
用C#实现贪吃蛇游戏
先说了,如果不会GDI+,类的定义这些基础东西的,请先搜索相关贴子学习。 这次教大家用C#做一个简单的贪吃蛇游戏。先介绍用到的技术:GDI+定义类枚举 因为C#是一门面向对象的语言,我们不用把所有代码都写在一个窗体上,应该有一个分层思想(界面还界面,数据处理还数据处理),如果还要网上对战的话,搞个三层吧(界面层,数据处理或逻辑层,Socket层),这样不仅方便维护,
(原创)C#贪吃蛇小游戏 GDI +
c#编写的贪吃蛇小游戏,应用到了GDI+和基本文件流的读写,供大家一起学习和交流,有什么建议可以联系我!
在WinForm中使用GDI+编写游戏--贪吃蛇
很久之前写的贪吃蛇游戏。。。 先看下效果图:
c#写的贪吃蛇小游戏及代码,适合初学者
c#写的贪吃蛇小游戏及代码,适合初学者,包括源代码,是用vs2010写的,有等级和不同果实不同速度的改变
STM32贪吃蛇游戏源代码
基于STM32F103的贪吃蛇游戏,主程序每句代码都有注释,自己写的,可供参考(百为STM32开发板可以直接下载运行)
贪吃蛇游戏总结
初次接触C#,以贪吃蛇游戏揭开帷幕。    贪吃蛇游戏的设计主要涉及到蛇的产生、消除与显示,豆的产生、消除与显示,以及分数的增加,地板的显示等等。为此程序的设计包括以下几个方面:    (1)新建一个XMLRW类,用于对xml文档进行读写,包括蛇的颜色、速度的读写,豆的颜色的读写以及窗体背景色的读写、游戏记录的保存等等;    (2)新建一个block类,该类用于保存贪吃蛇每一个块的坐标点以