Reply
 
Thread Tools Display Modes   
 
Membuat game othello dalam 100 baris kode?
 
Old 07/05/2009, 19:25 Reply With Quote   #1
pe-e-be
Alien dari lab GAIB
 
pe-e-be's Avatar
 
Join Date: Jul 2005
Location: lab gaib itb, bandung
Posts: 1,755
pe-e-be is on a distinguished road
pe-e-be is offline
Membuat game othello dalam 100 baris kode?

Ya betul, game othello dapat dibuat dalam 100 baris kode. berikut ini cara membuatnya.

Alat dan Bahan
- Python 2.5 dan PyGame
- Program menggambar dan konversi image (saya pakai InkScape+Paint.NET+IrfanView)
- text editor (saya pakai Notepad2)
-3 buah gambar (keping hitam, keping putih, dan ubin untuk papan permainan)




Resep
Code:
from pygame import * init() PLAYERTURN,CPUTURN = 0,1 turn,remain = PLAYERTURN,60 board = [[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,2,0,0,0], [0,0,0,2,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]] def find(x,y,delta,piece): global remain result = [(x,y)] dx,dy=x+delta[0],y+delta[1] if (dx>=0) and (dx<8) and (dy>=0) and (dy<8): if board[dy][dx]==0: return [] elif board[dy][dx]==piece: return result else: tmp = find(dx, dy, delta, piece) if len(tmp)>0: result += tmp if len(result)>1: return result else: return [] def switchturn(): global turn if turn==PLAYERTURN: turn=CPUTURN else: turn=PLAYERTURN def pick(x,y): global remain neighbors = [(0,-1),(1,-1),(1,0),(1,1),(0,1),(-1,1),(-1,0),(-1,-1)] if (x<0) or (x>7) or (y<0) or (y>7) or board[y][x] <> 0: return False if turn == 0: opposite = 1 else: opposite = 0 tmp = [] for n in neighbors: dx,dy=x+n[0],y+n[1] if (dx>=0) and (dx<8) and (dy>=0) and (dy<8) and (board[dy][dx]==opposite+1): #tetangga beda keping, tapi di ujung ada keping yang sama tmp2 = find(dx,dy,n,turn+1) if len(tmp2)>0: tmp += tmp2 if len(tmp)==0: return False for p in tmp: board[p[1]][p[0]] = turn+1 board[y][x] = 1+turn remain-=1 return True def main(): global remain, neighbors, turn display.init() font.init() screen = display.set_mode((288, 256), HWSURFACE|DOUBLEBUF) clock = time.Clock() fnt = font.Font(None, 24) cell = image.load("cell.png") cw,ch=cell.get_width(),cell.get_height() keping = [image.load("white.png"), image.load("black.png")] imturn = [fnt.render("P1", 1, (0,0,0)), fnt.render("P2", 1, (0,0,0)) ] imgo = font.Font(None, 48).render("GAME OVER", 1, (255,0,0)) running = True while running: clock.tick(20) screen.fill((255,255,255)) for y in range(0,8): for x in range(0,8): screen.blit(cell, (x*cw, y*ch)) #gambar papan if board[y][x] > 0: screen.blit(keping[board[y][x]-1], (1+x*cw, 1+y*ch)) # gambar keping screen.blit(imturn[turn], (258, ch)) #gambar teks giliran screen.blit(keping[turn], (256, 0)) #gambar keping giliran for e in event.get(): if e.type == QUIT or (e.type==KEYDOWN and e.key==K_ESCAPE): running = False break if e.type == MOUSEBUTTONDOWN: if pick(e.pos[0]/cw,e.pos[1]/ch): switchturn() if e.type == KEYDOWN: if e.key == K_SPACE: switchturn() #pass/lewati giliran kalau tidak ada yang bisa dilakukan if remain==0: screen.blit(imgo, ((screen.get_width()-imgo.get_width())/2, (screen.get_height()-imgo.get_height())/2)) #end of the game display.update() main()
Cara memainkan
klik pada papan yang kosong sesuai dengan aturan permainan othello
tombol keyboard :
- ESCAPE : exit program
- SPASI : pass/skip turn


selamat mencoba!
   
 
 
Old 07/05/2009, 19:27 Reply With Quote   #2
pe-e-be
Alien dari lab GAIB
 
pe-e-be's Avatar
 
Join Date: Jul 2005
Location: lab gaib itb, bandung
Posts: 1,755
pe-e-be is on a distinguished road
pe-e-be is offline
lupa, skrinsyut hasilnya ini
__________________
liku-liku hidup.
game, dapur dan perspektif.
hire me here
   
 
 
Old 07/05/2009, 19:36 Reply With Quote   #3
Fandrey
Pengamen
 
Fandrey's Avatar
 
Join Date: Aug 2007
Location: Neverland
Posts: 3,707
Fandrey is on a distinguished road
Send a message via Yahoo to Fandrey Fandrey is offline
Hehe, mantabh XD
Game in 100 lines... Boleh dicoba~

Thanks artikelnya
   
 
 
Old 07/05/2009, 19:59 Reply With Quote   #4
bart_the_13th
Veteran Member
 
No Avatar
 
Join Date: Jan 2004
Location: Bandung
Posts: 1,274
bart_the_13th is on a distinguished road
bart_the_13th is offline
Padahal kalo Phyton itu bsa dibikin dalam 1 baris loh?
Gak percaya? Coba aja gak usah mencet enter... Just kiding...

Hmmm, Phyton ternyata lumayan powerful juga yah, dan gak terlalu komplex dibanding C++ OOP.

Katanya juga bisa buat wrapping OGRE yah???
   
 
 
Old 07/05/2009, 21:03 Reply With Quote   #5
danny_warfield
D.A.N.N.Y
KebonPerang
 
danny_warfield's Avatar
 
Join Date: Nov 2007
Location: somewhere in this fragile world
Posts: 3,972
danny_warfield is on a distinguished road
Send a message via Yahoo to danny_warfield danny_warfield is offline
wah cocok nih buat mini game di renpy haha (maklum gak ngerti python)
   
 
 
Old 07/05/2009, 21:51 Reply With Quote   #6
alijaya
GDI Power Users
 
alijaya's Avatar
 
Join Date: Dec 2007
Location: Pangkalpinang
Posts: 3,279
alijaya is on a distinguished road
Send a message via Yahoo to alijaya alijaya is offline
doh pusing >.<
banyak variable yang gak di deklarasiin dulu >.<

gak ngerti pertama:

init()


ntuh fungsi init yang sebelah mana ya???


clock.tick(20)

ntuh untuk paan ya???

pusing juga... kalo trus menerus dalem while... kapan ada jeda untuk interaksi ma player???
apakah clock.tick(20) ntuh untuk memberi jeda???
doh beda ama haxe


trus...
kalo di setiap tick di blit semuanya dari awal sampe akhir apakah gak ngelambetin???
__________________
tobat ngejunk. tobat nyepam. tobat bikin yang gak bener. tobat kasih komen gak jelas. tobat buang-buang ikon. tobat jadi orang jelek. tobat maen komputer sambil belajar. tobat banget kalo ngomong gak bertanggung jawab. tobat banget untuk kesalahan laennya.
"siapa yang mau ikut2an tobat??"
blog : http://alijaya.wordpress.com/, http://bothaxe.wordpress.com/
   
 
 
Old 07/05/2009, 21:58 Reply With Quote   #7
bart_the_13th
Veteran Member
 
No Avatar
 
Join Date: Jan 2004
Location: Bandung
Posts: 1,274
bart_the_13th is on a distinguished road
bart_the_13th is offline
init() ama clock.tick(20) kayaknya ngimport(baca: nge import) dari librarynya pygame
   
 
 
Old 07/05/2009, 22:01 Reply With Quote   #8
L^O^J
Ulat tak berbulu
 
L^O^J's Avatar
 
Join Date: Dec 2003
Posts: 1,809
L^O^J is on a distinguished road
Send a message via Yahoo to L^O^J L^O^J is offline
Quote:
Originally Posted by alijaya View Post
doh pusing >.<
banyak variable yang gak di deklarasiin dulu >.<

gak ngerti pertama:

init()


ntuh fungsi init yang sebelah mana ya???


clock.tick(20)

ntuh untuk paan ya???

pusing juga... kalo trus menerus dalem while... kapan ada jeda untuk interaksi ma player???
apakah clock.tick(20) ntuh untuk memberi jeda???
doh beda ama haxe


trus...
kalo di setiap tick di blit semuanya dari awal sampe akhir apakah gak ngelambetin???
Ngga juga, di haxe dan AS3 gak keliatan karena sudah di wrap di event system, pake Event.ENTER_FRAME. Dan di haxe/AS3 juga sebenernya gak ada cara untuk "quit", gak mungkin khan terminate Flash Player (web browser) dari haxe/AS3 . Jadi sebenernya haxe/AS3 itu cuman jelas di entry point sama game loop, tapi setelah masuk game loop bisa dianggep "ngambang" loop terus.

Jeda interaksi sama player khan gak perlu pake event system (KEY_DOWN, KEY_UP, etc) tapi bisa check status input dari dalem loop. Dan flash juga dasaranya gambar tiap loop, cuman gak keliatan karena ada abstraksi dari DisplayListnya (Bitmap,Sprite,DisplayObject, DisplayObjectContainer, stage, dkk).
__________________
"Experience is something that you got when you don't get something that you want" - Randy Pausch ( The Last Lecture )
"The brick wall is there for a reason, to separate those who really want it and the rest" - Randy Pausch ( The Last Lecture )
   
 
 
Old 07/05/2009, 22:07 Reply With Quote   #9
alijaya
GDI Power Users
 
alijaya's Avatar
 
Join Date: Dec 2007
Location: Pangkalpinang
Posts: 3,279
alijaya is on a distinguished road
Send a message via Yahoo to alijaya alijaya is offline
dink~...
apa itu tadi??? *blank

hooo gitu yah~

hmmm... tapi kalo gak salah~ di flash player ada redraw regionnya kayak rectangle2 gitu~, yang hanya di rectangle ntuh yang di draw ulang, yang sisanya yang gak gerak gak didraw ulang... gitu kk

ok2 ic ic

makasi kk om loj *doh pake kk pake om lagi
__________________
tobat ngejunk. tobat nyepam. tobat bikin yang gak bener. tobat kasih komen gak jelas. tobat buang-buang ikon. tobat jadi orang jelek. tobat maen komputer sambil belajar. tobat banget kalo ngomong gak bertanggung jawab. tobat banget untuk kesalahan laennya.
"siapa yang mau ikut2an tobat??"
blog : http://alijaya.wordpress.com/, http://bothaxe.wordpress.com/
   
 
 
Old 07/05/2009, 22:14 Reply With Quote   #10
pe-e-be
Alien dari lab GAIB
 
pe-e-be's Avatar
 
Join Date: Jul 2005
Location: lab gaib itb, bandung
Posts: 1,755
pe-e-be is on a distinguished road
pe-e-be is offline
Quote:
Originally Posted by alijaya View Post
doh pusing >.<
banyak variable yang gak di deklarasiin dulu >.<
python itu nggak perlu deklarasi variabel dan tipenya dulu.. , kayak BASIC jadi deklarasinya adalah dengan kemunculan pertama suatu variabel di sisi kiri assignment.

Quote:
Originally Posted by alijaya View Post
gak ngerti pertama:

init()


ntuh fungsi init yang sebelah mana ya???
yang ini sebetulnya manggil fungsi pygame.init(), tapi karena untuk import fungsi init dengan cara
Code:
from pygame import *
maka pygame tidak perlu lagi disebut

kalau import modul pygamenya dengan cara
Code:
import pygame
maka pemanggilan fungsi ini harus dengan cara
Code:
pygame.init()
yang lainnya juga
Code:
pygame.display.init() pygame.display.set_mode((288,256), pygame.HWSURFACE|pygame.DOUBLEBUF) ...

Quote:
Originally Posted by alijaya View Post
clock.tick(20)

ntuh untuk paan ya???
ini untuk delay 20 ms

Quote:
Originally Posted by alijaya View Post
pusing juga... kalo trus menerus dalem while... kapan ada jeda untuk interaksi ma player???
apakah clock.tick(20) ntuh untuk memberi jeda???
doh beda ama haxe
interaksi ada di pemrosesan event
Code:
for e in event.get():
FYI bwt yang belum tahu, scoping blok (kalau di C/C++/AS pakai kurung kurawal) di python adalah dengan memberi indentasi yang sama (dengan spasi atau dengan horizontal tab) . tanda titik dua (colon/ setelah klausa for menandakan blok baru


Quote:
Originally Posted by alijaya View Post
trus...
kalo di setiap tick di blit semuanya dari awal sampe akhir apakah gak ngelambetin???
sepertinya nggak karena blit itu cuma operasi copy bitmap/raster, beda dengan vector (flash) yang harus digambar dulu. bisa juga dioptimasi kalau misalnya hanya objek tertentu saja yang berubah. tapi jadinya malah membunuh nyamuk pake bazooka klo cuma game kecil kayak gini..
__________________
liku-liku hidup.
game, dapur dan perspektif.
hire me here
   
   Reply « Previous Thread| Next Thread »     


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off


All times are GMT +7. The time now is 01:10.


skin developed by: uray
Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.