I'm doing the snake game in c #, and the collisions with the walls and with the snake itself are giving me problems, this is the whole code that I've been up to now:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Cuc
{
class Program
{
public struct Coords
{
public int cXanelles;
}
public struct CoordsCuc
{
public int cX, cY;
public char direcció;
public int llargada;
}
public struct fruita
{
public int x, y, durada, augment, valorNutritiu;
}
static void Main(string[] args)
{
bool colisio = false;
bool final = false;
int Augment = 0;
int duradafalsa = 0;
int[] cucx = new int[1800];
int[] cucy = new int[1800];
CoordsCuc cuc = new CoordsCuc();
cuc.cX = 37;
cuc.cY = 12;
cuc.llargada = 4;
Coords body = new Coords();
body.cXanelles = 37;
CoordsCuc Direccions;
Direccions.direcció = 'W';
ConsoleKeyInfo cki;
fruita Fruita = new fruita();
Fruita.durada = 0;
Fruita.valorNutritiu = 9;
Fruita.x = 0;
Fruita.y = 0;
pintaMarc();
PintarCuc1rPosicio(ref body.cXanelles, ref cucx, ref cucy, ref cuc);
while (!final)
{
if (Console.KeyAvailable)
{
cki = Console.ReadKey();
if (cki.Key == ConsoleKey.LeftArrow)
{
Direccions.direcció = 'W';
}
if (cki.Key == ConsoleKey.RightArrow)
{
Direccions.direcció = 'E';
}
if (cki.Key == ConsoleKey.UpArrow)
{
Direccions.direcció = 'N';
}
if (cki.Key == ConsoleKey.DownArrow)
{
Direccions.direcció = 'S';
}
if (cki.Key == ConsoleKey.Escape)
{
final = true;
}
}
while (Fruita.durada == 0)
{
PosarFruita(ref Fruita, ref cuc, ref duradafalsa, ref cucx, ref cucy);
}
PodrirFruita(ref Augment, ref Fruita, ref cuc, ref duradafalsa, ref cucx, ref cucy);
MovimentCUC(ref Augment, ref cucx, ref cucy, ref cuc, ref Direccions.direcció);
colisio = Colisions(ref cuc, ref cucx, ref cucy);
if (!colisio)
{
final = true;
}
System.Threading.Thread.Sleep(150);
}
}
public static void pintaMarc()
{
Console.SetCursorPosition(1, 2);
Console.WriteLine("╔");
Console.SetCursorPosition(75, 2);
Console.WriteLine("╗");
Console.SetCursorPosition(75, 25);
Console.WriteLine("╝");
Console.SetCursorPosition(1, 25);
Console.WriteLine("╚");
for (int x = 2; x < 75; x++)
{
Console.SetCursorPosition(x, 2);
Console.WriteLine("═");
}
for (int x = 2; x < 75; x++)
{
Console.SetCursorPosition(x, 25);
Console.WriteLine("═");
}
for (int y = 3; y < 25; y++)
{
Console.SetCursorPosition(1, y);
Console.WriteLine("║");
Console.SetCursorPosition(75, y);
Console.WriteLine("║");
}
}
public static void PintarCuc1rPosicio(ref int cXanelles, ref int[] cucx, ref int[] cucy, ref CoordsCuc cuc)
{
Console.SetCursorPosition(cuc.cX, cuc.cY);
Console.WriteLine("☻");
for (int x = 0; x < cuc.llargada; x++)
{
cXanelles = cXanelles + 1;
Console.SetCursorPosition(cXanelles, cuc.cY);
Console.WriteLine("█");
cucx[x] = cXanelles;
cucy[x] = cuc.cY;
}
}
public static void MovimentCUC(ref int Augment, ref int[] cucx, ref int[] cucy, ref CoordsCuc cuc, ref char direcció)
{
if (Augment != 0)
{
cuc.llargada++;
Augment--;
}
for (int x = cuc.llargada; x > 0; x--)
{
cucx[x] = cucx[x - 1];
cucy[x] = cucy[x - 1];
}
cucx[0] = cuc.cX;
cucy[0] = cuc.cY;
if (direcció == 'W')
{
Console.SetCursorPosition(cuc.cX, cuc.cY);
Console.WriteLine("█");
cuc.cX--;
Console.SetCursorPosition(cuc.cX, cuc.cY);
Console.WriteLine("☻");
}
if (direcció == 'E')
{
Console.SetCursorPosition(cuc.cX, cuc.cY);
Console.WriteLine("█");
cuc.cX++;
Console.SetCursorPosition(cuc.cX, cuc.cY);
Console.WriteLine("☻");
}
if (direcció == 'N')
{
Console.SetCursorPosition(cuc.cX, cuc.cY);
Console.WriteLine("█");
cuc.cY--;
Console.SetCursorPosition(cuc.cX, cuc.cY);
Console.WriteLine("☻");
}
if (direcció == 'S')
{
Console.SetCursorPosition(cuc.cX, cuc.cY);
Console.WriteLine("█");
cuc.cY++;
Console.SetCursorPosition(cuc.cX, cuc.cY);
Console.WriteLine("☻");
}
Console.SetCursorPosition(cucx[cuc.llargada], cucy[cuc.llargada]);
Console.WriteLine(" ");
for (int x = 0; x < cuc.llargada; x++)
{
Console.SetCursorPosition(cucx[x], cucy[x]);
Console.WriteLine("█");
}
}
public static bool Colisionsf(ref CoordsCuc cuc, ref fruita fruita, ref int[] cucx, ref int[] cucy)
{
bool minitruex = false;
bool minitruey = false;
//Fruita
if (fruita.x == cuc.cX & fruita.y == cuc.cY)
{
return false;
}
for (int i = 0; i < cuc.llargada; i++)
{
if (fruita.x == cucx[i])
{
minitruex = true;
}
if (fruita.y == cucy[i])
{
minitruey = true;
}
if (minitruex == minitruey & minitruex)
{
return false;
}
}
return true;
}
public static bool Colisions(ref CoordsCuc cuc, ref int[] cucx, ref int[] cucy)
{
bool colisio = false;
//Colisio Parets
if (74 == cuc.cX || 25 == cuc.cY || 2 == cuc.cX || 2 == cuc.cY)
{
return false;
}
//Colisio Cos
for (int i = 0; i < cuc.llargada; i++)
{
if (cuc.cX == cucx[i])
{
colisio = true;
break;
}
if (cuc.cY == cucy[i])
{
colisio = true;
break;
}
else
{
return false;
}
}
return colisio;
}
public static void PosarFruita(ref fruita fruita, ref CoordsCuc cuc, ref int duradafruita, ref int[] cucx, ref int[] cucy)
{
bool Comprovaciocolisio = false;
Random rnd = new Random();
while (!Comprovaciocolisio)
{
fruita.x = rnd.Next(2, 75);
fruita.y = rnd.Next(3, 25);
Comprovaciocolisio = Colisionsf(ref cuc, ref fruita, ref cucx, ref cucy);
}
fruita.valorNutritiu = 9;
fruita.durada = 60;
duradafruita = fruita.durada;
//return;
}
public static void PodrirFruita(ref int Augment, ref fruita fruita, ref CoordsCuc cuc, ref int duradafruita, ref int[] cucx, ref int[] cucy)
{
if ((cuc.cX == fruita.x) & (cuc.cY == fruita.y))
{
Augment = Augment + fruita.valorNutritiu;
PosarFruita(ref fruita, ref cuc, ref duradafruita, ref cucx, ref cucy);
}
else
{
Console.SetCursorPosition(fruita.x, fruita.y);
Console.WriteLine(fruita.valorNutritiu);
duradafruita--;
if (duradafruita == (fruita.durada - 6))
{
fruita.durada = fruita.durada - 6;
fruita.valorNutritiu--;
if (duradafruita == 0)
{
Console.SetCursorPosition(fruita.x, fruita.y);
Console.WriteLine(" ");
}
}
}
//return;
}
}
}
Ok, I think the main problem I have here:
public static bool Colisions(ref CoordsCuc cuc, ref int[] cucx, ref int[] cucy)
{
bool colisio = false;
//Colisio Parets
if (74 == cuc.cX || 25 == cuc.cY || 2 == cuc.cX || 2 == cuc.cY)
{
return false;
}
//Colisio Cos
for (int i = 0; i < cuc.llargada; i++)
{
if (cuc.cX == cucx[i])
{
colisio = true;
break;
}
if (cuc.cY == cucy[i])
{
colisio = true;
break;
}
else
{
return false;
}
}
return colisio;
}
Here I have mainly two problems, when pulling to the left and hitting the wall, it makes a block earlier than it should, not like in the other walls that seems to get to eat a block. And the last problem, is that the snake does not collide with itself and that is because I think it does not properly enter the if of the last function cited. Let's see if anyone can help me, thank you very much.
By the way, I think I fail a bit to have two arrays declared in main ... If someone sees some way to improve the code that leaves it out there too, again thanks and best regards!