Pazar, Aralık 19, 2010
25 Yıldır Ayakta
Pazar, Kasım 21, 2010
ASP .Net ile Tic Tac Toe
C++ ile yaptığım versiyonunda tek bir bilgisayarda iki kişi tarafından (fareyi sırayla kullanarak) oynanabiliyordu. Buna ufak bir yapay zeka(AI) yazarak bilgisayara karşı oynayabilecek şekilde yaptım.
Kodlar
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace TicTacToe
{
public partial class Default : System.Web.UI.Page
{
//Hangi şekillerde karakterden 3 tane aynı hizaya gelebilir
private static int[,] ihtimaller = new int[,] { {0,1,2}, {3,4,5},
{6,7,8}, {0,3,6},
{1,4,7}, {2,5,8},
{0,4,8}, {2,4,6}};
protected void Page_Load(object sender, EventArgs e)
{
int[] harita = haritaOlustur();
if (Request.QueryString["hucre"] != null)
{
int index = Convert.ToInt32(Request.QueryString["hucre"]);
harita[index] = 1;
bilgisayarOyna();
}
else if (Request.QueryString["yeniOyun"] != null)
{
Session.Clear();
Response.Redirect("Default.aspx");
}
/*kazananVarMi() fonksiyonu 3 farklı sayı döndürebilir:
0 => Kazanan yok
1=>Oyuncu kazandı
2=>Bilgisayar Kazandı*/
int kazanan = kazananVarMi();
if (kazanan > 0)
{
string strKazanan = "<center><span style='font-size:35pt;font-weight:bold'>";
strKazanan += (kazanan == 1 ? "Sen Kazandın" : "Bilgisayar Kazandı")
+ "</span></center>";
Response.Write(strKazanan);
}
else if (berabereMi())
{
string strKazanan = "<center><span style='font-size:35pt;font-weight:bold'>"
+ "BERABERE</span></center>";
Response.Write(strKazanan);
}
else
{
tabloOlustur(harita);
Session["harita"] = harita;
}
}
private void tabloOlustur(int[] pHarita)
{
int sayac = 0;
for (int i = 0; i < 3; i++)
{
TableRow satir = new TableRow();
for (int k = 0; k < 3; k++)
{
TableCell hucre = new TableCell();
hucre.Width = 75;
hucre.Height = 75;
hucre.HorizontalAlign = HorizontalAlign.Center;
hucre.Attributes.Add("onMouseOver", "this.bgColor='#00c0ff'");
hucre.Attributes.Add("onMouseOut", "this.bgColor=''");
if (Convert.ToUInt32(pHarita[sayac]) == 0)
hucre.Text = "<a href='Default.aspx?hucre=" + sayac.ToString() + "'>Tıkla</a>";
else if (Convert.ToUInt32(pHarita[sayac]) == 1)
hucre.Text = "<span style='font-size:35pt;font-weight:bold'>X</span>";
else
hucre.Text = "<span style='font-size:35pt;font-weight:bold'>O</span>";
satir.Cells.Add(hucre);
sayac++;
}
tablo.Rows.Add(satir);
}
}
private int[] haritaOlustur()
{
int[] harita = new int[9];
if (Session["harita"] != null)
{
harita = (int[])Session["harita"];
}
else
{
for (int i = 0; i < 9; i++)
harita[i]=0;
}
return harita;
}
private int kazananVarMi()
{
int[] harita = haritaOlustur();
int durum = 0;
int hucre1 = 0, hucre2 = 0, hucre3 = 0;
for (int i = 0; i < 8; i++)
{
hucre1 = ihtimaller[i, 0];
hucre2 = ihtimaller[i, 1];
hucre3 = ihtimaller[i, 2];
if (harita[hucre1] != 0 && harita[hucre2] != 0 && harita[hucre3] != 0)
{
if (harita[hucre1] == harita[hucre2] && harita[hucre1] == harita[hucre3])
durum = harita[hucre1];
}
}
return durum;
}
private bool berabereMi()
{
//Eğer harita dizisinde değeri 0 olan eleman yoksa oyun Berabere bitmiş demektir
int[] harita = haritaOlustur();
for (int i = 0; i < 9; i++)
{
if (harita[i] == 0)
return false;
}
return true;
}
private void bilgisayarOyna()
{
int hucre1 = 0, hucre2 = 0, hucre3 = 0;
bool durum = false;
int[] harita = haritaOlustur();
for (int i = 0; i < 8; i++)
{
hucre1 = ihtimaller[i,0];
hucre2 = ihtimaller[i,1];
hucre3 = ihtimaller[i,2];
//Bilgisayarın tek hamlede kazanma ihtimali var mı ?
if (harita[hucre1] == 2 && harita[hucre2] == 2 && harita[hucre3] == 0)
{
durum = true;
harita[hucre3] = 2;
break;
}
else if (harita[hucre1] == 2 && harita[hucre3] == 2 && harita[hucre2] == 0)
{
durum = true;
harita[hucre2] = 2;
break;
}
else if (harita[hucre2] == 2 && harita[hucre3] == 2 && harita[hucre1] == 0)
{
durum = true;
harita[hucre1] = 2;
break;
}
//Karşıdaki oyuncunun tek hamlede kazanma ihtimali var mı ?
else if (harita[hucre1] == 1 && harita[hucre2] == 1 && harita[hucre3] == 0)
{
durum = true;
harita[hucre3] = 2;
break;
}
else if (harita[hucre1] == 1 && harita[hucre3] == 1 && harita[hucre2] == 0)
{
durum = true;
harita[hucre2] = 2;
break;
}
else if (harita[hucre2] == 1 && harita[hucre3] == 1 && harita[hucre1] == 0)
{
durum = true;
harita[hucre1] = 2;
break;
}
}
/*Oyunun bitme ihtimali yoksa rasgele oynar.
*Aslında burayıda nasıl oynayacağını detaylandıracak
*kodlar yazılarak daha akıllı hale getirilebilir
*/
if (!durum)
harita[bosHucreBul()] = 2;
}
private int bosHucreBul()
{
Random sayi = new Random();
int hucre = sayi.Next(0, 9);
int[] harita = haritaOlustur();
/*BerabereMi fonksiyonu boş hücre varmı diye kontrol eder.
Eğer kontrole bunu da eklemezsek ve hiç boş hücre yoksa
Sonsuz döngüye girer*/
while (harita[hucre] != 0 && !berabereMi())
{
hucre = sayi.Next(0, 9);
}
return hucre;
}
}
}
Ekran Görüntüsü
İNDİR
Salı, Kasım 16, 2010
PHP $this İşaretçisinin Adını Değiştirmek
Konu hakkındaki ilk yorumum böyle bir şeyin olamayacağı yönündeydi. Sonuçta bu ad php yorumlayıcısı tarafından belirlenmiş anahtar kelimeydi. Ama biraz düşününce yolu biraz dolandırarak çok basit bir yöntemle yapmak mümkün olabilirdi. Sınıf içinde $this işaretçisine referans olacak bir değişken tanımlayıp, sınıf içindeki değişkenlere yeni tanımladığımız değişkenle erişmek mümkün. Aşağıdaki ufak örnek daha iyi anlamaya yardımcı olabilir.
<?php
class Birsey
{
public $mesaj;
private $bu;//Yeni işaretçi olacak
function __constructor()
{
//Yeni değişkeni $this'e referans olarak ayarlıyoruz
$this->bu = &$this;
}
function birseyYap($mesaj)
{
//Yeni işaretçi ile sınıf değişkenlerine erişiyoruz
$bu->mesaj = $mesaj;
echo $bu->mesaj;
}
}
$nesne = new Birsey();
$nesne->birseyYap("Merhaba Dünya");
?>
Pazar, Kasım 07, 2010
SDL Per Pixel Çarpışma Algoritması
SDL_Rect Resim::temasAlani(SDL_Rect rect)
{
SDL_Rect temasRect;
temasRect.x = rect.x - this->getX();
temasRect.y = rect.y - this->getY();
temasRect.w = rect.w;
temasRect.h = rect.h;
return temasRect;
}
bool Resim::perPixelCarpismaKontrol(Resim* hedef)
{
bool durum = false;
int x1 = Maximum(getResimKoord().x, hedef->getResimKoord().x);
int y1 = Maximum(getResimKoord().y, hedef->getResimKoord().y);
int x2 = Minimum(getResimKoord().x + resimW, hedef->getResimKoord().x + hedef->resimW);
int y2 = Minimum(getResimKoord().y + resimH, hedef->getResimKoord().y + hedef->resimH);
int width = x2 - x1;
int height = y2 - y1;
SDL_Rect carpismaRect = {0,0,0,0};
//Eğer width ve height 0 dan büyükse ise resimler temas halinde demektir
if(width > 0 && height > 0)
{
//Ne kadarlık bir alanın temas halinde olduğu
carpismaRect.x = x1;
carpismaRect.y = y1;
carpismaRect.w = width;
carpismaRect.h = height;
/*İlgili resmin hangi koordinatlarında kesişme olduğunu öğreniyoruz
Bu sayede resmin tamamını değil sadece kesişen kısmı kontrol ediyoruz*/
SDL_Rect kaynakRect = temasAlani(carpismaRect);
SDL_Rect hedefRect = hedef->temasAlani(carpismaRect);
//pixel pixel resim taramasına başlıyorum
for(int y = 0; y <= carpismaRect.h; y++)
{
for(int x = 0; x <= carpismaRect.w; x++)
{
if(GetAlphaXY(this, kaynakRect.x + x, kaynakRect.y + y) &&
GetAlphaXY(hedef, hedefRect.x + x, hedefRect.y + y))
durum = true;
}
}
}
else
durum = false;
return durum;
}
Yukarıdaki kodlarda temasAlani() fonksiyonuna dikkat çekmek istiyorum.Ne kadarlık bir alanda temas olduğunu öğrendikten sonra temasAlani() fonksiyonu ile temasın ilgili resmin hangi koordinatlarında yani hangi pixeller arasında olduğunu öğreniyoruz. Bu sayede sadece o alandaki pixellerin şeffaflığını kontrol etmiş oluyoruz.
Perşembe, Ekim 14, 2010
Ubuntuda PHP hata mesajları görünmüyor!!!
1- /etc/php5/cli/ ve /etc/php5/apache2/ dizinlerinde bulunan php.ini dosyalarını açıp her ikisi için 2.adımdaki işlemleri uygulayın.
sudo gedit /etc/php5/apache2/php.ini
2- "display_errors" ve "display_startup_errors" seçeneklerini bulun ve "off" yerine "on" yazın.
display_startup_errors= on
3-Son olarak apache'yi yeniden başlatın.
Salı, Ekim 12, 2010
Ubuntu 10.10 Maverick Meerkat Duyuruldu!
Dünyanın en çok tercih edilen ve Canonical tarafından her altı ayda bir yeni sürümleri geliştirilen Linux dağıtımı Ubuntu, 10.10 sürümünü ‘Maverick Meerkat‘ kod adı ile duyurdu.
Kusursuz 10 tanımlası ile duyurulan yeni sürüm, bir önceki sürüm olan 10.04 LTS’a göre bir çok yenilik ve geliştirme içeriyor.
2.6.35 Linux çekirdeği ve 2.32.0 Gnome sürüm temellerine dayanan Ubuntu 10.10, yeni bir yazı tipi ailesi, yeniden tasarlanmış sistem yükleyici, yeni resim görüntüleyici, Evolution 2.30.2, Twitter için Gwibber yenilikleri, Firefox 3.6.10, Open Office 3.2.1, Braserio disk yazma aracının yeni sürümü ve bir çok paket güncellemesi ile hata düzeltmeleri yer alıyor.
Sürüm duyurusunun tamamını okumak için burayı, sürüm notları için de burayı tıklayabilirsiniz.
10.04 kullanıcılarının sistemlerini güncellemeleri için, Alt+F2 tuş kombonasyonu aracılığı ile açtıkları uygulama çalıştırma penceresine, ‘update-manager-D’ yazmaları yeterli.
Sisteminize uygun olan Ubuntu 10.10 sürümünü indirmek için tıklayın.
Bir sonraki sürüm olan 11.04, 2011 yılının Nisan ayında duyurulacak.
Kaynak: www.habertux.com
Salı, Ekim 05, 2010
Google Chrome 7
Chrome
Chrome 7'de grafik donanımı ivmesi, anında arama ve daha birçok geliştirme.
Perşembe, Eylül 30, 2010
SDL İle Ekrana Nokta(Pixel) Basma
Söz dizimi:
Parametreler:
x ve y: Noktanın koordinatları.
pixel: Noktanın rengi.(Ör:SDL_MapRGB(screen->format,255,255,255))
Kullanım Şekli:
void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
{
int bpp = surface->format->BytesPerPixel;
//Here p is the address to the pixel we want to set
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
switch(bpp) {
case 1:
*p = pixel;
break;
case 2:
*(Uint16 *)p = pixel;
break;
case 3:
if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
p[0] = (pixel >> 16) & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = pixel & 0xff;
} else {
p[0] = pixel & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = (pixel >> 16) & 0xff;
}
break;
case 4:
*(Uint32 *)p = pixel;
break;
}
}
Çarşamba, Eylül 29, 2010
Ubuntu için CodeBlocks 10.05 Kurulumu
1- Öncelikle sistemde eski sürümü(8.02) varsa kaldırıyoruz.
2-wxWidget deposunu sisteme ekliyoruz.
3- Depo güvenlik anahtarını ekliyoruz ardından paket deposunu güncelliyoruz.
sudo apt-get update
4-Gerekli olan wxWidget paketlerini kuruyoruz.
5- Buradan codeblocks 10.05'in binary dosyalarına erişebilirsiniz. Ubuntu için dbg siz debian paketini(i386) indiriyoruz. Daha sonra dosyaları bir dizine çıkartıp konsoldan o dizine geçiyoruz.
6- Aşağıdaki komut yardımı ile paketlerin kurulumunu gerçekleştiriyoruz.
Kurulum bu kadar Uygulamar/Programlar bölümünde yeni CodeBlocks'unuza erişebilirsiniz. Güle güle kullanın.