Código fuente del juego "Greedsnake" implementado en c
// greedsnake.cpp
#include bios.hgt
#include lt;conio.hgt;
#include lt;dos.hgt;
#include lt;graphics.hgt;
#include lt ;stdlib .hgt;
#include lt;time.hgt;
#include "conf.h"
nodo de estructura typedef
{
int x, y;
estructura nodo *next;
}Nodo;
estructura typedef
{
Nodo *cabeza, *cola;
int longitud;
}Serpiente;
estructura typedef
{
int izquierda, arriba, derecha, abajo
}Marco;
typedef enum //Cuatro direcciones
{
arriba, abajo, izquierda, derecha
}Dirección;
typedef enum
{
falso, verdadero
}bool; //*/
void InitGraphMode(); //Inicializa el controlador de gráficos
void CloseGraphMode();
void Foot(int, int);
void Head(int, int);
void CreateFrame() //Completa el dibujo de todo el marco del juego
void CreateSnake(); //Crea una serpiente con dos nodos, cada nodo de la serpiente es un nodo en la cola
bool PlayGame(); //La función principal del juego,
p>int Hit(int, int); // Determina si cruza el límite o se golpea a sí mismo. Los dos parámetros son las coordenadas xey del nuevo contacto principal
bool. GameOver(); //Dibuja el cuadro de diálogo que aparece cuando finaliza el juego
void Enqueue(Node); //Función de poner en cola
Node Dequeue() //Función de poner en cola
void ClearKeyBuf(); //Borrar el búfer del teclado. Esta función puede eliminar el impacto de presionar constantemente teclas no válidas
Snake Snake;
Marco de marco;
void main()
{
InitGraphMode();
hacer
{
Crear marco( )
;
}mientras(PlayGame());
CloseGraphMode();
}
void InitGraphMode()
{
int gdriver=DETECT,gmode;
initgraph(amp;gdriver,amp;gmode,"../bgi/");
cleardevice();
}
void CloseGraphMode()
{
cleardevice();
closegraph();
}
void CreateFrame()
{
setbkcolor(CYAN);
//Las siguientes cuatro líneas de código se utilizan para calcular las coordenadas de la esquina superior izquierda y la esquina inferior derecha del marco principal
frame.left=(getmaxx() 1-BlockWidth*RowOfFrame)/2 ;
frame.top=(getmaxy() 1-BlockHeight*ColumnOfFrame)/2;
frame.right=frame.left BlockWidth*RowOfFrame;
frame.bottom=frame.top BlockHeight*ColumnOfFrame;
Cabeza(frame.left 100, frame.top-20);
setfillstyle(SOLID_FILL, LIGHTGRAY);
bar(frame. left, frame.top, frame.right, frame.bottom);
setlinestyle(SOLID_LINE, 1, 1);
setcolor(DARKGRAY);
línea(marco.izquierda, marco.arriba, marco.derecha, marco.arriba);
línea(marco.izquierda, marco.arriba, marco.izquierda, marco.abajo );
setlinestyle(SOLID_LINE, 1, 1);
setcolor(BLANCO);
line(frame.left, frame.bottom, frame.right , frame.bottom);
line(frame.right, frame.top, frame.right, frame.bottom);
setlinestyle(DOTTED_LINE, 1, 1); p>
setcolor( AZUL);
for(int fila=1; rowlt; RowOfFrame; fila)
line(frame.left fila*BlockWidth, frame.top, frame.left fila*BlockWidth, frame.bottom);
for(int column=1; columnlt; ColumnOfFrame; column)
line(frame.left, frame.top column* Altura del bloque
, frame.right, frame.top column*BlockHeight);
Foot(frame.left, frame.bottom 20);
}
void CreateSnake( )
{
Nodo *nodo1=nuevo Nodo;
Nodo *nodo2=nuevo Nodo;
nodo1-gt; frame.left BlockWidth;
nodo1-gt; y=frame.top
nodo1-gt; siguiente=NULL
snake.tail=nodo1;
nodo2-gt; x=frame.left;
nodo2-gt; y=frame.top;
nodo2-gt; ;
snake.head=nodo2;
snake.length=2;
setfillstyle(SOLID_FILL, AZUL);
bar( serpiente.cabeza-gt; x 1, serpiente.cabeza-gt; y 1, serpiente.cabeza-gt; x BlockWidth-1, serpiente.cabeza-gt; serpiente.cola-gt; x 1, serpiente.cola-gt; y 1, serpiente.cola-gt; x BlockWidth-1, serpiente.cola-gt; /p>
bool PlayGame()
{
int velocidad=300, clave;
Dirección CurrentDirection=derecha;
Nodo randomNode;
Nodo newNode, outNode;
bool neednode=true;
bool superposición=false;
int randx, randy;
CrearSerpiente();
mientras(verdadero)
{
si(neednode==verdadero)
{
randomize();
hacer
{
randx=frame.left rand()RowOfFrame*BlockWidth;
randy=frame.top rand()ColumnOfFrame*BlockHeight;
for(Node *p=snake.head; p!=NULL; p=p-gt; next)/ /se golpea a sí mismo
if(randx==p-gt;xamp;amp;randy==p-gt;y)
{overlap=true;break;}
}
mientras(overlap==true);
randomNode.x=randx;
randomNode.y=randy;
randomNode.next=NULL;
setfil
lstyle(SOLID_FILL, RED);
bar(randomNode.x 1, randomNode.y 1, randomNode.x BlockWidth-1, randomNode.y BlockHeight-1);
neednode= falso;
}
if((clave=bioskey(1))!=0)
{
cambiar(clave)
{
caso ESC: devuelve falso;
caso ARRIBA:
if(CurrentDirection!=abajo)
CurrentDirection=arriba;
ClearKeyBuf();
romper;
caso ABAJO:
if(CurrentDirection!=arriba)
CurrentDirection=abajo;
ClearKeyBuf();
romper;
caso IZQUIERDO:
if( CurrentDirection!=derecha)
CurrentDirection=izquierda;
ClearKeyBuf();
romper;
caso DERECHA:
if(CurrentDirection!=izquierda)
CurrentDirection=derecha;
ClearKeyBuf();
romper;
caso PAGEUP :speed=speed-100;
if(speedlt;100)
speed=100;
ClearKeyBuf();
romper ;
caso PAGEDOWN: velocidad=velocidad 100;
if(speedgt;500)
velocidad=500;
ClearKeyBuf() ;
romper;
predeterminado: romper;
}
}
int headx=snake.tail -gt;x;
int heady=snake.tail-gt;y;
cambiar(DirecciónActual)
{
caso arriba: heady-=BlockHeight; romper;
caso abajo: embriagador =BlockHeight;
caso izquierdo: headx-=BlockWidth; derecha: headx =BlockWidth; break;
}
if(Hit(headx, heady)) //si la serpiente golpea la pared o se estrella contra sí misma
regresa GameOver();
else
{ //comer
if(headx==randomNode.xamp;amp; él
ady==randomNode.y)
{
Enqueue(randomNode);
setfillstyle(SOLID_FILL, BLUE);
bar( randomNode.x 1, randomNode.y 1, randomNode.x-1 BlockWidth, randomNode.y-1 BlockHeight);
neednode=true;
}
else //no comer
{
newNode.x=headx;
newNode.y=heady;
newNode.next =NULL;
Encolar(newNode);
outNode=Dequeue();
setfillstyle(SOLID_FILL, LIGHTGRAY);
barra (outNode.x 1, outNode.y 1, outNode.x BlockWidth-1, outNode.y BlockHeight-1
setfillstyle(SOLID_FILL,
bar(newNode); .x 1, newNode.y 1, newNode.x-1 BlockWidth, newNode.y-1 BlockHeight);
}
}
retraso(velocidad );
}
}
void ClearKeyBuf()
{
hacer
bioskey(0);
mientras(bioskey(1));
}
pie vacío(int x, int y)
{
setcolor(AZUL);
outtextxy(x, y, "escritor: [T]RealXL CORREO ELECTRÓNICO: realgeneral@hotmail.com"); p> p>
}
Cabeza vacía(int x, int y)
{
setcolor(RED);
outtextxy (x, y, "SERPIENTE CODICIOSA");
}
void Enqueue(Nodo enNodo)
{
Nodo *p =nuevo Nodo;
p-gt;x=inNode.x;
p-gt;y=inNode.y;
p-gt ;siguiente =enNodo.siguiente;
snake.tail-gt;siguiente=p;
snake.tail=p;
snake.length; p>
}
Nodo Dequeue()
{
Nodo *p=snake.head;
Nodo outNode= *p ;
snake.head=p-gt;siguiente;
snake.length--;
eliminar p;
devolver nodosalida ;
}
int
Hit(int x, int y)
{
if(xlt;frame.left||xgt;=frame.right||ylt;frame.top||ygt;= frame.bottom)//golpea la pared
return 1;
Nodo *p=snake.head-gt;
for(int i= serpiente.length-1;igt;3;i--,p=p-gt;next)//se golpea a sí mismo
if(x==p-gt;xamp;amp;y==p -gt;y)
devuelve 1;
devuelve 0;
}
bool GameOver()
{
int x=getmaxx()/2-50;
int y=getmaxy()/2-20;
setfillstyle(SOLID_FILL,DARKGRAY
bar(x 3, y 3, x 103, y 43
setfillstyle(SOLID_FILL,
barra(x, y); , x 100, y 40);
setlinestyle(0, 3, 1
setcolor(RED);
rectangle(x, y, x); 100, y 40);
outtextxy(x 20, y 10, "GAGE OVER!");
char c; /Presiona q o Q para salir del programa, presiona r o R para reiniciar el juego
{
c=getch();
if(c= = 'q'||c=='Q')
devuelve falso;
si no(c=='r'||c=='R') p >
devuelve verdadero;
}
}
Programa fuente de backgammon C:
#include
#include
#include
#definir color de fondo CYAN
#definir color predeterminado NEGRO
#definir color de línea MAGENTA
#define player1_color ROJO
#define player2_color BLANCO
#define error_color ROJO
#define ganador_color ROJO
const int izquierda = 40;
const int top=390;
const int d=30
const int line_num=9; int turno=0;
const int r=d/3;
const int j=10;
int x, y, k=1, paso = (núm_línea 1)*(núm_línea 1);
unión REGS regs1, regs2;
c
muchacha jugador1;
clase jugador2;
clase qipan{
público:
qipan();
~qipan(){};
void init_qipan();
amigo void fall(jugador1 y num1, jugador2 y num2, qipan y num
);entrada nula de amigo(jugador1 amp; num1, jugador2 amp; num2, qipan amp; num);
privado:
int point[line_num 1][line_num 1];
};
clase jugador1{
público:
jugador1();
~jugador1() {};
caída del vacío del amigo(jugador1 y num1, jugador2 y num2, qipan y; num)
entrada del vacío del amigo(jugador1 y num1, jugador2 y num2);
amigo int juez_winner(jugador1 y num1, jugador2 y num2);
privado:
int punto1[line_num 1][line_num 1] ;
};
clase jugador2{
público:
jugador2();
~jugador2( ){};
caída del vacío del amigo(jugador1 y num1, jugador2 y num2, qipan y; num);
entrada del vacío del amigo(jugador1 y; num1, jugador2 y num2, qipan & num);
amigo int juez_winner(jugador1 & num1, jugador2 & num2);
privado:
int punto2[line_num 1][ line_num 1];
};
void input(jugador1 y num1, jugador2 y num2);
void fall(jugador1 y num1, jugador2); amp; num2, qipan amp; num);
int juez_winner(qipan amp; num, jugador1 amp; num1, jugador2 amp; num2
void inputerror(); p>
void display_winner(int);
void main()
{
int driver=DETECT, modo;
initgraph(amp;controlador,amp;modo,"e:\tc30\bgi");
qipan num;<
/p>
jugador1 num1;
jugador2 num2;
mientras(paso--)
{
entrada(num1 , num2, num);
fall(num1, num2, num);
if(judge_winner(num1, num2))
{
display_winner(k);
}
}
// getchar();
}
qipan::qipan(void)
{ int j, i;
char ch[2]="0"
setbkcolor(color de fondo) ;
setcolor(color de línea);
for(i=0;ilt;=line_num;i)
{
línea( izquierda, top-i*d, left line_num*d, top-i*d);
}
for(i=0; ilt; = line_num; i) p>
{
línea(left i*d, top, left i*d, top-line_num*d);
}
para (i=0; ilt; = line_num; i )
{ if(*ch=='9' 1) *ch='a';
settextstyle(DEFAULT_FONT, HORIZ_DIR , 1);
outtextxy(left i*d-2, top r 3, ch);
(*ch)=(*ch) 1;
}
*ch='0';
for(i=0;ilt;=line_num;i)
{if(*ch= ='9' 1) *ch='a';
settextstyle(DEFAULT_FONT, HORIZ_DIR, 1);
outtextxy(left-r-10, top-d*i- 3, canal);
(*ch)=(*ch) 1;
}
setcolor(color predeterminado);
for(i=0;ilt;=line_num;i)
{
for(j=0;jlt;=line_num;j)
punto[ i][j]=0;
}
}
caída del vacío(jugador1 y num1, jugador2 y num2, qipan y num)
{
int bandera=k2;
if(bandera)
{ setcolor(player2_color);
num2.point2[x][y]=1;
num.point[x][y]=2;
círculo(izquierda d*x, top-d*y , r);
setfillstyle(1, player2_color);
floodfill(left d*x, top-d*y, player2_color);
}
otro
p>
{ num1.point1[x][y]=1;
num.point[x][y]=1
setcolor(player1_color);
circle(left d*x, top-d*y, r);
setfillstyle(1, player1_color);
floodfill(left d*x, top-d*y, player1_color);
}
setcolor(defaultcolor);
}
void input(player1 amp; num1, jugador2 amp; num2, qipan amp; p>{
regs1.h.ah=0;
xx=int86(22,?s1,?s1)-'0';
si (xx==('q'-'0')||xx==('Q'-'0'))
{ paso=0;
regresar;
}
regs1.h.ah=0;
yy=int86(22,?s1,?s1)-'0';
if(yy==('q'-'0')||yy==('Q'-'0'))
{
paso=0 ;
return ;
}
if(xxlt;0||xxgt;line_num)
{ inputerror(); p> p>
continuar;
}
if(yylt;0||yygt;line_num)
{inputerror();
continuar;
}
if(num.punto[xx][yy]==0)
{
romper ;
}
else
{
inputerror();
continuar;
}
}
x=(int)xx;
y=(int)yy
setcolor( backcolor) ;
settextstyle(DEFAULT_FONT, HORIZ_DIR, 1);
outtextxy(left d*line_num/3, top d*2, "Error de entrada"
);setcolor(color predeterminado);
}
jugador1::jugador1()
{
int i, j;
for(i=0;ilt;=line_num;i)
{
for(j=0;jlt;=line_num;j)
punto1[i][j]=0;
}
}
jugador2::jugador2()
{ int i,j;
for(i=0;ilt;=line_num;i)
{
for(j=0;jlt;= núm_línea; j )<
/p>
punto2[i][j]=0;
}
}
error de entrada nulo(nulo)
{ setcolor(error_color);
settextstyle(DEFAULT_FONT, HORIZ_DIR, 1);
outtextxy(left d*line_num/3, top d*2, "Error de entrada");
setcolor(color predeterminado);
}
int juez_winner(jugador1 y num1, jugador2 y num2)
{ p>
int recuento=0, m=0, n=0, a=0, b=0, xx0, yy0
int bandera=k2
xx0; =x; yy0=y;
if(!flag)
{ //izquierda lt;-------gt derecha
mientras; (xx0gt;=1amp;amp;mlt;4) {xx0--;m;}
mientras(nlt;9amp;amp;xx0lt;=line_num)
{ p>
p>
if(num1.point1[xx0][y]==1)
{
cuenta;
si (count==5 ) devuelve 1;
}
else
{
count=0;
}
n;
xx0;
}
//arriba lt;------gt; /p>
count=0; xx0=x; m=0; n=0;
mientras(yy0gt;=1amp;amp;mlt;4){yy0--;m;}
mientras(nlt;9amp;amp;yy0lt;=line_num)
{
if(num1.point1[x][yy0]==1)
{
cuenta;
si(cuenta==5)
devuelve 1;
}
else
{
count=0;
}
n;
yy0;
}
//izquierda arriba ----- derecha abajo
xx0=x;
yy0=y;
m=0;
n=0;
count=0
mientras(xx0gt;=1amp;amp;mlt; ;4){ xx0 --; a; m;} m=0;
mientras(yy0lt;=line_numamp;amp;mlt;4){ yy0; p>if(alt ;=b)
{
xx0=x-a; yy0=y a;
}
else p>
{
xx0=x-b; yy0=y b;
}
mientras(xx0lt;=line_numamp;amp;yy0gt;=
0amp;amp;nlt;9)
{
if(num1.point1[xx0][yy0]==1)
{
cuenta;
si(cuenta==5)
devuelve 1;
}
else
{
cuenta=0;
}
xx0;
yy0--; ;
}
//derecha arriba lt;-----gt; izquierda abajo
count=0;
a =0;
b=0;
n=0;
m=0;
xx0=x;
yy0=y;
mientras(xx0mientras(yy0if(alt;=b)
{
xx0=xa;
yy0=y a;
}
else
{
xx0=x b;
yy0= y b;
}
mientras(xx0gt;=0amp;amp;yy0gt;=0amp;amp;nlt;9)
{
if(num1.point1[xx0][yy0]==1)
{
cuenta;
if(cuenta==5) p>
devuelve 1;
}
else
count=0;
xx0--;
yy0--;
n;
}
//sin vino
devuelve 0;
}
else
{
//izquierda lt; -------gt; derecha
mientras( xx0gt;=1amp;amp;mlt;4) {xx0--;m;}
mientras(nlt;9amp;amp;xx0lt;=line_num)
{
if(num1.punto1[xx0][y]==1)
{
cuenta;
if(cuenta==5) devolver 1;
}
else
{
count=0;
}
n;
xx0;
}
//arriba lt;------gt; cuenta=0; xx0=x; m=0; n=0;
mientras(yy0gt;=1amp;amp;mlt;4){yy0--;m;}
mientras(nlt;9amp;amp;yy0lt;=line_num)
{
if(num2.point2[x][yy0]==1)
{
cuenta;
si(cuenta==5)
devuelve 1;
}
más
{
count=0;
}
n;
yy0;
}
//izquierda arriba ----- derecha abajo
xx0=x;
yy0=y;
m=0;
n=0;
count=0;
mientras(xx0gt;=1amp;amp;mlt;4){xx0--; a;
mientras(yy0lt;=line_numamp;amp;mlt;4){ yy0; b; m;}
if(alt;=b)
{
xx0=x-a; yy0=y a;
}
else
{
xx0=x-b; yy0=y b;
}
mientras(xx0lt;=line_numamp;amp;yy0gt;=0amp;amp;nlt;9)
{
if(num2.point2[xx0][yy0]==1)
{
cuenta;
if(cuenta==5)
devuelve 1;
}
else
{
count=0;
}
xx0;
yy0--;
n;
}
//derecha arriba lt;-----gt; izquierda abajo
count=0;
a=0; p>n=0;
m=0;
xx0=x;
yy0=y
mientras(xx0mientras( yy0if(alt;=b)
{
xx0=x a;
yy0=y a;
}
else
{
xx0=x b;
yy0=y b;
}
mientras( xx0gt;=0amp;amp;yy0gt;=0amp;amp;nlt;9)
{
if(num2.point2[xx0][yy0]==1) p> p>
{
cuenta;
si(cuenta==5)
devuelve 1;
}
else
count=0;
xx0--;
yy0--;
n;
}
//sin vino
return 0;
}
}
void display_winner(int k)
{
int flag=k2;
if(!flag)
{ setcolor(winner_color
settextstyle(DEFAULT_FONT, HORIZ_DIR, 2);
outtextxy(left d*2, top 40, "El rojo es el ganador"); (color predeterminado);
paso=0
getchar();
}
else
>
{ setcolor(winner_color);
settextstyle(DEFAULT_FONT, HORIZ_DIR, 2);
outtextxy(left 2*d, top 40, "El blanco es el ganador");
setcolor(color predeterminado);
paso=0;
}
}