First i woudl like to thank everyone developing the lua player. your doing a GREAT job!
It would be great if people can test it out and give me some feedback.  its a 2 player game at the moment, AI will be included later.  
Controls:
  Cross = select square
  Triangle = reset game
  Start = exit game
All the best,
Xs.
-----------------------------------------------------------------------------
- BEGIN CODE -
-- global variables
-- position on board
local xPos = 1
local yPos = 1
-- position on board
-- which players turn
local playerTurn = 1
-- which players turn
-- controls read
local pad
local oldPad
-- controls read
-- current board
local board
-- current board
-- pixel x,y positions
local xPosPrint
local yPosPrint
-- pixel x,y positions
-- player won variable
local tempwin
local won
local XorO
-- player won variable
-- game draw variable
local isDraw
-- game draw variable
-- colors
local RED = Color.new(255, 0, 0)
local GREEN = Color.new(0, 255, 0)
local BLUE = Color.new(0, 0, 255)
local BLACK = Color.new(0,0,0)
local WHITE = Color.new(255,255,255)
-- colors
-- game dimensions
local SQUARE_SIZE = 80
local BOARD_SIZE = 240
local BOARD_TOP = 15
local BOARD_LEFT = 15
-- game dimensions
-- end global
function resetBoard()
	isDraw = nil
	xPos = 1
	yPos = 1
	playerTurn = 1
	won = nil
	XorO = nil
	tempWon = nil
	board = { {"-","-","-"},
		  {"-","-","-"},
		  {"-","-","-"} }
end
function resetGame()
	resetBoard()
end
function checkDraw()
	for xIndex, line in board do
		for yIndex, key in line do
			if key == "-" then
				isDraw = nil
				return isDraw
			end
		end
	end
	isDraw = true
	return isDraw
end
function drawRect(left, top, width, height, color)
	screen:drawLine(left, top, left+width, top, color)
	screen:drawLine(left, top, left, top+height, color)
	screen:drawLine(left+width, top, left+width, top+height, color)
	screen:drawLine(left+width, top+height, left, top+height, color)
end
function drawBoard()
	drawRect(BOARD_LEFT, BOARD_TOP, BOARD_SIZE, BOARD_SIZE, RED)
	
	local incY = BOARD_TOP
	local incX = BOARD_LEFT
	for i = 1, 3 do
		for j = 1, 3 do
			drawRect(incX, incY, SQUARE_SIZE, SQUARE_SIZE, RED)	
			incX = incX + SQUARE_SIZE
		end
		incY = incY + SQUARE_SIZE
		incX = BOARD_LEFT
	end	
end
function clearScreen()
	screen:clear()
end
function flip()
	screen.waitVblankStart()
	screen.flip()
end
function activateUSB(state)
	if not state then
		System.usbDiskModeDeactivate()
		return
	end
	System.usbDiskModeActivate()
end
function fillRect(left, top, width, height, color)
	screen:fillRect(left, top, width, height, color)
end
function drawPicked()
	for xIndex, line in board do
		for yIndex, key in line do
			if key ~= "-" then
				x = xIndex * SQUARE_SIZE + BOARD_LEFT - SQUARE_SIZE
				y = yIndex * SQUARE_SIZE + BOARD_LEFT - SQUARE_SIZE
				--debug("table X=" .. xIndex .. "-Y=" .. yIndex)
				printToScreen(x + 37, y + 37, key, GREEN)	
			end
		end
	end
end
function selectSquare()
	if not isDraw then
		if won then
			printToScreen(300, 120, "Player " .. playerTurn .. " Wins!", RED)
			printToScreen(300, 140, "Press triangle to", WHITE)
			printToScreen(300, 150, "restart!", WHITE)
		end
	else
		printToScreen(300, 140, "Draw game, press ", WHITE)
		printToScreen(300, 150, "triangle to restart!", WHITE)	
	end
	for i = 1, 3 do
		for j = 1, 3 do
			if xPos == i and yPos == j then
				xPosPrint = i * SQUARE_SIZE + BOARD_LEFT - SQUARE_SIZE
				yPosPrint = j * SQUARE_SIZE + BOARD_TOP - SQUARE_SIZE
				fillRect(xPosPrint + 1, yPosPrint + 1, SQUARE_SIZE - 2, SQUARE_SIZE - 2, BLUE)
				if playerTurn == 2 then
					printToScreen(300, BOARD_TOP, "Player 2's turn", GREEN)
				elseif playerTurn == 1 then
					printToScreen(300, BOARD_TOP, "Player 1's turn", GREEN)
				end
				drawPicked()
			end
			printTable()
		end
	end
end
function quitGame()
	if not pad:start() then
		return nil
	end
	return true
end
function debug(message)
	--clearScreen()
	screen:print(300, 30, message, GREEN)
end
function doPadUP()
	--debug("Pad UP")
	yPos = yPos - 1
	if yPos == 0 then
		yPos = 3
	end
end
function doPadDOWN()
	--debug("Pad DOWN")
	yPos = yPos + 1
	if yPos == 4 then
		yPos = 1
	end
end
function doPadRIGHT()
	--debug("Pad RIGHT")
	xPos = xPos + 1
	if xPos == 4 then
		xPos = 1
	end
end
function doPadLEFT()
	--debug("Pad LEFT")
	xPos = xPos - 1
	if xPos == 0 then
		xPos = 3
	end
end
function printToScreen(x, y, message, color)
	screen:print(x, y, message, color)
end
function printTable()
	--local tableX = 300
	--local tableY = 60
	
	--for xIndex,line in board do
	--	for yIndex, key in line do
	--		printToScreen(tableX, tableY, key, WHITE)
	--
	--		tableX = tableX + 30
	--	end
	--	tableY = tableY + 30
	--	tableX = 300
	--end			
end
function checkOccupied(x, y)
	if board[x][y] ~= "-" then
		return nil
	end
	return true
end
function changePlayerTurn()
	if checkOccupied(xPos, yPos) then
		if playerTurn == 2 then 
			-- WORK OUT HOW TO CONSTRUCT A 2D ARRAY
			-- THIS METHOD AND DRAWPICKED METHOD
			board[xPos][yPos] = "O"
			printToScreen(xPosPrint + 37, yPosPrint + 37, "O", GREEN)
			
			if hasWon("O") then
				-- display won
				
				printToScreen(300, 120, "Player " .. playerTurn .. " Wins!", RED)
				printToScreen(300, 140, "Press triangle to", WHITE)
				printToScreen(300, 150, "restart!", WHITE)
			else			
				if checkDraw() then
					printToScreen(300, 140, "Draw game, press ", WHITE)
					printToScreen(300, 150, "triangle to restart!", WHITE)
				else
					playerTurn = playerTurn - 1
				end
			end
		elseif playerTurn == 1 then
			board[xPos][yPos] = "X"
			printToScreen(xPosPrint + 37, yPosPrint + 37, "X", GREEN)
			
			if hasWon("X") then
				-- display won
				printToScreen(300, 120, "Player " .. playerTurn .. " Wins!", RED)
				printToScreen(300, 140, "Press triangle to", WHITE)
				printToScreen(300, 150, "restart!", WHITE)
			else
				if checkDraw() then
					printToScreen(300, 140, "Draw game, press ", WHITE)
					printToScreen(300, 150, "triangle to restart!", WHITE)					
				else				
					playerTurn = playerTurn + 1
				end
			end
		end
	else
		printToScreen(300, 250, "Position occupied", RED)
	end
end
function hasWon(symbol)
	tempwin = true	
	XorO = symbol
	
	-- check current row
	for col = 1, 3 do
		if not (board[xPos][col] == symbol) then
			tempwin = nil
		end
	end
	
	-- check current column
	if not tempwin then
		tempwin = true
		for row = 1, 3 do
			if not (board[row][yPos] == symbol) then
				tempwin = nil
			end
		end
	end
	
	-- check left diagonal
	if not tempwin then
		tempwin = true
		for i = 1, 3 do
			if not (board == symbol) then
				tempwin = nil
			end
		end
	end
	
	-- check right diagonal
	if not tempwin then
		tempwin = true --true
		for i = 1, 3 do
			-- DOES NOT WORK!?!
			if not (board[4 - i] == symbol) then
				tempwin = nil
			end
		end
	end
	
	won = tempwin	
	return won
end
function doPadCROSS()
	changePlayerTurn()
end
function doPadTRIANGLE()
	resetGame()
end
function startGameLoop()	
	while true do
		pad = Controls.read()
		if pad ~= oldPad then
			clearScreen()
			oldPad = pad
			
			drawBoard()
			selectSquare()
			
			if quitGame() then
				break
			end
			
			-- or not isDraw
			
			if not won and not isDraw then
				if pad:cross() then
					doPadCROSS()
				elseif pad:up() then
					doPadUP()
				elseif pad:down() then
					doPadDOWN()
				elseif pad:left() then
					doPadLEFT() 
				elseif pad:right() then
					doPadRIGHT()
				end
			end
			if pad:triangle() then
				doPadTRIANGLE()
			end
			
			flip()
		end
	end		
end
function main()
	activateUSB(true)
	resetBoard()
	oldPad = Controls.read()
	clearScreen()
	drawBoard()	
        flip()
	startGameLoop()
end
-- Start program execution at main method
main()
- END CODE -
			
			
													My first game. Tic Tac Toe in lua
Moderators: Shine, Insert_witty_name
My first game. Tic Tac Toe in lua
					Last edited by Xs on Sat Sep 03, 2005 1:13 am, edited 1 time in total.
									
			
									
						- 
				MikeHaggar
- Posts: 116
- Joined: Mon Jul 18, 2005 2:20 am
Fix so you don't have to press a button to get it to display stuff when starting the first time.
Just replace the main function with this one:
			
			
													Just replace the main function with this one:
Code: Select all
function main()
 activateUSB(true)
 resetBoard()
 oldPad = Controls.read()
 clearScreen()
 drawBoard()
 selectSquare()
 flip()
 startGameLoop()
end
					Last edited by MikeHaggar on Sat Sep 03, 2005 12:58 am, edited 1 time in total.
									
			
									
						and the fixed version is here http://psp-news.dcemu.co.uk/tictactoe.shtml