iis服务器助手广告广告
返回顶部
首页 > 资讯 > 服务器 >shell实现贪吃蛇的示例代码
  • 391
分享到

shell实现贪吃蛇的示例代码

shell贪吃蛇 2023-05-12 05:05:45 391人浏览 泡泡鱼
摘要

目录前言背景环境源码前言这是几年前刚接触shell,用bash shell写的一个贪吃蛇。刚才看见了,试了一下之前写的代码,在Mac os上效果不在理想,放到linux服务器,看起来运行着还行。给大家再分享一下。下面是我当

目录


前言

这是几年前刚接触shell,用bash shell写的一个贪吃蛇。刚才看见了,试了一下之前写的代码,在Mac os上效果不在理想,放到linux服务器,看起来运行着还行。

给大家再分享一下。

下面是我当时发的时候写的背景信息,我就不改了,直接粘过来了。


背景

最近想系统看下base shell的基本语法知识,可是看了这些if else之后还是不知道做什么就想到写了个贪吃蛇,我还以为我是第一个想到用shell写贪吃蛇的呢,可是后来看到已经有人写过了,不过我也是懒的看别人代码的人,所以就用自己的思路实现了下,熟练下这些基本的shell语法。

写这个重点是想练习下shell语法,所以贪吃蛇的实现算法倒不是重点,况且以前大学的时候各类小游戏用什么语言都写过,这些小算法如果不考虑性能确实没什么意思。

当然了贪吃蛇最好用的数据结构自然是stack,可是我真的不想花时间考虑用shell实现一个栈,所以就用一个静态的一维数组和一个动态的一维数组实现的(shell中的数组本来就是动态的,我这样说只是说我的实现的效果是这样)。


环境

win10内嵌的Linux beta版本(ubuntu14.0)带的bash

如果有小伙伴复制下面代码跑不动,请考虑下运行环境。


源码

下面的中文注释是刚才添加的,用的这个bash是不支持中文的,我的英文真的比较烂,所以刚才把中文注释加了下

玩的时候使用上下左右键就行(本想用hjkl这四键控制上下左右的,觉得不太习惯)

主要思路就是:贪吃蛇运行界面使用一个后台进程,用另一个进程来监听输入(我最初的想法是一个shell进程就行,在贪吃蛇运行中的等待时间来监听输入,后来发现还有这种玩法,我就改用这种实现,通过传递一个信号来处理)

#! /bin/bash
#下面是游戏界面的宽和高
# the width
with=42
# the height
height=22
#这个是游戏运行区域
# 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;riginPos[@]};
    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
}
#监听上下左右键的输入
#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 贪吃蛇内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们! 

--结束END--

本文标题: shell实现贪吃蛇的示例代码

本文链接: https://www.lsjlt.com/news/202057.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • shell实现贪吃蛇的示例代码
    目录前言背景环境源码前言这是几年前刚接触shell,用bash shell写的一个贪吃蛇。刚才看见了,试了一下之前写的代码,在MAC os上效果不在理想,放到linux服务器,看起来运行着还行。给大家再分享一下。下面是我当...
    99+
    2023-05-12
    shell 贪吃蛇
  • Java实现贪吃蛇游戏的示例代码
    目录项目演示项目实战1. 游戏的主启动类2. 游戏的面板3. 数据中心4. 绘制静态面板5. 绘制静态小蛇6. 绘制动态小蛇7. 设置游戏状态8. 让蛇动起来9. 绘制食物布局10....
    99+
    2024-04-02
  • Matlab实现贪吃蛇小游戏的示例代码
    由于老师说如果拿MATLAB制作出游戏或者有趣的动画的话。。 平时成绩可以拿满分 于是。。开始尝试制作各种matlab小游戏 最初通过Alex的贪吃蛇学到了一些东西,然后制作了一个类...
    99+
    2024-04-02
  • Python代码实现贪吃蛇小游戏的示例
    这篇文章给大家分享的是有关Python代码实现贪吃蛇小游戏的示例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。图示基本准备首先,我们需要安装pygame库,小编通过pip install pygame,很快就安装...
    99+
    2023-06-15
  • JavaScript贪吃蛇的实现代码
    本文实例为大家分享了JavaScript实现贪吃蛇的具体代码,供大家参考,具体内容如下 首先我们要确定贪吃蛇应有的功能 1.通过键盘的上下左右控制蛇的移动方向 2.边界判定,即蛇头超...
    99+
    2024-04-02
  • Python实现智能贪吃蛇游戏的示例代码
    目录前言基本环境配置实现效果实现代码前言 我想大家都玩过诺基亚上面的贪吃蛇吧,本文将带你一步步用python语言实现一个snake小游戏。 基本环境配置 版本:Python3 系统:...
    99+
    2024-04-02
  • Java实现贪吃蛇大作战小游戏的示例代码
    目录效果展示 项目介绍项目背景总体需求实现过程代码展示项目结构总结 大家好,今天尝试用swing技术写一个贪吃蛇大作战小游戏,供大家参考。  效果展示 ...
    99+
    2024-04-02
  • python 贪吃蛇代码
    import pygame from pygame.locals import * from sys import exit from pygame.color import THECOLORS import random imp...
    99+
    2023-01-31
    贪吃蛇 代码 python
  • C语言实现简易贪吃蛇游戏的示例代码
    目录前言一、构造小蛇二、小蛇的移动三、控制小蛇移动四、判断游戏失败五、吃食物增加长度六、完整代码前言 实现一个经典的小游戏——贪吃蛇,如图所示。读者可以先自己...
    99+
    2022-11-13
    C语言贪吃蛇游戏 C语言贪吃蛇 C语言 游戏
  • golang 手写贪吃蛇示例实现
    目录背景需求构思逻辑构思代码结构小结 背景 题主现在是php程序员, 学了一周的golang, 深刻的感受到了其特性的优雅及功能的强大, 为了增强熟练度, 决定来写个贪吃蛇来践行下....
    99+
    2024-04-02
  • Python代码之贪吃蛇
    Python贪吃蛇游戏的最简单代码: import pygame, sysfrom pygame.locals import *pygame.init()fpsClock = pygame.time.Clock()WINDOW = pyga...
    99+
    2023-10-21
    python
  • python贪吃蛇源代码
    import pygame, sys, random from pygame.locals import * pygame.init() mainClock = pygame.time.Clock() WINDOWWIDTH = 40...
    99+
    2023-01-31
    源代码 贪吃蛇 python
  • C语言实现简单的贪吃蛇游戏的示例代码
    目录运行效果代码一个简单的贪吃蛇游戏本来代码就不多,在保证可读性的情况下,很容易就控制在100以内了。 运行效果 代码 #include <Windows.h> #in...
    99+
    2023-01-12
    C语言实现贪吃蛇游戏 C语言贪吃蛇游戏 C语言贪吃蛇
  • Python快速实现简易贪吃蛇小游戏的示例代码
    贪吃蛇(也叫做贪食蛇)游戏是一款休闲益智类游戏,有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃蛋,从而使得蛇变得越来越长。  贪吃蛇游戏最初为单机模式,后...
    99+
    2024-04-02
  • QT实现贪吃蛇游戏代码详解
    目录一、新建一个Qt项目二、添加要用到的头文件三、写类声明信息四、对类函数的实现构造函数界面刷新随机奖励的生成移动绘图按键事件判断蛇身是否相撞五、结束一、新建一个Qt项目 新建Qt ...
    99+
    2024-04-02
  • C语言实现贪吃蛇游戏代码
    目录一、实现效果二、部分代码解释总结一、实现效果 键位:使用wasd四个键位来控制方向,按q键退出(注意在终用英文输入法实现键控) 规则:蛇每吃一个豆会得10分,同时身体边长、移速加...
    99+
    2024-04-02
  • C语言实现双人贪吃蛇游戏实例代码
    贪吃蛇双人小游戏,每局游戏两分钟,死亡则直接失败,若时间结束,则分高者获胜。   上源代码: ​ #include <stdio.h> #include <...
    99+
    2024-04-02
  • C语言实现贪吃蛇代码怎么写
    这是一个简单的C语言贪吃蛇游戏的代码示例: #include <stdio.h> #include <conio....
    99+
    2024-03-01
    C语言
  • c++贪吃蛇代码怎么写
    以下是一个简单的C++贪吃蛇游戏代码示例: #include <iostream> #include <conio...
    99+
    2024-03-05
    c++
  • Java实现贪吃蛇游戏代码怎么写
    以下是一个简单的Java实现贪吃蛇游戏的代码示例:```javaimport java.awt.*;import java.awt....
    99+
    2023-08-09
    Java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作