`
Marshal_R
  • 浏览: 132505 次
  • 性别: 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高级编程(文档+源码).zip

    《Shell高级编程》是一本深入探讨Unix/Linux系统中Shell脚本编程技术的资源包,包含文档和源码两部分。Shell脚本是Unix/Linux环境中的一种重要工具,它允许用户通过命令行界面执行一系列自动化任务,极大地提高了...

    Shell高级编程(中文版)

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

    shell高级命令学习

    本主题将深入探讨“shell高级命令学习”,结合提供的资源,我们将关注bash shell的基础和进阶知识,以及如何利用crontab进行任务调度。 首先,我们来了解bash shell。`bash`是Bourne-Again SHell的缩写,它是GNU...

    shell高级编程 shell的经典教程

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

    SHell高级编程技术

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

    bash shell高级编程

    Bash Shell高级编程涉及到一系列技巧和功能,可以帮助用户提高效率,实现自动化任务。以下是一些关于Bash Shell高级编程的重要知识点: 1. **命令别名**:可以通过定义别名来简化常用命令,如`alias ll='ls -l'`,...

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

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

    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脚本的多种方法及重要区别精讲...

    Linux Shell高级技巧实战总结

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

    老男孩shell高级编程实战视频百度云盘分享

    根据提供的文件信息,我们可以推断出这是一份关于“老男孩shell高级编程实战视频”的资源分享,主要聚焦于Shell编程的高级应用与实践。接下来,我们将深入探讨与该主题相关的几个核心知识点,包括Shell编程的基本...

    shell 高级编程 源代码

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

    SHELL高级编程

    ### SHELL高级编程:解锁Unix的强大潜能 #### 引言:理解SHELL脚本的核心价值 SHELL,作为Unix和类Unix系统中的命令解释器,不仅充当着操作系统内核与用户之间的桥梁,还是一种功能强大的编程语言。SHELL脚本,...

    shell高级编程中英版

    《Shell高级编程》是一本深入探讨这一主题的经典著作,对于想要提升Shell脚本编写技能的IT从业者来说,无疑是一份宝贵的资源。这本书不仅提供了中文版,还附带英文版,方便不同语言背景的学习者理解,同时包含源代码...

    shell高级编程(包括脚本示例)

    **Shell高级编程**是Linux系统中的重要组成部分,它是一种命令解释器,同时也是用户与操作系统交互的接口。在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 # -------------------------------------...

    UNIX和LINUX环境Shell高级编程.rar

    UNIX和LINUX环境Shell高级编程.rar

Global site tag (gtag.js) - Google Analytics