Консультация № 165083
15.04.2009, 23:58
0.00 руб.
16.04.2009, 07:13
0 4 1
Уважаемыее эксперты ... мне надо игруху написать на C# гоночки.... в программе Microsoft Visual Studio 8!
простые, едет машинка, а на неё валяца препятсвия(можно тоже машинки(по типу обгона))!
Может вдруг у кого завалились исходнички(код данной игрухи) или ему не составит труда её быренько написать.... помогите пожалуста!!!

Обсуждение

давно
Старший Модератор
17042
808
16.04.2009, 07:14
общий
Саша Белый :

Обратите внимание: C# - это не C++ и не C.
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Неизвестный
16.04.2009, 11:37
общий
Боюсь не завалялись
Неизвестный
16.04.2009, 15:10
общий
посмотрите пожалуста!!! игруха простая, самая что не наесть простая нужна=)
Неизвестный
19.04.2009, 05:33
общий
это ответ
Здравствуйте, Саша Белый!

По обрывкам моей тестовой программы попытался быстро набросать игрушку, как из старых "Тетрисов". Получилась вполне работоспособная игрушка про самоходную могилкуОтрисовка основывается на матричных трансформациях - так можно легко сдвинуть, повернуть или увеличить игровое поле всего одной командой.

Изменить отрисовку машинки можно в функции DrawCar, но если Вы будете использовать другую маску - не забудьте обновить также функцию TestPosition.

Добавлять новые препятствия можно в функции ExtendRoad. Для того, чтобы они выглядели по-разному - заполняйте Fields не только единицами, и в функции DrawBlock рисуйте квадратик в соответствии с числом.

Картинка проскалирована так, чтобы размер единичного квадратика был равен 1. Так что, если Вы будете рисовать в них какие-то фигуры - координаты надо ограничить интервалом [0..1].

Используемые кнопки видны в функции KeyPressed.

Приложение:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace TempW
{
/// <summary>
/// Размеры поля 15*30 квадратиков
/// </summary>
public class Form1 : Form
{
public Form1()
{
this.DoubleBuffered = true;
Width = 400;
Height = 500;
Timer.Tick += TimerProcessor;
Timer.Interval = 250;
this.KeyDown += KeyPressed;
this.Paint += PaintGame;
ReinitGame();
}

//Игровой таймер
Timer Timer = new Timer();

/// <summary>Игровое поле</summary>
List<byte[]> Field = new List<byte[]>(30);

/// <summary>Координата центра машинки</summary>
int CarPosition = 7;

/// <summary>Генератор случайных чисел</summary>
Random RND = new Random();

#region Служебные функции
/// <summary>Обнуляет поле для начала новой игры</summary>
void ReinitGame()
{
CarPosition = 7;
byte[] Line = new byte[15];
Field.Clear();
for (int i = 0; i < 30; i++)
Field.Add(Line);
}

/// <summary>Создает новые строки дороги.</summary>
void ExtendRoad()
{
if (RND.NextDouble() > 0.3)//Добавляем пустую строку
Field.Add(new byte[15]);
else//Добавляем квадратное препятствие
{
int i = RND.Next(14);
byte[] Line = new byte[15];
Line[i] = 1;
Line[i + 1] = 1;
Field.Add(Line);
Field.Add(Line);
}
}

/// <summary>Проверяет позицию машинки на поле. Заканчивает игру при наезде.</summary>
bool TestPosition()
{
bool Break = false;
byte[] F = Field[3];
if(F[CarPosition]!=0) Break=true;

F = Field[2];
if ((F[CarPosition - 1] | F[CarPosition] | F[CarPosition + 1]) != 0)
Break = true;

F = Field[1];
if (F[CarPosition] != 0) Break = true;

F = Field[0];
if ((F[CarPosition - 1] | F[CarPosition] | F[CarPosition + 1]) != 0)
Break = true;

if (Break)
{
Timer.Enabled = false;
MessageBox.Show("Вы наехали на препятствие!");
}

return !Break;
}
#endregion

#region Контроллер
/// <summary>Обработчик нажатий клавиш.</summary>
void KeyPressed(Object O, KeyEventArgs KPE)
{
if (KPE.KeyCode == Keys.Space) //Пауза по пробелу
Timer.Enabled = !Timer.Enabled;
if (KPE.KeyCode == Keys.Escape)
{
ReinitGame();
Refresh();
}
if (KPE.KeyCode == Keys.Left && CarPosition > 1) //Сдвиг машинки влево
{
CarPosition--;
TestPosition();
Refresh();
}
if (KPE.KeyCode == Keys.Right && CarPosition < 13)//Сдвиг машинки вправо
{
CarPosition++;
TestPosition();
Refresh();
}
if (KPE.KeyCode == Keys.Up) //Ускорение
Timer.Interval = (int)(Timer.Interval * 0.9);
if (KPE.KeyCode == Keys.Down) //Замедление
Timer.Interval = (int)(Timer.Interval * 1.1);
}

/// <summary>Обработчик Таймера. Сдвигает поле и проверяет новую позицию.</summary>
void TimerProcessor(Object O, EventArgs A)
{
if (TestPosition())
{
Field.RemoveAt(0);
if (Field.Count < 30)
ExtendRoad();
Refresh();
}
if (!TestPosition())
Timer.Enabled = false;
}
#endregion

#region Отрисовка
/// <summary>Обработчик события отрисовки окна.</summary>
void PaintGame(Object O, PaintEventArgs e)
{
Graphics G = e.Graphics;

//Переход в координаты игрового поля
G.TranslateTransform((Width - 15 * 10) / 2, (Height - 30 * 10) / 2);
G.ScaleTransform(10, 10);
G.TranslateTransform(0, 30);
G.RotateTransform(180);
G.ScaleTransform(-1, 1);

DrawRoad(G);

DrawCar(G);
}

/// <summary>Рисует игровое поле. "Дорогу"</summary>
void DrawRoad(Graphics G)
{
Pen P = new Pen(Color.Black, float.Epsilon);
G.DrawRectangle(P, 0, 0, 15, 30);
for (int L = 0; L < 30; L++)
{
byte[] Line = Field[L];
for (int i = 0; i < 15; i++)
{
GraphicsState St = G.Save();
G.TranslateTransform(i, L);
DrawBlock(Line[i], G);
G.Restore(St);
}
}
}

/// <summary>Рисует квадратик в зависимости от типа.</summary>
private void DrawBlock(byte Type, Graphics G)
{
if (Type == 1)
G.FillRectangle(Brushes.Black, 0, 0, 1, 1);
}

/// <summary>Рисует машинку</summary>
void DrawCar(Graphics G)
{
G.FillRectangle(Brushes.Blue, CarPosition, 0, 1, 4);
G.FillRectangle(Brushes.Blue, CarPosition - 1, 2, 3, 1);
G.FillRectangle(Brushes.Blue, CarPosition - 1, 0, 3, 1);
}
#endregion
}
}
Форма ответа