井字游戏(shell高级版)

井字游戏(shell高级版)

 

    大家小时候大概都玩过井字游戏,就是双方在九宫格里面轮流下棋 ,先构成三点一线(横线、竖线或者斜线)的一方取胜。有点经验的人都知道,这样简单的游戏根本是不分胜负的,除非就是某一方特别粗心,才会让你有获胜的机会。

 

 

    于是,我们研究了一种新的井字游戏,即所谓的高级版。棋盘为 9×9 的 81宫格,分为9个九宫格。

 

    取胜规则:

        1、在任意一个九宫格中先构成三点一线(横线、竖线或者斜线)的一方取胜。

        2、轮到对方下棋且对方无子可下,则本方获胜。

 

    下子规则:

        1、从左到右、从上到下分别编号9个九宫格为1—9,则先下棋者只能在第5九宫格范围内下子。

        2、若对手在第 i 九宫格的第 j 位置处下棋,则紧接着本方必须在第 j 九宫格范围内下棋。

 

 

    游戏是shell脚本写成的,测试环境为bash,wsad控制方向键移动,f、空格、回车、Tab为下棋动作,x退出游戏,n开始新的游戏。详细可以研究一下代码,十分简单的。

 

#! /bin/bash
#-----------------------------------
#    Name: 井字游戏(高级版)
#    Version: 1.0
#    Type: Game
#    Date: 2015-02-26
#    Author: ruanshihai
#    Email: 1103530380@qq.com
#-----------------------------------

#---------------Define--------------
ECHO="echo -ne"
ESC="\033["
OK=0
FALSE=1

#--------------Variable--------------
#color
NULL=0
BLACK=30
RED=31
GREEN=32
YELLOW=33
BLUE=34
PURPLE=35
CYAN=36
WHITE=37

#background color
BBLACK=40
BRED=41
BGREEN=42
BYELLOW=43
BBLUE=44
BPURPLE=45
BCYAN=46
BWHITE=47

REV=7

BP=5
SP=5
OBP=5
OSP=5
SYMBOL=("x" "o")
Player=0

#--------------Function--------------
function SttyInit() {
	stty_save=$(stty -g) #backup stty

	clear
	trap "GameExit;" 2 15
	stty -echo

	$ECHO "${ESC}?25l" #hidden cursor
	
	return $OK
}

function CalcXY() {
    local TBP=$1 TSP=$2 Type=$3
    local X=0 Y=0
    
    case $Type in
    [xX])
        ((X = (TBP-1)%3*11+ ((TSP-1)%3+1)*3-1))
        echo $X
        ;;
    [yY])
        ((Y = (TBP-1)/3*4 + (TSP-1)/3+1))
        echo $Y
        ;;
    esac
    
    return $OK
}

function DrawPoint() {
    local Type=$3
    local X=$(CalcXY $1 $2 x) Y=$(CalcXY $1 $2 y)
    local OX=$(CalcXY $OBP $OSP x) OY=$(CalcXY $OBP $OSP y)
    local sign=${SIGN[1$1$2]}
    local osign=${SIGN[1$OBP$OSP]}
	
	[[ "$sign" == "${SYMBOL[0]}" ]] && sign="${ESC}${RED}m${SYMBOL[0]}"; 
	[[ "$sign" == "${SYMBOL[1]}" ]] && sign="${ESC}${CYAN}m${SYMBOL[1]}"
	[[ "$osign" == "${SYMBOL[0]}" ]] && osign="${ESC}${RED}m${SYMBOL[0]}"
	[[ "$osign" == "${SYMBOL[1]}" ]] && osign="${ESC}${CYAN}m${SYMBOL[1]}"
	
	case $Type in
	"CUR")
		$ECHO "${ESC}${OY};${OX}H${ESC}${NULL}m${osign}"
		$ECHO "${ESC}${BYELLOW}m${ESC}${Y};${X}H${sign}${ESC}${NULL}m"
	    ;;
	"0")
		$ECHO "${ESC}${BYELLOW}m${ESC}${Y};${X}H${sign}${ESC}${NULL}m"
	    ;;
	"1")
		$ECHO "${ESC}${BYELLOW}m${ESC}${Y};${X}H${sign}${ESC}${NULL}m"
	    ;;
	esac	

	return $OK
}

function DrawInit() {
    for ((i=0; i<3; i++))
    do
        for ((j=0; j<3; j++))
        do
            echo "[ ][ ][ ]  [ ][ ][ ]  [ ][ ][ ]"
        done
        [[ $i -lt 2 ]] && echo
    done
    
    DrawPoint $BP $SP CUR
    
    return $OK
}

function DataInit() {
    for ((i=0; i<=9; i++))
    do
        for ((j=0; j<=9; j++))
        do
            SIGN[1$i$j]=" "
        done
    done
    
    return $OK
}

function Help() {
	msg="Move:w s a d  Flag:f  NewGame:n  Exit:x   --CopyRight--  2015-02-26  ruanshihai "
	$ECHO "${ESC}${REV};${RED}m${ESC}24;1H${msg}${ESC}${NULL}m"

	return $OK
}

function PMsg() {
	local title="$1" content="$2" greeting="$3"

        $ECHO "${ESC}${RED}m"
        $ECHO "${ESC}15;20H ------------------------------------------- "
        $ECHO "${ESC}16;20H|         ======>$title<======           |"
        $ECHO "${ESC}17;20H|         $content          |"
        $ECHO "${ESC}18;20H|         ======>$greeting<======           |"
        $ECHO "${ESC}19;20H ------------------------------------------- "
        $ECHO "${ESC}${NULL}m"

	return $OK
}

function Info() {
    $ECHO "${ESC}13;0H${ESC}${RED}m玩家0: ${SYMBOL[0]}  玩家1: ${SYMBOL[1]}  玩家${Player}请下子${ESC}0m"
    
    return $OK
}

function Init() {
    DataInit
    SttyInit
    DrawInit
    Help
    Info
    
    return $OK
}

function CurMov() {
	local direction=$1

	OBP=$BP
	OSP=$SP

	case $direction	in
	"UP")
	    [[ $SP > 3 ]] && ((SP-=3));;
	"DOWN")
	    [[ $SP < 7 ]] && ((SP+=3));;
	"LEFT")
	    [[ $(((SP-1)%3)) > 0 ]] && ((SP-=1));;
	"RIGHT")
	    [[ $(((SP-1)%3)) < 2 ]] && ((SP+=1));;
	esac

	if [[ $OBP != $BP || $OSP != $SP ]]
	then
	    DrawPoint $BP $SP CUR
	fi

	return $OK
}

function CheckGame() {
    local res=""
    
    [[ "${SIGN[1${BP}1]}" == "${SIGN[1${BP}2]}" &&  "${SIGN[1${BP}2]}" == "${SIGN[1${BP}3]}" &&  "${SIGN[1${BP}3]}" != " " ]] && res="OK"
    [[ "${SIGN[1${BP}4]}" == "${SIGN[1${BP}5]}" &&  "${SIGN[1${BP}5]}" == "${SIGN[1${BP}6]}" &&  "${SIGN[1${BP}6]}" != " " ]] && res="OK"
    [[ "${SIGN[1${BP}7]}" == "${SIGN[1${BP}8]}" &&  "${SIGN[1${BP}8]}" == "${SIGN[1${BP}9]}" &&  "${SIGN[1${BP}9]}" != " " ]] && res="OK"
    
    [[ "${SIGN[1${BP}1]}" == "${SIGN[1${BP}4]}" &&  "${SIGN[1${BP}4]}" == "${SIGN[1${BP}7]}" &&  "${SIGN[1${BP}7]}" != " " ]] && res="OK"
    [[ "${SIGN[1${BP}2]}" == "${SIGN[1${BP}5]}" &&  "${SIGN[1${BP}5]}" == "${SIGN[1${BP}8]}" &&  "${SIGN[1${BP}8]}" != " " ]] && res="OK"
    [[ "${SIGN[1${BP}3]}" == "${SIGN[1${BP}6]}" &&  "${SIGN[1${BP}6]}" == "${SIGN[1${BP}9]}" &&  "${SIGN[1${BP}9]}" != " " ]] && res="OK"
    
    [[ "${SIGN[1${BP}1]}" == "${SIGN[1${BP}5]}" &&  "${SIGN[1${BP}5]}" == "${SIGN[1${BP}9]}" &&  "${SIGN[1${BP}9]}" != " " ]] && res="OK"
    [[ "${SIGN[1${BP}3]}" == "${SIGN[1${BP}5]}" &&  "${SIGN[1${BP}5]}" == "${SIGN[1${BP}7]}" &&  "${SIGN[1${BP}7]}" != " " ]] && res="OK"
    
    if [ $res ]; then
        echo $res
        return $OK
    fi
    
    for ((i=1; i<=9; i++))
    do
        if [ "${SIGN[1$SP$i]}" = " " ]; then
            break;
        fi
    done
    
    if [ $i -gt 9 ]; then
        res="OK"
    fi
    echo $res
    
    return $OK
}

function Flag() {
    local sign=${SIGN[1$BP$SP]}
    local status
    
    if [ "$sign" = " " ]; then
        SIGN[1$BP$SP]=${SYMBOL[$Player]}
        DrawPoint $BP $SP $Player
        status=$(CheckGame)
        if [ "$status" = "OK" ]; then
            GameOver " 玩家"$Player" Win "
        fi
        
        OBP=$BP
        OSP=$SP
        BP=$SP
        SP=5
        DrawPoint $BP $SP CUR
        ((Player=1-Player))
        
        Info
    fi
    
    return $OK
}

function GameOver() {
	local key msgtitle=$1

	PMsg "$msgtitle" "Do you want replay? <y/n> " " Thank You "
	while read -s -n 1 key
	do
		case $key in
		[yY])	exec $(dirname $0)/$(basename $0);;
		[nN])	GameExit;;
		*)	continue;;
		esac
	done

	return $OK	
}

function GameExit() {
	stty $stty_save
	stty echo
	clear
	trap 2 15
	$ECHO "${ESC}?25h${ESC}0;0H${ESC}0m"

	exit $OK
}

function Main() {
    local key
    
    Init
    
    while read -s -n 1 key
	do
		case $key in
		[wW])   CurMov UP;;
		[sS])   CurMov DOWN;;
		[aA])   CurMov LEFT;;
		[dD])   CurMov RIGHT;;
		[nN])   exec $(dirname $0)/$(basename $0);;
		[xX])   GameExit;;
		[fF])   Flag;;
		   *)   if [ -z $key ]; then Flag; fi
		esac
	done

	return $OK
}

#---------------Main-----------------
Main

 

 

你可能感兴趣的:(游戏,shell,井字游戏)