`
maosuhan
  • 浏览: 112314 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

用纯命令行编写贪吃蛇

    博客分类:
  • cc++
阅读更多

开发环境为linux+gcc+netbeans

本来我喜欢gvim但是实在不会调试c语言。于是转战netbeans,能很方便地调试,就是爽。

 

首先要说一下思路。就是多线程,一个线程负责逻辑和画图,一个线程监听按键。看一下线程创建的代码。

 

void * waitForKey(void *para) {
    while (1) {
        input = getch();
    }
}

pthread_t id; //声明一个linux线程,按键等待线程

 int ret;
    ret = pthread_create(&id, NULL, waitForKey, NULL);//创建线程
    if (ret != 0) {
        exit(1);
    }
 

我还用到了一个库,就是curses,这个好象是专门用来绘图ui用的。但是在/usr/include里面是没有的,要到网上去下

sudo apt-get install libncurses-dev

使用时的格式应该是这样

 

initscr();

do_some_drawing();

refresh();

endwin();

其中我用到的函数有move(x,y)是把光标定位在某行某列上。还有addStr(s)和addch(c)。是在光标处写字符串和写字符。

还有getch()等待用户按键。还有refresh(),将缓冲的addch阿还有addStr等等的绘图操作都输出到屏幕上。

 

此外还用到了usleep(int )函数这里的参数是 int型的,表示的是微秒数,1秒等于1000000微秒。这里的时间间隔是蛇每次移动时的间隔时间。

 

代码如下

#include<stdio.h>
#include <pthread.h>
#include <sys/time.h>
#include <curses.h>
#include <stdlib.h>

#define MAX_X 70   //场地宽
#define MAX_Y 20  //场地长
#define CORNER_X 4  //左上角x坐标
#define CORNER_Y 2   //左上角y坐标

struct point { 
    int x;
    int y;
};
struct point SnakeBody[50]; 
struct point food;

int Length = 4;  //初始蛇长
int life = 1;   //是否还活着
int input = 0;  //记录键盘按键的ascii
pthread_t id; //声明一个linux线程,按键等待线程


void FoodCheck();
void FoodProduce();
void Initializition();
void SnakeHeadMovement();
void DeathCheck();
void Paint();
void * waitForKey(void *);
void drawDot(int x, int y,char s);
void clearDot(int x, int y);
void end();


//主函数

int main(int argc, char** argv) {

    Initializition();
    while (life) {
        Paint();
        usleep(200000);
        SnakeHeadMovement();
        DeathCheck();
    }
    end();
    return 0;
}

void * waitForKey(void *para) {
    while (1) {
        input = getch();
    }
}

void end() {

    move(1, 0);
    addstr("Press any key to quit!");
    refresh();
    getch();
   endwin();
}


//食物的随机产生

void FoodProduce() {
    int superposition = 0;
    int i;
    srand(time(NULL));
    do {
        food.x = (rand() % ((MAX_X-2) / 2))*2+2;  //2 to MAX_X-2  and is 偶数
        food.y = rand() % (MAX_Y-1)+1;   //1 to MAX_Y-1
        for (i = 0; i < Length; i++) {
            if (food.x == SnakeBody[i].x && food.y == SnakeBody[i].y)
                superposition = 1;
        }
    } while (superposition); /*直到没有重合*/
}

//蛇身和食物的初始化 初始化的蛇身为4节长度

void Initializition() {
    initscr();//curses初始化

    int i;
    for (i = 3; i <= 6; i++) {//初始化蛇
        SnakeBody[6 - i].x = 4;
        SnakeBody[6 - i].y = i;
    }
    FoodProduce();
    int ret;
    ret = pthread_create(&id, NULL, waitForKey, NULL);//创建线程
    if (ret != 0) {
        exit(1);
    }

    for ( i = 0; i <= MAX_X; i+=2) {  //画围墙
        drawDot(i, 0,'*');
        drawDot(i, MAX_Y,'*');
    }

    for (i = 0; i <= MAX_Y; i++) {
        drawDot(0, i,'*');
        drawDot(MAX_X, i,'*');
    }

}

//蛇移动,依次从尾巴到头赋值
void SnakeBodyMovement() {
    int i;
    for (i = Length - 1; i > 0; i--) {
        SnakeBody[i].x = SnakeBody[i - 1].x;
        SnakeBody[i].y = SnakeBody[i - 1].y;
    }

}


void SnakeHeadMovement() {

    clearDot(SnakeBody[Length - 1].x, SnakeBody[Length - 1].y);
    int directionX, directionY; /*定义原本蛇前进的方向,可通过蛇头坐标减去蛇的第二部分*/
    int newX, newY;
    newX = SnakeBody[0].x;
    newY = SnakeBody[0].y;

    directionX = SnakeBody[0].x - SnakeBody[1].x;
    directionY = SnakeBody[0].y - SnakeBody[1].y;
    

   

    if (input == 'w' && directionY<=0) //不走回头路
        newY--;
    else if (input == 's' && directionY>=0 )
        newY++;
    else if (input == 'a' && directionX<=0)
        newX -= 2; /*因为字符高是宽的两倍*/
    else if (input == 'd' && directionX>=0)
        newX += 2;
    else {
        newX += directionX;
        newY += directionY;
    }
    FoodCheck(); 
    SnakeBodyMovement();
    SnakeBody[0].x = newX;
    SnakeBody[0].y = newY;

}
//判断是否吃到食物,以及吃到后长度变长还有产生新的食物

void FoodCheck() {
    if (food.x == SnakeBody[0].x && food.y == SnakeBody[0].y) {
        Length = Length + 1;
        FoodProduce();
    }
}
//判断是否死亡

void DeathCheck() {
    int i;
    if (SnakeBody[0].x <=1 || SnakeBody[0].x >= MAX_X  || SnakeBody[0].y <= 0 || SnakeBody[0].y >=MAX_Y)
        life = 0;
    for (i = 4; i < Length; i++)
        if (SnakeBody[0].x == SnakeBody[i].x && SnakeBody[0].y == SnakeBody[i].y)
            life = 0;
}

//排序和打印

void Paint() {
    int i = 0;

    drawDot(SnakeBody[i].x, SnakeBody[i].y,'@');
    for (i=1; i < Length; i++) {
        drawDot(SnakeBody[i].x, SnakeBody[i].y,'*');
    }
    drawDot(food.x, food.y,'$');
    clearDot(0, 0);
    refresh();//刷新画布
}

void drawDot(int x, int y,char s) {
    move(y+CORNER_Y, x+CORNER_X);
    addch(s);
}

void clearDot(int x, int y) {
    move(y+CORNER_Y, x+CORNER_X);
    addch(' ');
}

 

编译的时候的命令如下 gcc main.c -o main -lpthread -lcurses

 

 

 

 

分享到:
评论

相关推荐

    C++命令行版贪吃蛇小游戏

    1. **基本语法和数据结构**:包括变量、条件语句、循环、数组和结构体,这些都是编写贪吃蛇游戏的基础。 2. **函数的使用和定义**:头文件和实现文件分离,理解函数的声明和实现是关键。 3. **面向对象编程**:...

    贪吃蛇_贪吃蛇_

    通过编写这样的贪吃蛇游戏,初学者可以深入理解C语言的基础概念,并逐步提升到更高级的编程技巧,如数据结构和算法的应用。同时,它还能培养问题解决能力和逻辑思维能力,为后续的软件开发学习奠定基础。

    记事本编写的贪吃蛇

    1. **记事本编写**:通常,游戏开发使用的是专门的编程环境或IDE(集成开发环境),但这个项目选择使用记事本,这意味着代码是纯文本形式,没有图形化的代码编辑功能。这种方式展示了即使是最基础的文本编辑工具也能...

    ConsoleApplication1_C语言编写贪吃蛇_

    【标题】"ConsoleApplication1_C语言编写贪吃蛇_" 指的是一个使用C语言开发的、基于控制台的贪吃蛇游戏项目。这个项目可能是在Microsoft Visual Studio 2013(VS2013)这样的集成开发环境中创建的。C语言是一种底层...

    Linux下C语言编写贪吃蛇.zip

    在Linux环境下,使用C语言编写贪吃蛇游戏是一项有趣且具有挑战性的编程实践。这个项目不仅可以帮助你深入理解C语言的基础知识,还能让你熟悉Linux操作系统和命令行界面。以下是关于这个主题的一些关键知识点: 1. *...

    C++编写的贪吃蛇源码

    总结,这个“C++编写的贪吃蛇源码”项目涵盖了C++编程基础、面向对象设计、终端图形绘制、数据库管理以及使用Visual Studio 2010进行项目开发等多个方面。通过学习和分析源码,开发者不仅可以提升C++编程技能,还能...

    C 语言编写的贪吃蛇

    在计算机编程领域,用C语言编写贪吃蛇游戏是一项常见的学习任务,它能帮助初学者更好地理解基本的编程概念和控制流程。本文将深入探讨如何使用C语言实现贪吃蛇游戏,以及其中涉及到的关键技术。 一、C语言基础 ...

    纯C语言俄罗斯和贪吃蛇游戏源代码

    在本资源中,我们主要关注的是两个经典的计算机游戏——俄罗斯方块和贪吃蛇的源代码,它们都是用纯C语言编写的。C语言是一种强大的、底层的编程语言,广泛用于系统开发、软件工程和游戏编程等领域。对于初学者和...

    Python贪吃蛇游戏编写代码

    最近在学Python,想做点什么来练练手,命令行的贪吃蛇一般是C的练手项目,但是一时之间找不到别的,就先做个贪吃蛇来练练简单的语法。 由于Python监听键盘很麻烦,没有C语言的kbhit(),所以这条贪吃蛇不会自己动,...

    用C#贪吃蛇,用C#贪吃蛇.用C#贪吃蛇

    虽然贪吃蛇游戏可以用命令行实现,但使用Windows Forms或WPF库创建图形界面可以提供更好的用户体验。这些库允许我们创建窗口、画布和事件处理器,以便在屏幕上绘制蛇、食物和边界。 5. **多线程**: 为了实现流畅...

    基于c语言在linux下贪吃蛇项目

    本项目"基于C语言在Linux下贪吃蛇项目",旨在通过实际操作,帮助具有C语言基础和Linux基础的学习者提升技能,理解游戏开发的基本原理,特别是如何在命令行环境下构建一款简单的游戏——贪吃蛇。 首先,我们要了解...

    AD工程 贪吃蛇脚本.rar

    标题中的“AD工程 贪吃蛇脚本.rar”表明这是一个与Active Directory(AD)相关的项目,同时结合了“贪吃蛇”的元素,这通常意味着它是一个编程脚本,可能是用某种编程语言编写的,用于在Windows环境中进行自动化或者...

    C编写的贪吃蛇

    这个C语言实现的贪吃蛇程序是一个典型的命令行游戏,它通过简单的字符绘制出游戏界面,通过控制台输入接收玩家指令。虽然简单,但它涵盖了数据结构、循环控制、条件判断、内存管理和用户交互等多个C语言核心概念,...

    c语言编写的贪吃蛇,俄罗斯方盘,以及桌面保护程序齿形波及其他源代码(有注释)集合下载

    在本资源中,我们拥有一系列使用C语言编写的经典游戏和桌面保护程序的源代码,包括贪吃蛇、俄罗斯方块以及一个齿形波桌面保护程序。这些源代码不仅提供了学习C语言编程的实践案例,还展示了如何利用C语言进行游戏...

    C语言写的贪吃蛇

    本文将详细探讨如何使用C语言在Linux环境下编写贪吃蛇游戏。 首先,我们要了解C语言的基础。C语言是一种强大的、低级的编程语言,它允许直接操作硬件,因此非常适合用于系统编程和游戏开发。在Linux环境下,我们...

    java 编写的贪吃蛇小游戏

    【Java编写的贪吃蛇小游戏】是一个典型的命令行或图形用户界面(GUI)应用程序,它展示了Java编程语言在游戏开发中的应用。贪吃蛇游戏是一个经典的休闲游戏,玩家通过控制一条不断移动的蛇来捕食食物,每吃到食物,...

    she--linux.rar_c++贪吃蛇linux_she_贪吃蛇

    6. **图形界面编程**:如果是基于命令行的贪吃蛇,可能使用ASCII艺术绘制游戏界面;如果使用图形库,可能涉及到GTK+、Qt等库。 7. **时间管理**:使用定时器(如`sleep`函数)控制游戏速度和蛇的移动。 8. **文件...

    C++编写简单的贪吃蛇游戏

    本教程将带你走进C++的世界,通过编写一个简单的“贪吃蛇”游戏,来学习和理解C++的基础语法以及游戏编程的基本原理。对于初学者来说,这是一个很好的起点,因为它将理论与实践相结合,让你在动手实践中学习。 首先...

    批处理贪吃蛇

    在IT领域,批处理是一种基于命令行的脚本编写方式,主要用于自动化执行一系列操作系统命令。本次我们关注的是一个独特的应用——"批处理贪吃蛇",这是一款完全由批处理语言编写的简单游戏,旨在展示批处理语言的潜力...

Global site tag (gtag.js) - Google Analytics