最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

shell實現貪吃蛇的示例代碼

 更新時間:2023年05月09日 09:42:47   作者:不識君  
本文主要介紹了shell實現貪吃蛇的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

這是幾年前剛接觸shell,用bash shell寫的一個貪吃蛇。剛才看見了,試了一下之前寫的代碼,在mac os上效果不在理想,放到linux服務器,看起來運行著還行。

給大家再分享一下。

下面是我當時發(fā)的時候寫的背景信息,我就不改了,直接粘過來了。

背景

最近想系統(tǒng)看下base shell的基本語法知識,可是看了這些if else之后還是不知道做什么就想到寫了個貪吃蛇,我還以為我是第一個想到用shell寫貪吃蛇的呢,可是后來看到已經有人寫過了,不過我也是懶的看別人代碼的人,所以就用自己的思路實現了下,熟練下這些基本的shell語法。

寫這個重點是想練習下shell語法,所以貪吃蛇的實現算法倒不是重點,況且以前大學的時候各類小游戲用什么語言都寫過,這些小算法如果不考慮性能確實沒什么意思。

當然了貪吃蛇最好用的數據結構自然是stack,可是我真的不想花時間考慮用shell實現一個棧,所以就用一個靜態(tài)的一維數組和一個動態(tài)的一維數組實現的(shell中的數組本來就是動態(tài)的,我這樣說只是說我的實現的效果是這樣)。

環(huán)境

win10內嵌的Linux beta版本(ubuntu14.0)帶的bash

如果有小伙伴復制下面代碼跑不動,請考慮下運行環(huán)境。

源碼

下面的中文注釋是剛才添加的,用的這個bash是不支持中文的,我的英文真的比較爛,所以剛才把中文注釋加了下

玩的時候使用上下左右鍵就行(本想用hjkl這四鍵控制上下左右的,覺得不太習慣)

主要思路就是:貪吃蛇運行界面使用一個后臺進程,用另一個進程來監(jiān)聽輸入(我最初的想法是一個shell進程就行,在貪吃蛇運行中的等待時間來監(jiān)聽輸入,后來發(fā)現還有這種玩法,我就改用這種實現,通過傳遞一個信號來處理)

#! /bin/bash
#下面是游戲界面的寬和高
# the width
with=42
# the height
height=22
#這個是游戲運行區(qū)域
# area
area=(
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 9
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 9
)
#bool
false=0
true=1
#貪吃蛇的一些信息
#snake info
head=47
tail=45
originPos=(45 46 47)
snakeBody=2
snakeFood=3
curPos=(${originPos[*]})
#game logic val
speed=0.2
foodPos=50
left=2
right=-2
up=3
down=-3
moveDirection=$right
eat=$true
#game info
side=$$
main=$!
#這個是開始時的界面
#start show interface
function startShowInterface()
{
    seconds=$1
    printf "\e[1;42m"
    printf "******************************************\n"
    for ((i=0; i<10; i++))
    do
        printf "*                                        *\n"
    done
    printf "*******\e[1;31msnake start after: $seconds seconds\e[0m\e[1;42m*******\n"
    for ((i=0; i<10; i++))
    do
        printf "*                                        *\n"
    done
    printf "******************************************\n"
    printf "\e[0m"
}
#start show 
function startShow()
{
    seconds=1;
    while [[ $seconds -gt -1 ]];
    do
        clear;
        startShowInterface $seconds;
        sleep 1;
        let seconds--;
    done
}
startShow;
#這個是游戲顯示界面
# game main inteface
function gameMainInterface
{
    clear;
    pos=0
    echo -e "\e[1;42m"
    for data in ${area[@]};
    do
        case $data in
        [9])
            printf "\n"
        ;;
        [1])
            printf "#"
        ;;
        [0])
            printf " "
        ;;
        [$snakeBody])
            printf "\e[1;31m"
            if [[ $pos = $head ]]; then
                printf "@"
            else
                printf "*"
            fi
            printf "\e[0m\e[1;42m"
        ;;
        [$snakeFood])
            printf "\e[1;34m&\e[0m\e[1;42m"
        ;;
        esac
        let pos++
    done
    echo -e "\e[0m"
}
#initinal snake body and pos
function initSnake()
{
    for data in ${originPos[@]};
    do
        area[$data]=$snakeBody
    done
}
initSnake;
#繪制貪吃蛇
#draw snake
function drawSnake()
{
    for data in ${originPos[@]};
    do
        area[$data]=0
    done
    for data in ${curPos[@]};
    do
        area[$data]=$snakeBody
    done
}
#隨機生成食物位置
#generate food
function generateFood()
{
    if [[ $eat = $false ]]; then
        return
    fi
    done=$false
    while [[ $done = $false ]];
    do
        newFoodPos=$(( RANDOM%$(( $(( $with-1 ))*$(( $height-1 )) )) ))
        [[ ${area[$newFoodPos]} = 0 ]] && area[$foodPos]=0 && foodPos=$newFoodPos && (( area[$foodPos]=$snakeFood )) && done=$true && eat=$false
    done
}
#貪吃蛇移動的算法,用的一維數組,我也就這樣來實現了
#move
function snakeMove()
{
    originPos=(${curPos[*]})
    length=${#curPos[*]}
    head=${curPos[$(( $length-1 ))]}
    case $moveDirection in
    $left)
        let head--
        [[ $(( $(( $head-2 ))%$with )) -eq 0 ]] && kill -35 $side
    ;;
    $right)
        let head++
        [[ $(( $head%$with )) -eq 0 ]] && kill -35 $side
    ;;
    $up)
        let head=head-with
        let head--
        [[ $head -lt $with ]] && kill -35 $side
    ;;
    $down)
        let head=head+with
        let head++
        [[ $head -gt $(( $with*$(( $height-1 )) )) ]] && kill -35 $side
    ;;
    esac
    if [[ $head -eq $foodPos ]];    then
        curPos[length]=$head
        eat=$true
    else
        for ((i=0; i<$((length-1)); i++));
        do
            curPos[i]=${curPos[$((i+1))]}
        done
        curPos[$((length-1))]=$head
    fi
}
#游戲運行的進程,游戲主邏輯都在這里了
#main interface
function mainInterface
{
    trap "moveDirection=$left" 36
    trap "moveDirection=$right" 37
    trap "moveDirection=$up" 38
    trap "moveDirection=$down" 39
    run=$true
    while [[ $run -eq $true ]];
    do
        generateFood;
        snakeMove;
        drawSnake;
        clear;
        gameMainInterface;
        sleep $speed
    done
}
mainInterface &
main=$!
# move snake
function moveDirectionUpdate()
{
    if [[ $(( $1+$2 )) -eq 0 || $1 -eq $2 ]];then   
        return;
    fi
    case $2 in
    $left)
        kill -36 $main
    ;;
    $right)
        kill -37 $main
    ;;
    $up)
        kill -38 $main
    ;;
    $down)
        kill -39 $main
    ;;
    esac
}
#監(jiān)聽上下左右鍵的輸入
#watch input
function watchInput()
{
    curDirection=$left
    preDirection=$curDirection
    while :;
    do
        read -s -n 1 op;
        [[ $op = "q" ]] && kill -9 $! && return;
        [[ $op = "A" ]] && preDirection=$curDirection && curDirection=$up && moveDirectionUpdate $preDirection $curDirection;
        [[ $op = "B" ]] && preDirection=$curDirection && curDirection=$down && moveDirectionUpdate $preDirection $curDirection;
        [[ $op = "C" ]] && preDirection=$curDirection && curDirection=$right && moveDirectionUpdate $preDirection $curDirection;
        [[ $op = "D" ]] && preDirection=$curDirection && curDirection=$left && moveDirectionUpdate $preDirection $curDirection;
    done
}
watchInput;
#game over
function gameOver()
{
    kill -9 $main
    echo "game over."
}
trap "gameOver" 35

到此這篇關于shell實現貪吃蛇的示例代碼的文章就介紹到這了,更多相關shell 貪吃蛇內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • linux中ps -ef和ps -aux的區(qū)別

    linux中ps -ef和ps -aux的區(qū)別

    ps -ef和ps -aux均為Linux中的ps命令,是Process Status的縮寫,ps命令用來列出系統(tǒng)中當前運行的那些進程,這篇文章主要介紹了linux中ps -ef和ps -aux的區(qū)別,需要的朋友可以參考下
    2023-10-10
  • Linux/Nginx如何查看搜索引擎蜘蛛爬蟲的行為

    Linux/Nginx如何查看搜索引擎蜘蛛爬蟲的行為

    本文給大家介紹Linux/Nginx如何查看搜索引擎蜘蛛爬蟲的行為,清楚蜘蛛的爬行情況對做SEO優(yōu)化有很大的幫助。需要的朋友通過本篇文章學習下吧
    2015-10-10
  • 詳解Linux 中五個重啟命令

    詳解Linux 中五個重啟命令

    這篇文章給大家介紹了linux中的五個重啟命名及重啟命令的具體說明,需要的朋友參考下吧
    2017-03-03
  • shell編程基礎之認識與學習BASH

    shell編程基礎之認識與學習BASH

    本文介紹下,shell基礎編程中有關bash的相關知識,有需要的朋友參考學習下
    2013-11-11
  • linux shell 中 2>&1的含義

    linux shell 中 2>&1的含義

    對于&1 更準確的說應該是文件描述符 1,而1 一般代表的就是STDOUT_FILENO,實際上這個操作就是一個dup2(2)調用
    2013-02-02
  • Linux shell知識點匯總

    Linux shell知識點匯總

    從程序員的角度來看, Shell本身是一種用C語言編寫的程序,從用戶的角度來看,Shell是用戶與Linux操作系統(tǒng)溝通的橋梁。用戶既可以輸入命令執(zhí)行,又可以利用 Shell腳本編程,完成更加復雜的操作。
    2015-08-08
  • 解決centos7 開機/etc/rc.local 不執(zhí)行的問題

    解決centos7 開機/etc/rc.local 不執(zhí)行的問題

    下面小編就為大家?guī)硪黄鉀Qcentos7 開機/etc/rc.local 不執(zhí)行的問題。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • 利用shell獲取指定日期前N天的日期

    利用shell獲取指定日期前N天的日期

    最近因為項目的需要對比2015年10月的數據,因為一年來的數據經過了很多次調整和處理,遇到的最直接的問題是很多數據需要重新計算。只好寫腳本刷數據。在準備腳本的過程中,就需要根據給定的日期處理數據,所以就有了這篇文章,下面有需要的朋友們一起學習學習。
    2016-11-11
  • Linux shell 獲得字符串所在行數及位置的方法

    Linux shell 獲得字符串所在行數及位置的方法

    這篇文章主要介紹了Linux shell 獲得字符串所在行數及位置的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • linux下實現ftp自動備份shell腳本

    linux下實現ftp自動備份shell腳本

    ftp命令把遠程計算機上的文件傳輸到本地計算機時,需要和用戶交互。怎樣使交互過程自動化呢
    2013-01-01

最新評論

綦江县| 香港| 丹东市| 土默特右旗| 侯马市| 杭州市| 衡东县| 诸城市| 拉孜县| 靖远县| 福海县| 瑞安市| 涪陵区| 洱源县| 兴仁县| 达拉特旗| 西盟| 略阳县| 神池县| 龙川县| 丰都县| 翼城县| 合山市| 文水县| 阳朔县| 浦东新区| 奈曼旗| 年辖:市辖区| 乌拉特前旗| 曲水县| 青神县| 汾阳市| 息烽县| 化隆| 杭锦后旗| 福贡县| 阳原县| 广德县| 洛南县| 镇沅| 阜城县|