'**************************************************************** '* Name : BLACKJACK.BAS * '* Author : [select VIEW...EDITOR OPTIONS] * '* Notice : Copyright (c) 2004 [select VIEW...EDITOR OPTIONS] * '* : All Rights Reserved * '* Date : 11/1/2004 * '* Version : 1.0 * '* Notes : * '* : * '**************************************************************** '*********************************************************** ' DECLARE AND INITIALIZE HARDWARE OBJECTS AND VARIABLES **** '*********************************************************** define OSC 4 'set the clock speed INCLUDE "modedefs.bas" buttonNewGame VAR PORTD.1 'SNS1AB buttonHitPlayer VAR PORTD.0 'SNS2AB buttonPlayerStayHitDealer VAR PORTC.3 'SNS3AB testGrn1 VAR PORTB.6 'Creates variable for test light i VAR BYTE 'set all the defualts for the LCD define LCD_DREG PORTC 'set the LCD Data Ports DEFINE LCD_DBIT 4 'set starting data bit 'PORT.C4(dataLine11),C.5(12),C.6(13),C.7(14) DEFINE LCD_RSREG PORTD 'Set LCD Register select 'Green wire DEFINE LCD_RSBIT 2 'Set Register select bit 'PORTD.2 DEFINE LCD_EREG PORTD 'Set LCD enable port 'white wire DEFINE LCD_EBIT 3 'Set LCD Enable bit 'PORTD.3 DEFINE LCD_BITS 4 'Set the bus size (4 or 8) 'Number of pins used on LCD define LCD_LINES 2 'Set the number of lines on the lcd DEFINE LCD_COMMANDUS 2000 'Set command delay in US DEFINE LCD_DATAUS 50 'Set datqa delay time in US 'The following are being defined as output for data pins 'You must use the last four pins of a data port when using last four data lines OUTPUT PORTC.4 'data line 11 (reflects starting bit refered to in LCD_DBit4 which is PortC.4) OUTPUT PORTC.5 'data line 12 OUTPUT PORTC.6 'data line 13 OUTPUT PORTC.7 'data line 14 OUTPUT testGrn1 INPUT buttonNewGame INPUT buttonHitPlayer INPUT buttonPlayerStayHitDealer '*********************************************************** ' DECLARE AND INITIALIZE GAME OBJECTS AND VARIABLES ******** '*********************************************************** ' CARD DECK AND RETURNED CARD VALUE cards VAR byte[14] cards(0) = 1 cards(1) = 2 cards(2) = 3 cards(3) = 4 cards(4) = 5 cards(5) = 6 cards(6) = 7 cards(7) = 8 cards(8) = 9 cards(9) = 10 cards(10) = 10 cards(11) = 10 cards(12) = 10 cards(13) = 1 cards(14) = 11 TRISA = 255 ' Set PORTA to all input ADCON1 = 2 ' PORTA is analog randomCard var byte randomCard = 0 randomCardValue var byte randomCardValue = 0 ' DEALER AND PLAYERS dealerHiddenCard var byte dealerHiddenCard = 0 j VAR BYTE j = 0 dealerTotal var byte dealerTotal = 0 dealerCardTotal var byte dealerCardTotal = 0 playerTotal var byte playerTotal = 0 playerCardTotal var byte playerCardTotal = 0 '********************************************************** ' MAIN METHOD AND SUBROUTINES ***************************** '********************************************************** PAUSE 500 LCDOUT $FE, 1, "Play ITP Blackjack" 'write dealer and player total to screen PAUSE 2000 main: ' *** BEGIN NEW GAME IF (buttonNewGame = 1) THEN GOSUB newGame buttonNewGame = 0 ENDIF ' *** HIT PLAYER IF (buttonHitPlayer = 1) THEN GOSUB hitPlayer IF (playerTotal > 21) THEN GOSUB writeScore GOSUB dealerWins ENDIF IF (playerTotal < 21) and (playerCardTotal < 5) THEN GOSUB writeDealerHiddenCard ENDIF IF (playerTotal == 21) or (playerCardTotal == 5) THEN GOSUB writeDealerHiddenCard buttonPlayerStayHitDealer = 1 ENDIF GOSUB writeDealerHiddenCard buttonHitPlayer = 0 ENDIF ' *** HIT DEALER IF (buttonPlayerStayHitDealer = 1) THEN IF (dealerTotal < 17) OR (dealerTotal < playerTotal) AND (dealerTotal < 21) THEN ' get 3rd dealer card GOSUB playerStayHitDealer GOSUB writeScore IF (dealerTotal < 17) OR (dealerTotal < playerTotal) AND (dealerTotal < 21) THEN ' get 4th dealer card GOSUB playerStayHitDealer GOSUB writeScore IF (dealerTotal < 17) OR (dealerTotal < playerTotal) AND (dealerTotal < 21) THEN ' get 5th dealer card GOSUB playerStayHitDealer GOSUB writeScore IF (dealerTotal < 17) OR (dealerTotal < playerTotal) AND (dealerTotal < 21) THEN ' get 5th dealer card GOSUB playerStayHitDealer GOSUB writeScore ENDIF ENDIF ENDIF ENDIF IF (dealerTotal > 21) or (dealerTotal < playerTotal) and (dealerCardTotal < 5) THEN GOSUB writeScore GOSUB playerWins ENDIF IF (dealerCardTotal == 5) or (dealerTotal >= playerTotal) and (dealerTotal <= 21) or (dealerTotal == 21) THEN GOSUB writeScore GOSUB dealerWins ENDIF buttonPlayerStayHitDealer = 0 ENDIF GOTO MAIN ' SUBROUTINE NEW GAME *** ************************************ newGame: LCDOUT $FE, 1, "Starting New Game" PAUSE 2000 dealerTotal = 0 dealerHiddenCard = 0 j = 0 playerTotal = 0 GOSUB hitPlayer GOSUB writeDealerHiddenCard GOSUB playerStayHitDealer GOSUB writeDealerHiddenCard2 GOSUB hitPlayer GOSUB writeDealerHiddenCard2 GOSUB playerStayHitDealer IF (dealerTotal == 21) THEN GOSUB writeScore GOSUB dealerWins ENDIF GOSUB writeDealerHiddenCard RETURN ' SUBROUTINE HIT PLAYER ************************************** hitPlayer: LCDOUT $FE, 1, "Hit Player ..." PAUSE 2000 ADCIN 0, randomCard ' Read channel 0 to randomCard 'randomly pick one remaining card value from one of the arrays randomCard = randomCard // 14 'access array value at position indicated by randomCard to get randomCardValue randomCardValue = cards(randomCard) playerTotal = playerTotal + randomCardValue playerCardTotal = playerCardTotal + 1 RETURN ' SUBROUTINE PLAYER STAY / HIT DEALER ************************ playerStayHitDealer: LCDOUT $FE, 1, "Hit Dealer ..." PAUSE 2000 ADCIN 0, randomCard ' Read channel 0 to randomCard 'randomly pick one remaining card value from one of the arrays randomCard = randomCard // 14 'access array value at position indicated by randomCard to get randomCardValue randomCardValue = cards(randomCard) dealerTotal = dealerTotal + randomCardValue if (j = 1) then dealerHiddenCard = randomCardValue endif j = j + 1 dealerCardTotal = dealerCardTotal + 1 RETURN ' SUBROUTINE DEALER WINS ************************************ dealerWins: LCDOUT $FE, 1, "Dealer Wins!" PAUSE 2500 GOSUB gameOver RETURN ' SUBROUTINE PLAYER WINS ************************************* playerWins: LCDOUT $FE, 1, "Player Wins!" PAUSE 2000 GOSUB gameOver RETURN ' SUBROUTINE GAME OVER *************************************** gameOver: GOSUB writeScore GOSUB writeGameOver GOSUB writeScore GOSUB writeGameOver GOSUB writeScore buttonNewGame = 0 buttonHitPlayer = 0 buttonPlayerStayHitDealer = 0 RETURN ' SUBROUTINE WRITE DEALER HIDDEN CARD ************************** writeDealerHiddenCard: LCDOUT $FE, 1, "Dealer:", #dealerHiddenCard, " Player:", #playerTotal 'write dealer and player total to screen pause 1000 return ' SUBROUTINE WRITE DEALER HIDDEN CARD ************************** writeDealerHiddenCard2: LCDOUT $FE, 1, "Dealer:X", " Player:", #playerTotal 'write dealer and player total to screen pause 1000 return ' SUBROUTINE WRITE SCORE *************************************** writeScore: LCDOUT $FE, 1, "Dealer:", #dealerTotal, " Player:", #playerTotal 'write dealer and player total to screen pause 1000 return ' SUBROUTINE WRITE GAME OVER *********************************** writeGameOver: LCDOUT $FE, 1, "Game Over" 'write dealer and player total to screen pause 750 return