Måske ikke den flotteste kode men du må da godt få den, jeg kigger lige på linksne lidt senere.
Map delen, er "stjålet" fra Midgårds da jeg syntes det var så genialt! :)
#include <iostream>
#include <windows.h>
#include <string>
#include <stdlib.h>
#include <conio.h>
#define x_str 40
#define y_str 24
#define debug 0
using namespace std;
char retning, sidste, res[200], thePos[100];
int hovedX, hovedY, haleX, haleY, laengde, tast, normal, hastighed, madx, mady, madder;
unsigned char Map[y_str][x_str] =
{
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
};
void WriteC(string Tekst, int X, int Y, WORD farve)
{
HANDLE UdHandle;
COORD position = {X, Y};
UdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(UdHandle, farve);
SetConsoleCursorPosition(UdHandle, position);
cout << Tekst;
}
void showPos() {
if (debug == 1) {
sprintf(thePos, "Hoved: X: %i Y: %i - Hale: X: %i Y: %i", hovedX, hovedY, haleX, haleY);
WriteC(thePos, 0, 24, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
} else {
sprintf(thePos, "Madder: %i", madder);
WriteC(thePos, 0, 24, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
}
}
int Random(int Range)
{
return (rand() >> 3)%Range;
}
void lavMad() {
start:
madx = Random(x_str);
mady = Random(y_str);
if (Map[mady][madx] == 1) {
goto start;
} else {
WriteC(" ", madx, mady, FOREGROUND_GREEN | BACKGROUND_GREEN | FOREGROUND_INTENSITY);
}
}
int main() {
WriteC("Slangen er sulten!", 0, 0, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
WriteC("Soerg for den for nogle madder!", 0, 1, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
WriteC("Brug piletasterne for at styre slangen,", 0, 2, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
WriteC("og 'p' for pause.", 0, 3, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
WriteC("Tryk enter for at starte!", 0, 4, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
WriteC("
www.matisen.dk", 0, 9, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
startspil:
int ta = getch();
if (ta != 13) goto startspil;
start:
madder = 0;
madx = 0;
mady = 0;
if (debug == 1) {
hastighed = 800;
} else {
hastighed = 100;
}
int y, x, i;
for (y = 0; y < y_str; y++)
{
for (x = 0; x < x_str; x++)
{
if(Map[y][x] == 1)
WriteC(" ", x, y, FOREGROUND_RED | BACKGROUND_RED | FOREGROUND_INTENSITY);
else
WriteC(" ", x, y, FOREGROUND_RED | FOREGROUND_INTENSITY);
}
}
// Start kordinater
laengde = 2; // Længde
hovedX = 1; // Hoved vandret
haleX = 1; // Hale vandret
hovedY = 1; // Hoved lodret
haleY = 1; // Hale lodret
retning = 'h'; // Retning o = op, h = højre, n = ned, v = venstre
sidste = 'o';
for (i = 0; i < laengde; i++) {
hovedX += 1;
WriteC(" ", hovedX, hovedY, FOREGROUND_BLUE | BACKGROUND_BLUE | FOREGROUND_INTENSITY);
Sleep(hastighed);
}
main:
if (madx == 0 && mady == 0) lavMad();
WriteC(" ", madx, mady, FOREGROUND_GREEN | BACKGROUND_GREEN | FOREGROUND_INTENSITY);
switch (retning) {
case 'v':
{
showPos();
hovedX -= 1;
WriteC(" ", haleX, haleY, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
WriteC(" ", hovedX, hovedY, FOREGROUND_BLUE | BACKGROUND_BLUE | FOREGROUND_INTENSITY);
if (haleY != hovedY) {
normal = 0;
if (sidste == 'n') {
haleY += 1;
} else {
haleY -= 1;
}
} else {
normal = 1;
haleX -= 1;
}
// Rammer slangen en mur?
if (Map[hovedY][hovedX] == 1) {
goto gameover;
}
// Rammer slangen en mad?
if (hovedX == madx && hovedY == mady) {
WriteC(" ", madx, mady, FOREGROUND_RED | FOREGROUND_INTENSITY);
WriteC(" ", hovedX, hovedY, FOREGROUND_BLUE | BACKGROUND_BLUE | FOREGROUND_INTENSITY);
hovedX -= 1;
madx = 0;
mady = 0;
madder += 1;
hastighed -= 20;
}
Sleep(hastighed);
break;
}
case 'h':
{
showPos();
hovedX += 1;
WriteC(" ", haleX, haleY, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
WriteC(" ", hovedX, hovedY, FOREGROUND_BLUE | BACKGROUND_BLUE | FOREGROUND_INTENSITY);
if (haleY != hovedY) {
normal = 0;
if (sidste == 'n') {
haleY += 1;
} else {
haleY -= 1;
}
} else {
normal = 1;
haleX += 1;
}
// Rammer slangen en mur?
if (Map[hovedY][hovedX] == 1) {
goto gameover;
}
// Rammer slangen en mad?
if (hovedX == madx && hovedY == mady) {
WriteC(" ", madx, mady, FOREGROUND_RED | FOREGROUND_INTENSITY);
WriteC(" ", hovedX, hovedY, FOREGROUND_BLUE | BACKGROUND_BLUE | FOREGROUND_INTENSITY);
hovedX += 1;
madx = 0;
mady = 0;
madder += 1;
hastighed -= 20;
}
Sleep(hastighed);
break;
}
case 'n':
{
showPos();
hovedY += 1;
WriteC(" ", haleX, haleY, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
WriteC(" ", hovedX, hovedY, FOREGROUND_BLUE | BACKGROUND_BLUE | FOREGROUND_INTENSITY);
if (haleX != hovedX) {
normal = 0;
if (sidste == 'h') {
haleX += 1;
} else {
haleX -= 1;
}
} else {
normal = 1;
haleY += 1;
}
// Rammer slangen en mur?
if (Map[hovedY][hovedX] == 1) {
goto gameover;
}
// Rammer slangen en mad?
if (hovedX == madx && hovedY == mady) {
WriteC(" ", madx, mady, FOREGROUND_RED | FOREGROUND_INTENSITY);
WriteC(" ", hovedX, hovedY, FOREGROUND_BLUE | BACKGROUND_BLUE | FOREGROUND_INTENSITY);
hovedY += 1;
madx = 0;
mady = 0;
madder += 1;
hastighed -= 20;
}
Sleep(hastighed);
break;
}
case 'o':
{
showPos();
hovedY -= 1;
WriteC(" ", haleX, haleY, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
WriteC(" ", hovedX, hovedY, FOREGROUND_BLUE | BACKGROUND_BLUE | FOREGROUND_INTENSITY);
if (haleX != hovedX) {
normal = 1;
if (sidste == 'h') {
haleX += 1;
} else {
haleX -= 1;
}
} else {
normal = 1;
haleY -= 1;
}
// Rammer slangen en mur?
if (Map[hovedY][hovedX] == 1) {
goto gameover;
}
// Rammer slangen en mad?
if (hovedX == madx && hovedY == mady) {
WriteC(" ", madx, mady, FOREGROUND_RED | FOREGROUND_INTENSITY);
WriteC(" ", hovedX, hovedY, FOREGROUND_BLUE | BACKGROUND_BLUE | FOREGROUND_INTENSITY);
hovedY -= 1;
madx = 0;
mady = 0;
madder += 1;
hastighed -= 20;
}
Sleep(hastighed);
break;
}
}
if (kbhit() && normal == 1) {
tast = getch();
switch (tast)
{
case 72: {
if (retning != 'n') {
sidste = retning;
retning = 'o';
} // Op
break;
}
case 80: {
if (retning != 'o') {
sidste = retning;
retning = 'n';
} // Ned
break;
}
case 75: {
if (retning != 'h') {
sidste = retning;
retning = 'v';
} // Venstre
break;
}
case 77: {
if (retning != 'v') {
sidste = retning;
retning = 'h';
} // Højre
break;
}
case 'p': {
// Pause
if (retning != 'p') {
sidste = retning;
retning = 'p';
} else {
retning = sidste;
}
break;
}
default: break;
}
}
goto main;
gameover:
sprintf(res, "Du naaede at faa %i madder.", madder);
WriteC("Game Over!", 15, 13, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
WriteC(res, 9, 14, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
WriteC("Tryk enter for at prove igen.", 8, 15, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
luk:
int t = getch();
if (t != 13) goto luk;
goto start;
return 0;
}
Med venlig hilsen
Mathias Hansen