Anasayfa > Yazılımlar > Yılan Oyunu LPC1768+GLCD

Yılan Oyunu LPC1768+GLCD

27 Ağustos 2012 Yorum Ekle Yorumlara git

Tekrar Merhaba yılan oyununu bilmeyen yoktur. Yılan yürür, yemi yer boyu uzar. Duvarlara, engellere yada kuyruğunuza çarpmamanız gerekir.

Düşündümde bu oyunun algoritmasını çıkartmak çok zor değil deyip sıvadım kolları ilk oyunumu yazdım. Eylenceli bir iş çıktı ortaya.

 

Oyunu 3 seviyeli tasarladım. Resimlerdede görüldüğü gibi ayrıca Skor Board ekledim multiplayer oynamak isteyenleri de düşünerek 🙂

1. Seviye duvarlardan geçemezsiniz kuyruğa ve duvarlara çarpınca oyun biter.

2. Seviye duvarlardan geçebilirsiniz. Sadece kuyuğa çarpınca oyun biter.

3. Seviye duvarlardan geçersiniz ancak engellere ve kuyruğa çarpınca oyun biter.

Keil Vusion-4 ortamında derlenmiş proje dosyasını indirmek için tıklayınız.

main.c

/*
Coşkun ERGAN
Yılan Oyunu
*/

#include <LPC17xx.h>
#include <stdio.h>
#include "delay.h"
#include "ks0108.h"

/******************************************************************************/

#define Esc	 (!((LPC_GPIO1 -> FIOPIN>>10)&1))
#define Ent	 (!((LPC_GPIO1 -> FIOPIN>>9)&1))
#define Yuk	 (!((LPC_GPIO1 -> FIOPIN>>0)&1))
#define Asa	 (!((LPC_GPIO1 -> FIOPIN>>8)&1))
#define Sag	 (!((LPC_GPIO1 -> FIOPIN>>4)&1))
#define Sol	 (!((LPC_GPIO1 -> FIOPIN>>1)&1))

#define sag  1
#define sol  2
#define asa  3
#define yuk  4
#define ent  5

unsigned char yilan_harita[251];
unsigned char duvar[33]={80,55,56,57,58,155,180,181,182,183,71,70,69,68,96,171,196,195,194,193};
unsigned char ekran_p[16];
unsigned char ekran_s[16];
unsigned char kordinat,yon,yon_h,pause=0;
unsigned char random=10,boy=3;
unsigned char x,y,t,i,i_h,yem;
unsigned int puan=0,kont,kont2,seviye=1;
unsigned int puan_A=0,puan_B=0,puan_C=0,puan_D=0;
unsigned char sev_A=0,sev_B=0,sev_C=0,sev_D=0;

void Hakkinda(void);
void Skor_Board(void);
void Seviye(void);
void Oyun(void);
void Giris_Sayfasi(void);
void noktala(unsigned char kordinat,unsigned char dolu);
char Yilan_Sur(void);
void Yem_Ekle(unsigned char random);

/*******************************************************************************/
/*******************************************************************************/
/*******************************************************************************/
int main(void)
{

    SystemInit ();
	SysTick_Config(12000000/1000);
    ks0108_init();
	LPC_GPIO0->FIODIR = 0xFFFFFFFF;
	LPC_GPIO1->FIODIR = 0xFFFF0000;
	LPC_GPIO2->FIODIR = 0xFFFFFFFF;
	LPC_GPIO3->FIODIR = 0xFFFFFFFF;

while (1)  // main dongusu
 	{
	  	ks0108_fill(0);
		ks0108_text(33,2,"YIlan Oyunu",1,1);
	    ks0108_line(0,10,127,10,1);
	    ks0108_line(0,60,127,60,1);
		ks0108_text(37,15,"Yeni Oyun",1,1);
		ks0108_text(45,26,"Seviye",1,1);
		ks0108_text(35,37,"Skor Board",1,1);
		ks0108_text(40,48,"HakkInda",1,1);
		i=0;i_h=4;

 while(1){

	Giris_Sayfasi();

	if(Ent){

	 if(i==0){Oyun();break;}
	 if(i==1){Seviye();break;}
	 if(i==2){Skor_Board();break;}
	 if(i==3){Hakkinda();break;}

		 }
	  }
   }
}
/*******************************************************************************/
/*******************************************************************************/
/*******************************************************************************/
void Hakkinda(void)
{
	  	ks0108_fill(0);
		ks0108_text(33,2,"YIlan Oyunu",1,1);
	    ks0108_line(0,10,127,10,1);
	    ks0108_line(0,60,127,60,1);
		ks0108_text(5,15,"ExpKits EX33DS Board",1,1);
		ks0108_text(35,26,"LPC176x MCU",1,1);
		ks0108_text(53,37,"X-Fi",1,1);
		ks0108_text(30,48,"Versiyon:1.2",1,1);
		while(!Esc);
}
/*******************************************************************************/
void Skor_Board(void)
{
	  	ks0108_fill(0);
		ks0108_text(33,2,"Skor Board",1,1);
	    ks0108_line(0,10,127,10,1);
	    ks0108_line(0,60,127,60,1);
		if(!sev_A)sprintf(ekran_p,"1. --   -----",puan_A,sev_A);
		else sprintf(ekran_p,"1. %2d   Sev-%1d",puan_A,sev_A);
		ks0108_text(20,15,ekran_p,1,1);

		if(!sev_B)sprintf(ekran_p,"2. --   -----",puan_B,sev_B);
		else sprintf(ekran_p,"2. %2d   Sev-%1d",puan_B,sev_B);
		ks0108_text(20,26,ekran_p,1,1);

		if(!sev_C)sprintf(ekran_p,"3. --   -----",puan_C,sev_C);
		else sprintf(ekran_p,"3. %2d   Sev-%1d",puan_C,sev_C);
		ks0108_text(20,37,ekran_p,1,1);

		if(!sev_D)sprintf(ekran_p,"4. --   -----",puan_D,sev_D);
		else sprintf(ekran_p,"4. %2d   Sev-%1d",puan_D,sev_D);
		ks0108_text(20,48,ekran_p,1,1);

		while(!Esc);
}
/*******************************************************************************/
void Seviye(void)
{

	  	ks0108_fill(0);
		ks0108_text(30,2,"Seviye AyarI",1,1);
	    ks0108_line(0,10,127,10,1);
	    ks0108_line(0,60,127,60,1);
		ks0108_text(35,20,"1. Seviye",1,1);
		ks0108_text(35,31,"2. Seviye",1,1);
		ks0108_text(35,42,"3. Seviye",1,1);
	    i=seviye-1;i_h=4;
while(1)
{

		if(seviye==1)ks0108_circle(20,23,3,1,1);
		else {ks0108_circle(20,23,3,1,0);ks0108_circle(20,23,3,0,1);}

		if(seviye==2)ks0108_circle(20,34,3,1,1);
		else  { ks0108_circle(20,34,3,1,0);	ks0108_circle(20,34,3,0,1);}

		if(seviye==3)ks0108_circle(20,45,3,1,1);
		else  {ks0108_circle(20,45,3,1,0); ks0108_circle(20,45,3,0,1);}

if(i_h==0) {
     ks0108_rect(30,19,98,27,1,0);
     ks0108_text(35,20,"1. Seviye",1,1);
}
if(i==0){
     ks0108_rect(30,19,98,27,1,1);
	 ks0108_text(35,20,"1. Seviye",1,0);
}
if(i_h==1){
     ks0108_rect(30,30,98,38,1,0);
     ks0108_text(35,31,"2. Seviye",1,1);
 }
if(i==1){
     ks0108_rect(30,30,98,38,1,1);
      ks0108_text(35,31,"2. Seviye",1,0);
}
if(i_h==2){
     ks0108_rect(30,41,98,49,1,0);
     ks0108_text(35,42,"3. Seviye",1,1);
 }
if(i==2){
     ks0108_rect(30,41,98,49,1,1);
	 ks0108_text(35,42,"3. Seviye",1,0);
}

	while(Sag);
	while(Sol);
	while(Asa);
	while(Yuk);

   	DelayMs(10);

while(1){

	i_h=i;
	if(Sag){i++;break;}
	if(Sol){i--;break;}
	if(Asa){i++;break;}
	if(Yuk){i--;break;}
	if(Ent){seviye=i+1;break;}
	if(Esc)break;
	}

	if(Esc)break;

	if(i==3)i=0;
	if(i==255)i=2;

	}
}
/*******************************************************************************/
void Oyun(void)
{
   	ks0108_fill(0);

if(seviye==1)ks0108_rect(0,0,127,63, 0,1);
else         ks0108_rect(0,52,127,63, 0,1);
             ks0108_line(0,52,127,52,1);

if(seviye==3){

    ks0108_rect(22,12,40,15,1,1);
	ks0108_rect(22,12,25,20,1,1);

	ks0108_rect(22,37,40,40,1,1);
	ks0108_rect(22,32,25,38,1,1);

	ks0108_rect(87,37,105,40,1,1);
	ks0108_rect(102,32,105,38,1,1);

	ks0108_rect(87,12,105,15,1,1);
	ks0108_rect(102,12,105,20,1,1);
}
	puan=0;
	sprintf(ekran_p,"Puan: %2d",puan);
	ks0108_text(4,55,ekran_p,1,1);

	sprintf(ekran_s,"Seviye:%1d",seviye);
	ks0108_text(77,55,ekran_s,1,1);

	for(i=0; i<251; i++)yilan_harita[i]=0;

	yilan_harita[0]=130;
	yilan_harita[1]=131;
	yilan_harita[2]=132;
	yilan_harita[3]=133;

   	noktala(yilan_harita[0],1);
	noktala(yilan_harita[1],1);
	noktala(yilan_harita[2],1);
	noktala(yilan_harita[3],1);
	boy=3;
	kont=133;
	kont2=130;
	yon_h=yon=sag;
	Yem_Ekle(random);

 while(1){  // oyun döngüsü

  t=150;
  while(--t){

	if(Sag)yon=sag;
	else if(Sol)yon=sol;
	else if(Yuk)yon=yuk;
	else if(Asa)yon=asa;
	else if(Esc)pause=1;
	else random++;
	DelayMs(1);
}
	if(!pause){
   	if(!Yilan_Sur()){
	DelayMs(200);
	ks0108_rect(2,2,125,50, 1,1);
	ks0108_text(33,23,"Oyun Bitti",1,0);
	if(puan){
	if(puan_A<=puan){
	   	puan_A=puan;
		sev_A=seviye;
	}else{
	if(puan_B<=puan){
	    puan_B=puan;
		sev_B=seviye;
	}else{
	if(puan_C<=puan){
	   	puan_C=puan;
		sev_C=seviye;
	}else{
	if(puan_D<=puan){
	   	puan_D=puan;
		sev_D=seviye;
		  }
	    }
	  }
	}
	}

	while(!Esc);
	DelayMs(10);
	while(Esc);
	break;
	   }
	}else {

	ks0108_text(77,55,ekran_s,1,0);
	ks0108_text(4,55,ekran_p,1,0);
	sprintf(ekran_p,"        Pause");
 	ks0108_text(4,55,ekran_p,1,1);
	while(Esc);
	DelayMs(10);
	while(1){
	if(Esc){pause=0;return;}
	if(Ent)break;
	}
    ks0108_text(4,55,ekran_p,1,0);
	sprintf(ekran_p,"Puan: %2d",puan);
	ks0108_text(4,55,ekran_p,1,1);
	ks0108_text(77,55,ekran_s,1,1);
	pause=0;
	while(Esc);
	DelayMs(10);
	}
  }
}
/*******************************************************************************/
void Giris_Sayfasi(void)
{
if(i==0){
     ks0108_rect(30,14,98,22,1,1);
	 ks0108_text(37,15,"Yeni Oyun",1,0);
}
if(i_h==0) {
     ks0108_rect(30,14,98,22,1,0);
     ks0108_text(37,15,"Yeni Oyun",1,1);
}
if(i==1){
     ks0108_rect(30,25,98,33,1,1);
     ks0108_text(45,26,"Seviye",1,0);
}
if(i_h==1){
     ks0108_rect(30,25,98,33,1,0);
     ks0108_text(45,26,"Seviye",1,1);
 }
if(i==2){
     ks0108_rect(30,36,98,44,1,1);
	 ks0108_text(35,37,"Skor Board",1,0);
}
if(i_h==2){
     ks0108_rect(30,36,98,44,1,0);
     ks0108_text(35,37,"Skor Board",1,1);
 }
if(i==3){
     ks0108_rect(30,47,98,55,1,1);
	 ks0108_text(40,48,"HakkInda",1,0);
}
if(i_h==3){
     ks0108_rect(30,47,98,55,1,0);
	 ks0108_text(40,48,"HakkInda",1,1);
}

	while(Sag);
	while(Sol);
	while(Asa);
	while(Yuk);

   	DelayMs(10);

while(1){

	i_h=i;
	if(Sag){i++;break;}
	if(Sol){i--;break;}
	if(Asa){i++;break;}
	if(Yuk){i--;break;}
	if(Ent)break;
	}

	if(i==4)i=0;
	if(i==255)i=3;
}
/*******************************************************************************/
void noktala(unsigned char kordinat,unsigned char dolu)
{
	y=x=2;
	kordinat--;
	while(kordinat>=25){kordinat-=25;y+=5;}
	x+=kordinat*5;
    ks0108_rect(x,y,x+3,y+3,1,dolu);

}
/*******************************************************************************/
void Yem_Ekle(unsigned char random)
{
	unsigned char f;
	if((random>250)|(random==0))random=1;

	yem=random;

	for(i=0; i<=boy; i++){

		if((yilan_harita[i]==yem)|(kont2==yem)){

					yem++;
					if(yem>250)yem=1;
					i=0;
					}
        if(seviye==3){
				for(f=0; f<32; f++)
					if(duvar[f]==yem){i=f=0;yem++;if(yem>250)yem=1;}

					}
		     }

	noktala(yem,1);
	ks0108_pixel(x,y,0);
	ks0108_pixel(x+3,y,0);
	ks0108_pixel(x,y+3,0);
	ks0108_pixel(x+3,y+3,0);

}
/*******************************************************************************/
char Yilan_Sur(void)
{

 	/* Kuyruk belirlenir  */
	kont2=yilan_harita[0];

	/* yilan ilerletilir  */
	i=1;
	while(1){

	kont=yilan_harita[i];
	yilan_harita[i-1]=kont;
	i++;
	if(yilan_harita[i]=='\0')break;

	}

 	/* Yon belirlenir  */

	kont=yilan_harita[boy];

	if(yon==sag){if(yon_h!=sol){kont++;yon_h=sag;}else kont--;}
	if(yon==sol){if(yon_h!=sag){kont--;yon_h=sol;}else kont++;}
	if(yon==asa){if(yon_h!=yuk){kont+=25;yon_h=asa;}else kont-=25;}
	if(yon==yuk){if(yon_h!=asa){kont-=25;yon_h=yuk;}else kont+=25;}

 	/* Duvar sınır ihlali kontrol edilir  */
if(seviye==1){
	if(yon_h==sag){
	for(i=1; i<=226;){
	i+=25;
	if(kont==i)return 0;
	   }
	}
	if(yon_h==sol){
	for(i=0; i<=225;){
	i+=25;
	if(kont==i)return 0;
	   }
	}
	if(!kont)return 0;
	if(kont>=251)return 0;
}
else if(seviye==2){

 	if(yon_h==sag){
	for(i=1; i<=226;){
	i+=25;
	if(kont==i){kont-=25;break;}
	   }
	}
	if(yon_h==sol){
	for(i=0; i<=225;){
	if(kont==i){kont+=25;break;}
		i+=25;
	   }
	}

	if((kont>250)&&(kont<276))kont-=250;
    if(kont>276)kont+=250;
	if(!kont)kont+=250;
}
else if(seviye==3){

 	if(yon_h==sag){
	for(i=1; i<=226;){
	i+=25;
	if(kont==i){kont-=25;break;}
	   }
	}
	if(yon_h==sol){
	for(i=0; i<=225;){
	if(kont==i){kont+=25;break;}
		i+=25;
	   }
	}

	if((kont>250)&&(kont<276))kont-=250;
    if(kont>276)kont+=250;
	if(!kont)kont+=250;

    for(i=0; i<32; i++)if(duvar[i]==kont)return 0;

}
 	/* kuyruga carpma ihlali kontrol edilir  */

	for(i=0; i<boy; i++)if(yilan_harita[i]==kont)return 0;

  	/* yilan sürülür  */

	noktala(kont2,0); // kuyruk sil
   	noktala(kont,1);  // boy uzat

 	/* Yem yutulduysa puan arttırılır yeni yem eklenir  */

 	if(kont==yem){
	puan+=10;
	boy++;
	yilan_harita[boy]=kont;
	ks0108_text(4,55,ekran_p,1,0);
	sprintf(ekran_p,"Puan: %2d",puan);
	ks0108_text(4,55,ekran_p,1,1);
	Yem_Ekle(random);
	}else
	yilan_harita[boy]=kont;

	return 1;

}
/*******************************************************************************/

Oyun Videosu

no images were found

 

Kategoriler: Yazılımlar Etiketler:
  1. Serhat
    27 Ağustos 2012 17:58 | #1

    Hocam ellerinize sağlık eğlenceli bir çalışma olmuş 🙂 🙂

  2. 4 Eylül 2012 13:37 | #2

    Hocam çok süper bir çalışma olmuş. Ellerinize Sağlık. Başka oyun çalışmalarınızıda beklerim.

  3. 4 Eylül 2012 13:56 | #3

    merhaba hocam tşk.

    Yeni oyunlar ortaya çıkabilir zamanla kesin bişey yok ancak elime bir accelerometer geçerse yine eğlenceli bişeyler yapmayı düşünürüm. 🙂

    İyi çalışmalar.

  4. Mahir ZENGİN
    16 Eylül 2012 11:09 | #4

    Güzel geçerli bir çalışma tebrik ederim. Coşkun Bey. 🙂

  5. Hasan Üzülmez
    29 Ekim 2012 09:37 | #5

    Tebrik ederim hocam güzel bir çalışma olmuş

  6. 22 Temmuz 2013 09:59 | #6

    çok güzel bir çalışma ama java runtime yüklü bir işlemci kullansaydınız donanım sabit, oyunlar flaş hazıfa ile oynanabilir olsaydı daha ileri düzey olmaz mıy dı ?

  7. 22 Temmuz 2013 20:04 | #7

    Olabilir hocam o zamanki tecrübeyle bukadar yapılabildi şuan farklı kollara yönelmiş durumdayım pek zaman ayıramıyorum bu tarz işlere.

    kolay gelsin.

  1. Şimdilik geri izleme yok