一个难题

yuqi508 2005-03-25 02:40:54
我在窗体上画图后
窗体的KeyDown事件不好用了
KeyDown事件主要是控制蛇运动的方向
带吗如下
请帮调试
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace Snake
{
/// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Label lblmessage;
private System.ComponentModel.IContainer components;
const int SIZE=100;
public int Score;
public int gamespeed=5000;
private System.Windows.Forms.Timer timer1;
Random rnd =new Random();
public int i;
struct Food
{
public int x;
public int y;
public bool yes;
}
public struct Snake
{
public int[] x;
public int[] y;
public int node;
public int direction;
public bool life;
}

Food food;
Snake snake;
public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();

//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.button1 = new System.Windows.Forms.Button();
this.lblmessage = new System.Windows.Forms.Label();
this.timer1 = new System.Windows.Forms.Timer(this.components);
this.SuspendLayout();
//
// button1
//
this.button1.BackColor = System.Drawing.SystemColors.ActiveCaption;
this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.button1.ForeColor = System.Drawing.SystemColors.ActiveCaptionText;
this.button1.Location = new System.Drawing.Point(50, 8);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(96, 24);
this.button1.TabIndex = 0;
this.button1.Text = "开 始";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// lblmessage
//
this.lblmessage.BackColor = System.Drawing.SystemColors.ActiveCaption;
this.lblmessage.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.lblmessage.FlatStyle = System.Windows.Forms.FlatStyle.System;
this.lblmessage.ForeColor = System.Drawing.Color.White;
this.lblmessage.Location = new System.Drawing.Point(152, 8);
this.lblmessage.Name = "lblmessage";
this.lblmessage.Size = new System.Drawing.Size(456, 23);
this.lblmessage.TabIndex = 1;
this.lblmessage.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// timer1
//
this.timer1.Interval = 500;
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.BackColor = System.Drawing.SystemColors.ControlText;
this.ClientSize = new System.Drawing.Size(652, 582);
this.Controls.Add(this.lblmessage);
this.Controls.Add(this.button1);
this.ForeColor = System.Drawing.Color.Black;
this.Name = "Form1";
this.Text = "Form1";
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown);
this.Click += new System.EventHandler(this.Form1_Click);
this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.Form1_KeyPress);
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void Form1_Load(object sender, System.EventArgs e)
{


}
private void Drawk()
{
Pen p=new Pen(Color.Blue,3);
Graphics g=this.CreateGraphics();
int i;
for(i=50;i<=600;i+=10)
{
g.DrawRectangle(p,i,40,10,10);
g.DrawRectangle(p,i,451,10,10);
}
for(i=40;i<=450;i+=10)
{
g.DrawRectangle(p,50,i,10,10);
g.DrawRectangle(p,601,i,10,10);
}
}

private void Form1_Click(object sender, System.EventArgs e)
{
}

private void button1_Click(object sender, System.EventArgs e)
{
Drawk();
food.yes=true;
snake.x=new int[SIZE];
snake.y=new int[SIZE];
snake.life=true;
snake.node=2;
snake.x[0]=100;
snake.y[0]=100;
snake.x[1]=110;
snake.y[1]=100;
snake.direction=1;
this.timer1.Enabled=true;
}
private void Gameover()
{
Graphics g=this.CreateGraphics();
g.Clear(Color.Black);

}
private void PlayGame()
{
Pen p =new Pen(Color.Brown,2);
Pen p1 =new Pen(Color.Black,2);
Graphics g=this.CreateGraphics();
if(food.yes==true)
{
food.x=Convert.ToInt32(rnd.NextDouble()*400)+60;
food.y=Convert.ToInt32(rnd.NextDouble()*350)+60;
while(food.x % 10 !=0)
food.x++;
while(food.y % 10 !=0)
food.y++;
food.yes=false;
}

if(food.yes==false)
{ /*画面上有食物了就要显示*/
g.DrawRectangle(p,food.x,food.y,10,10);

}
for(i=snake.node-1;i>0;i--)
{/*蛇的每个环节往前移动*/
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
switch(snake.direction)
{/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
case 1: snake.x[0]+=10;break;
case 2: snake.x[0]-=10;break;
case 3: snake.y[0]-=10;break;
case 4: snake.y[0]+=10;break;
}

for(i=3;i<snake.node;i++)
{/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
if(snake.x[i]==snake.x[0] && snake.y[i]==snake.y[0])
{ Gameover();
snake.life=false;
return;
}
}
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455)
{ //超出范围结束游戏
Gameover();
snake.life=false;
}

if(snake.life==false)
{
return;
}

if(snake.x[0]==food.x&&snake.y[0]==food.y)
{ //吃到食物
g.DrawRectangle(p1,food.x,food.y,10,10);
snake.x[snake.node]=-20;
snake.y[snake.node]=-20;
snake.node++;
food.yes=true;
}

for(i=0;i<snake.node;i++)
{ //画蛇
g.DrawRectangle(p,snake.x[i],snake.y[i],10,10);

}
/*用黑色去除蛇的的最后一节*/
g.DrawRectangle(p1,snake.x[snake.node-1],snake.y[snake.node-1],10,10);
//g.DrawLine(p,snake.x[snake.node-1]+10,snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]+10);
if(snake.life==false)
return;


}
private void timer1_Tick(object sender, System.EventArgs e)
{
PlayGame();
}


private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
switch(e.KeyCode)
{
case Keys.Right:snake.direction=1;break;
case Keys.Left:snake.direction=2;break;
case Keys.Up:snake.direction=3;break;
case Keys.Down:snake.direction=4;break;
}


}
}
}
...全文
79 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenyuming2004 2005-03-26
  • 打赏
  • 举报
回复
private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{

}

窗体的Paint事件里面重画图像。
ASDC001 2005-03-26
  • 打赏
  • 举报
回复
楼上的都说啦
早些把这个游戏拿出来玩玩哈
xxuu503 2005-03-26
  • 打赏
  • 举报
回复
我楼上说得对!
yuqi508 2005-03-25
  • 打赏
  • 举报
回复
新在又有问题了
当窗体最小化和击活其他窗体后
在最大化窗体上的图画就不见了
请问我该怎么办?????????????????????????
pedit 2005-03-25
  • 打赏
  • 举报
回复
Form1.KeyPreview = true;

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧