بازی ‌X/O یادگیرنده!

امروز تصمیم گرفتم که یک کار بامزه و کوچیک تو راستای چیزی که این‌روزها درگیرشم (یادگیری ماشین) انجام بدم. کاری که تصمیم گرفتم بکنم ساختن یه بازی ساد‌ه‌ی دو نفره بود که نفر دومش کامپیوتر باشه. دلم میخواست بازیکن سمت کامپیوتر اینجوری پیاده سازی بشه که اول صرفا حرکات رندوم و فکر نشده داشته باشه و بعد از اینکه چندین بار بازی کرد و باخت، آروم آروم از تجربیات گذشته درس بگیره و یاد بگیره که قوانین بازی چجوریه و بازی رو بهتر و بهتر انجام بده. تا در نهایت به سطحی برسه که هیچوقت از هیچ انسانی نبازه.

بازی‌های مختلفی تو ذهنم بود که هر کدوم قابلیت پیاده‌سازی همچین چیزی رو داشت. اما من ترچیح میدادم به جای اینکه وقتم صرف نوشتن فضای بازی و گرافیک و … بشه، تمام تمرکزم رو بخش یادگیری ماشین و امتحان روش‌های مختلف یادگیری باشه. برای همین تصمیم گرفتم ساده‌ترین و در عین حال خاطره‌انگیز ترین بازی ممکن رو پیاده کنم: ایکس او !

هممون احتمالا با فضای این بازی آشناییم. یه صفحه ۳ در ۳ که بازیکن‌ها به ترتیب علامت مخصوص خودشون رو (X یا O) رو تو یک سلول مینویسند. در انتها بازیکنی برنده‌ست که یک سطر، یک ستون و  یا یک قطر صفحه رو از آن خود کرده باشه! اگر هم هیچ بازیکنی به این هدف نرسه و تمام ۹ سلول صفحه پر شده باشند، بازی مساوی اعلام میشه.

برای رسیدن به هدفم نیاز داشتم که بازی رو از ابتدا خودم بنویسم. برای نوشتن این بازی یه ماتریس ۳ در ۳ تعریف کردم که در واقع بیانگر صفحه بازی بود. بعد از اینکه هر کاربر یک سلول رو انتخاب کرد، علامت مخصوص اون کاربر به سلول اضافه میشه و صفحه بازی دوباره رسم میشه.

بازی‌ای که نوشتم به دو شکل قابل اجراست. شکل اولش یه بازی دو نفره‌ست که هر کدوم از نفرات به ترتیب بازی میکنه. شکل دومش هم بازی یک نفره‌ست که بازیکن با کامپیوتر بازی میکنه. تو حالت دوم، در حال حاضر کامپیوتر تمام حرکاتش رو رندوم انجام میده و این همون بخشیه‌ که قراره روش کار کنم. قراره کامپیوتر طوری برنامه‌نویسی بشه که از حرکات رندوم خودش آروم آروم یاد بگیره که باید چیکار کنه و حرکات بهتری انجام بده.

تو این بازی چون فضای جست‌وجو خیلی کوچیکه، میشه به روشهای دیگه‌ هم بازیکن سمت کامپیوتر رو برنامه‌نویسی کرد. مثلا میشه با استفاده از رسم درخت فضای حالت و Game Theory، خیلی راحت یه بازیکن هوشمند طراحی کرد. اما من هدفم چیز دیگه‌ایه. من دلم میخوام بازیکنی بسازم که مثل یه سگ آموزشش بدم! بازیکنی که به مرور بفهمه چرا بازیش جلوی من اشتباه بود و یاد بگیره که حرکات بهتری انجام بده.

البته هنوز دقیقا نمیدونم از چه روشی میخوام به هدف برسم. الگوریتم‌های ماشین لرنینگی که بلدم خیلی برای این فضا مناسب نیستند. اینجا من تمام داده‌ها (حرکتهای انجام شده) رو یکجا ندارم و کامپیوتر باید براساس انتخاب‌های حریفش به ترتیب انتخاب کنه. همین باعث شده که هیچکدوم از الگوریتم‌های یادگیرنده‌ای که میشناسم خیلی برای این کار مناسب نباشه. احتمالا اصلی‌ترین چالش من هم تو ساختن این بازی همینه. پیدا کردن روش مناسب یادگیری‌ماشین. در این حین سعی میکنم در موردش همینجا بنویسم.

کد بازی رو به پایتون نوشتم و اینجا قرارش میدم. من خیلی وقت نیست که برنامه‌نویسی پایتون میکنم، برای همین ممکنه خیلی از جاها رو جاوایی فکر و پیاده سازی کرده باشم! اگر فکر میکنیم بخش‌هایی از کد رو تغییر بدم بهینه‌تر و بهتر میشه خیلی خیلی خوشحال میشم که بهم بگید.

 

from random import randint

def drawBoard(matrix):
	#Draws board like this:
	# A   |   |   
	#   __________
	# B   |   |   
	#   __________
	# C   |   |   

	print "   1  2  3 "
	print "A %s | %s | %s " % (matrix[0][0],matrix[0][1],matrix[0][2])
	print "  __________"
	print "B %s | %s | %s " % (matrix[1][0],matrix[1][1],matrix[1][2])
	print "  __________"
	print "C %s | %s | %s " % (matrix[2][0],matrix[2][1],matrix[2][2])



#This function updates matrix based on user decision.
def updateMatrix(matrix, symbol, cell):
	column = None
	row = None
	if "A" in cell:
		row = 0
	elif "B" in cell:
		row = 1
	elif "C" in cell:
		row = 2

	if "1" in cell:
		column = 0 
	elif "2" in cell:
		column = 1
	elif "3" in cell:
		column = 2
	if column != None and row != None:
		if matrix[row][column] == " ":
			matrix[row][column] = symbol
			return 1
#Checks matrix to see if anyone won the game
def checkForWinner(matrix):
	X = 0
	O = 0
	# Checking rows
	for i in matrix:
		for j in i:
			if j == "X":
				X +=1
			elif j == "O":
				O += 1
		if X ==3:
			return "X"
		elif O==3:
			return "O"
		else:
			X,O = 0,0
	# Checking columns
	for j in range(3):
		for i in range(3):
			if matrix[i][j] == "X":
				X += 1
			elif matrix[i][j] == "O":
				O += 1
		if X ==3:
			return "X"
		elif O==3:
			return "O"
		else:
			X,O = 0,0

	if matrix[0][0] == matrix[1][1] == matrix[2][2] == "X":
		return "X"
	elif matrix[0][0] == matrix[1][1] == matrix[2][2] == "O":
		return "O"

	if matrix[0][2] == matrix[1][1] == matrix[2][0] == "X":
		return "X"
	elif matrix[0][2] == matrix[1][1] == matrix[2][0] == "O":
		return "O"

	return " "
#Check to see if the matrix is filled
def isGameFinished(matrix):
	for i in matrix:
		for j in i:
			if j == " ":
				return False
	return True

#This method runs the game with two players
def startWithTwoPlayer():
	matrix = [[" "," "," "],[" "," "," "],[" "," "," "]]


	print "Game Started: "
	print "Player1 : X"
	print "Player2 : O"
	drawBoard(matrix)
	while True:
		print "Player1 turn. Please choose a cell (X)"
		validCell = None
		while validCell == None:
			cell = raw_input("cell:")
			validCell = updateMatrix(matrix, "X" , cell)
		drawBoard(matrix)
		winner = checkForWinner(matrix)
		if winner == "X":
			print "Player1 WON!"
			break
		elif winner == "O":
			print "Player2 WON!"
			break
		if isGameFinished(matrix):
			print "Game finished! No one Won!"
			break
		print "Player2 turn. Please choose a cell (O)"
		validCell = None
		while validCell == None:
			cell =  raw_input("cell:")
			validCell = updateMatrix(matrix, "O" , cell)
		updateMatrix(matrix, "O" , cell)
		drawBoard(matrix)
		winner = checkForWinner(matrix)
		if winner == "X":
			print "Player1 WON!"
			break
		elif winner == "O":
			print "Player2 WON!"
			break
		if isGameFinished(matrix):
			print "Game finished! No one Won!"
			break

#Starts Single player game. Computer chooses all it's moves randomly 
def startRandomPlay():
	matrix = [[" "," "," "],[" "," "," "],[" "," "," "]]
	

	print "Game Started: "
	print "Player1 : X"
	print "Computer : O"
	drawBoard(matrix)
	while True:
		print "Player1 turn. Please choose a cell (X)"
		validCell = None
		while validCell == None:
			cell = raw_input("cell:")
			validCell = updateMatrix(matrix, "X" , cell)
		drawBoard(matrix)
		winner = checkForWinner(matrix)
		if winner == "X":
			print "Player1 WON!"
			break
		elif winner == "O":
			print "Computer WON!"
			break
		if isGameFinished(matrix):
			print "Game finished! No one Won!"
			break
		print "Computer turn. Please choose a cell (O)"
		
		validCell = None
		while validCell == None:
			cell = chooseRandomCell()
			validCell = updateMatrix(matrix, "O" , cell)
		drawBoard(matrix)
		winner = checkForWinner(matrix)
		if winner == "X":
			print "Player1 WON!"
			break
		elif winner == "O":
			print "Computer WON!"
			break
		if isGameFinished(matrix):
			print "Game finished! No one Won!"
			break

#Choose a random cell in matrix 
def chooseRandomCell():
	column = randint(1,3)
	row = randint(1,3)
	if row == 1:
		return "A"+str(column)
	if row == 2:
		return "B"+str(column)
	if row == 3:
		return "C"+str(column)



if __name__ == "__main__":
	type = " "
	while type != "M" or type != "S":
		type = raw_input("MultiPlayer of Single player? (M/S)")
		if type == "M":
			startWithTwoPlayer()
		elif type == "S":
			startRandomPlay()

2 پاسخ به “بازی ‌X/O یادگیرنده!”

  1. محسن گفت:

    سلام.تشکر که وقت گذاشتی و نوشتی.فقط اینکه من کدت رو توی پایتون اجرا کردم.بعد از پرسیدن سوالMultiPlayer or Single player? (M/S)
    چه جواب M یا S باشه زیر سوال یه false چواپ می کنه و در هر دو صورت دو نفره بازی می کنه.یعنی نمی تونه تک نفره بازی کنه.یه بررسی می کنه بی زحمت.

    • آرش خوئینی گفت:

      سلام محسن جان. اینکه فالس پرینت میگیره یه مشکلی بود که برطرف کردم. ولی در هر صورت دونفره بازی نمیکرد. یک بار دیگه چک بکن مشکی بود بگو. ممنونم

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

android application Google I/O HomeBrew ImageMagick Material Design mobile PogressBar RecyclerView splash TEDxKish ux آموزش اندروید الوین تافلر اندروید اپلیکیشن برنامه نویسی برنامه نویسی اندروید برنامه‌نویسی برنامه‌نویسی اندروید تداکس کیش تعمیر تغییر سایز عکس با ترمینال خلاصه کتاب دانش داده دانشگاه دانشگاه ایده‌آل دزد دیتا ساینس رشته مهندسی کامپیوتر ریکامندرسیستم سیستم‌های توصیه‌گر فری‌لنس لپتاپ متریال دیزاین معرفی کتاب موج سوم نوار پیشرفت همایش هوش مصنوعی ُجزیره کیش کار کسب و کار یادگیری عمیق یادگیری ماشین