`
Marshal_R
  • 浏览: 130048 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

井字游戏(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高级编程(中文高清版).pdf

    SHELL高级编程(中文高清版).pdf sed+awk加强+基础

    Shell高级编程(中文版)

    Shell高级编程(中文版) 毫无疑问,UNIX/Linux 最重要的软件之一就是 shell,目前最流行的 shell 被称为 Bash(Bourne Again Shell), 几乎所有的 Linux 和绝大部分的 UNIX 都可以使用 Bash。作为系统与用户之间的交互...

    shell高级编程实例

    shell高级编程实例!

    bash shell高级编程

    bash shell高级编程

    shell高级编程(文档+源码).zip

    shell高级编程(文档+源码) shell高级编程(带365个实例源码) shell高级编程(含365个经典实例源码)

    shell高级编程经典教程

    shell高级编程经典教程 很经典的shell学习资料

    shell高级编程 shell的经典教程

    shell 是操作系统的最外层。shell 合并编程语言以控制进程和文件,以及启动和控制其它程序。shell 通过提示您输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出来管理您与操作系统之间的交互。  ...

    SHell高级编程技术

    Shell高级编程技术,常规shell脚本写法,shell项目实战 100+命令讲解,以及运维技术,还有运维开发技术

    shell 高级编程,是更进一步学习shell必备

    shell 高级编程,是更进一步学习shell必备,掌握shell知识是linux程序员必须的技能,书中有实例说明,引导你进入Shell精彩世界!好好看看吧,只要对Linux有了解的技术人员,就明白学会Shell的重要性!

    shell高级编程实例(365例子)

    Shell脚本高级编程教程,希望对你有所帮助。 Example 10-23. Using continue N in an actual task: 1 # Albert Reiner gives an example of how to use "continue N": 2 # -------------------------------------...

    Shell高级编程实战视频.zip

    1-Shell编程课前思想-我一定要学好shell编程 2-学好Shell编程需要的必备基础 3-Shell脚本介绍及第一个规范Shell脚本说明 4-Shell编程的作用和地位 5-Shell语言的种类介绍 6-Shell的条件表达式知识初步介绍实践 7-...

    老男孩Linux shell 高级编程

    要介绍了shell的相关知识教程,如shell编程需要的基础知识储备、shell脚本概念介绍及第一个脚本案例、shell脚本基础知识-作用地位-比其他语言优势、建立一个规范的shell脚本、执行shell脚本的多种方法及重要区别精讲...

    高级shell编程指南

    高级shell编程指南

    shell 高级bash脚本编程指导中文翻译版本

    shell 高级bash脚本编程指导 中文翻译版本 shell 高级bash脚本编程指导 中文翻译版本

    Linux Shell高级技巧实战总结

    Linux Shell高级技巧实战总结 一、将输入信息转换为大写字符后再进行条件判断 二、为调试信息设置输出级别 三、判断参数是否为数字 四、判断整数变量的奇偶性 五、将Shell命令赋值给指定变量,以保证脚本的移植性 六...

    shell 高级编程 源代码

    shell 高级编程 春敏杨 毅 黄 翻译 一本很不错的书

    SSH Secure Shell绿色版 经典版

    SSH Secure Shell绿色版 经典版,可以保存快捷访问地址

    shell高级命令学习

    advanced_bash.pdf bash_freshman.pdf crontab.pdf

Global site tag (gtag.js) - Google Analytics