PDA

View Full Version : سوال: يه مشكل در سورس برنامه snake it



rashid1368
شنبه 08 فروردین 1388, 12:38 عصر
سلام دوستان عزيز
من سورس برنامه snake it‌ رو نوشتم
البته يه كم ابتدايي هست كدهاي نوشته شده
يه قسمتي هست در timer كه اين كد درش نوشته شده است


for (int i = 1; i < counter; i++)
{
c[i].l = ll[i - 1].Left;
c[i].t = ll[i - 1].Top;
}

for (int i = 1; i < counter; i++)
{
ll[i].Left = c[i].l;
ll[i].Top = c[i].t;
}

اين قسمت براي اينه كه location هر قسمت از بدن مار، ادامه قسمت جلويي خودش باشه. (اينم يه الگوريتمه ديگه)
الان اين كدي كه نوشتم خوب كار مي كنه
ولي اين كدي كه در بالا نوشتم تا حد زيادي معادل اين كدي هست كه الان مي نويسم.


for (int i = 1; i < counter; i++)
{
ll[i].Left = ll[i - 1].Left;
ll[i].Top = ll[i - 1].Top;
}

ولي اين دو تا كد يه كار را براي من انجام نمي دهند.يعني كد اولي درست كار مي كنه ولي كد پاييني نه.
مي خواستم بدونم كه مشكل در كجاست. يعني آيا اين دو تا كد يكي هستند يا نه.
البته سورس برنامه رو هم مي ذارم.
ممنون ميشم كسي بتونه كمكم كنه

rnm123
یک شنبه 09 فروردین 1388, 17:44 عصر
با سلام
دوست عزیز دو کد نوشته شده اصلا با هم معادل نیستند . در کد اول شما مقادیر ارایه ll را در آرایه C ذخیره میکنید و سپس بر اساس آن آرایه اولی را باز سازی میکنید ولی در کد دوم اینطور نیست اگر دقت کنید در کد دوم یک اندیس آرایه بر اساس اطلاعات اندیس قبلی بروز میشود ولی اندیس قبلی هم اطلاعاتش قبالا توسط اندیس ماقبل خود بروز شده و تغییر یافته است یعنی شما بصورت بازگشتی به اندیس یکم عودت داده میشوید در حالی که مقادیر ذخیره شده در آرایه شما در کد اول در آرایه دیگری بدون تغییر محفوظ مانده و فقط خوانده میشوند ولی در کد دوم همانطوری که گفتم مقادیر به هم وابسته شده اند اگر شما چند تا مرحله از حلقه ها را در کدهای اول و دوم در روی کاغد شبیه سازی کنید متوجه میشوید حتی اگر برنامه را دیباگ کرده و مقادیر ار در حین اجرای برنامه کنترل کنید متوجه موضوع میشوید

13601360
یک شنبه 09 فروردین 1388, 21:50 عصر
دوست عزیز البته من نمونه کد شماره رو ندیدم
این کدی که برات میزارم رو امتحان کن



using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace SnakeCSharp
{
public partial class SnakeCSharpWindow : Form
{
private Timer t = new Timer();
private static Random myRnd = new Random();
private Point apple = new Point(myRnd.Next(64-1) * 10, myRnd.Next(48-1) * 10);
private Point dir = new Point(0, 10);
private LinkedList<Point> snake = new LinkedList<Point>(); //LinkedList doesn't have add...

public SnakeCSharpWindow()
{
this.ClientSize = new System.Drawing.Size(640, 480);
this.FormBorderStyle = FormBorderStyle.FixedSingle;
this.Name = "SnakeCSharpWindow";
this.Text = "SnakeCSharp";
this.Paint += new PaintEventHandler(SnakeCSharpWindow_Paint);
this.KeyDown += new KeyEventHandler(SnakeCSharpWindow_KeyDown);
t.Tick += new EventHandler(t_Tick);
t.Start();
snake.AddFirst(new Point(10,10));
}

void SnakeCSharpWindow_KeyDown(object sender, KeyEventArgs e) //Change direction
{
if (e.KeyCode == Keys.Left) {dir = new Point (-10,0 );}
if (e.KeyCode == Keys.Right) {dir = new Point(10, 0);}
if (e.KeyCode == Keys.Up) {dir = new Point(0, -10);}
if (e.KeyCode == Keys.Down) {dir = new Point(0, 10);}
}

void SnakeCSharpWindow_Paint(object sender, PaintEventArgs e)
{
e.Graphics.FillRectangle(Brushes.Green, apple.X + 2, apple.Y + 2, 5, 5);

int i = 0;
foreach (Point cur in snake) //Draw snake and check self collision
{
e.Graphics.FillRectangle(Brushes.Black, cur.X, cur.Y, 10, 10);
if (i != 0 && snake.First.Value.X == cur.X && snake.First.Value.Y == cur.Y ) { t.Stop(); }
i++;
}

if (snake.First.Value.X == apple.X && snake.First.Value.Y == apple.Y) //Collision apple
{
apple = new Point((myRnd.Next(64-1)) * 10, (myRnd.Next(48-1)) * 10);
snake.AddLast(snake.Last.Value);
}

}
void t_Tick(object sender, EventArgs e) //Move Snake
{
snake.AddFirst(new Point(snake.First.Value.X + dir.X, snake.First.Value.Y + dir.Y));
snake.RemoveLast();
this.Refresh();
}
}
}