架构练习:c语言实现贪吃蛇(二):使用libncurses.a库实现地图和蘑菇不换页刷新

现在已经实现地图和蘑菇的,或者说游戏界面的不换页刷新,

这里需要使用libncurses.a库来实现,代码如下。

下一步:实现蛇的移动。

源代码:

[email protected]:/mnt/shared/appbox/snake# cat snake.c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <curses.h>
#include <curses.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <ncurses.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>

#define GAME_WIDTH 50
#define GAME_HIGTH 25
int middle_line_create(WINDOW *win,int x_site, int y_site)
{
        int i, j;

        for(j=0;j<GAME_HIGTH;j++)
        {
                for(i=0;i<GAME_WIDTH;i++)
                {

                        if(i == x_site && j == y_site)
                        {
                                //printf("*");
                                mvwprintw(win,j,i,"*");
                        }
                        else if(j == 24 || j ==0)
                        {
                                mvwprintw(win,j,i,"-");
                        }
                        else if(1 == i)
                        {
                                //printf("|");
                                mvwprintw(win,j,i,"|");
                        }
                        else if(i== (GAME_WIDTH-1))
                        {
                                //printf("|\n");
                                mvwprintw(win,j,i,"|");
                        }
                        else
                        {
                                //printf(" ");
                                mvwprintw(win,j,i," ");
                        }
                }
        }

        return 0;
}

int target_create(int *x_site, int *y_site)
{
        int seconds= time((time_t*)NULL); 

        *y_site = abs(seconds*random())%GAME_HIGTH;
        *x_site = abs(seconds*random())%GAME_WIDTH;

        return 0;
}

static int need_new_target = 1;
static int x_site, y_site;
int frame_create(WINDOW *win)
{
        int i, j;

        if(need_new_target == 1)
        {
                target_create(&x_site, &y_site);
                need_new_target = 0;
        }
//      printf("x:%d, y:%d\n", x_site, y_site);
        middle_line_create(win, x_site, y_site);

        return 0;
}

/*
resource ncurses_newwin ( int rows, int cols, int y, int x);

ncurses_newwin() creates a new window to draw elements in. Windows can be positioned using x, y, rows and cols. When creating additional windows, remember to use ncurses_getmaxyx() to check for available space, as terminal size is individual and may vary. The return value is a resource ID used to differ between multiple windows.
*/

int main(int argc, char *argv[])
{
        int x,y;
        time_t t;
        pthread_t thread;
        WINDOW *win;

        initscr();          //初始化标准窗口,必需滴
        curs_set(0);        //隐藏光标动态
        noecho();           //输入无回显
        win=newwin(25,50,0,0);
        getmaxyx(win,y,x);
        printf("a:%d, b:%d\n",x,y);
        refresh();          //刷新一下标准窗口,不然无法显示新建的窗口
        wrefresh(win);      //刷新一下新建的窗口
        while(1)
        {
                frame_create(win);
                wrefresh(win);
                sleep(1);
        }

        endwin();

        return 0;
}
[email protected]:/mnt/shared/appbox/snake# 

时间: 2024-10-14 07:08:34

架构练习:c语言实现贪吃蛇(二):使用libncurses.a库实现地图和蘑菇不换页刷新的相关文章

C语言实现贪吃蛇之全靠数组篇

贪吃蛇游戏的设计思路很简单,相信有过一些编程经验的同学都不至于束手无策,可在我刚刚接触编程时,这个小小的贪吃蛇游戏可是让我费了不少脑筋,如今学习编程已经快一年了,前几天又看了一遍K&R,打算写几个贪吃蛇程序巩固一下知识.我打算写若干篇贪吃蛇的博客,从简单粗糙的开始,不断改良,希望能给初学C语言的同学一点借鉴. 话不多说,我们现在就开始吧,首先我们整理一下思路.首先我们要明确,既然贪吃蛇游戏理论上可以无限继续下去,那么游戏主体一定就是一个循环.蛇的移动就在这个循环中完成.如果是初学编程的话,可能会

C语言之贪吃蛇(curses库函数)

上大学学习编程的初始目的就是冲着游戏来的~不过在刚学习C语言的时候,完全无法利用所学知识弄出一个可玩的游戏╮(╯_╰)╭,学了1年后仍然对最简单的贪吃蛇没有思路(当然不是说没有打代码的思路,而是没有办法弄出动态的东西,而且当时往算法那走了~),直到如今大二,利用寒假的一点时间入门Linux的时候,发现了curses库函数!当我看明白它的作用时,拍案而起,TM这玩意不就是我梦寐以求的可实现界面的东东么!当我学了一点点就觉悟到,用一个move()和printw()函数就完全可以把贪吃蛇这种级别的写出

C语言实现贪吃蛇之结构链表篇

之前的两篇博客将运用的C语言知识限定在了一般的数组上,但如果已经完整地了解过C语言的话,运用结构和链表会让程序的结构更明了,逻辑更清晰.这篇博客就将介绍如何用结构和链表改善之前的程序. 首先,我们为蛇的节点定义一个结构: typedef struct node{ COORD cor; struct node *next; }node; COORD结构我在上一篇已经介绍过,这里就直接借用了. COORD food = { 3,5 }; node *head; food也相应地由COORD来定义,并

C语言实现贪吃蛇之图形界面篇

这已经是贪吃蛇系列的第五篇了,讲真一直写这个也挺无聊的,所以这一篇博文将是系列的最后一篇.虽然已经介绍了贪吃蛇的几种写法,但说到底我们的游戏还只是在一个黑框框里移动的星号.和我们平时玩的贪吃蛇游戏有不少差距.游戏嘛,画面也是很重要的一环.接下来就是让之前的贪吃蛇游戏脱胎换骨的时候了.话不多说,这就开干吧. 首先,为了摆脱无趣的黑框(控制台),我们这次新建一个win32项目,直接点击完成.初次接触win32项目的同学可能会感到一股扑面而来的伤害,满屏都是意义不明的字符,这TM还是C语言吗!先不要沮

C语言实现贪吃蛇之局部刷新篇

上一篇博客里,我介绍了如何用数组存储坐标,不断全屏刷新以实现动态效果,这几乎是最显而易见的思路,但带来的副作用也十分明显,那就是始终伴随着游戏的闪烁现象,之所以会造成闪烁现象,原因在于频繁的清空与打印,其实贪吃蛇游戏里我们并不需要重打印整个界面,要实现蛇的移动,我们只要打印出新的蛇头,清除原来的蛇尾就好了.食物只有在被吃掉时才需要重新打印,边界更是只用打印一次.好了,既然我们看到了可提升的地方,就开始动手优化吧.显然,我们将需要一个可以自由移动光标的函数,这样我们才能做到在需要的地方打印.TC上

C语言实现贪吃蛇

日期:2018.9.11 用时:150min 项目:贪吃蛇(C语言--数组   结构体实现) 开发工具:vs2013 关键知识:数组,结构体,图形库,键位操作 源代码: 1 #include<stdio.h> 2 #include<graphics.h> 3 #include<stdlib.h> 4 #include<conio.h> 5 #include<time.h> 6 7 #define N 200 8 int i, key; 9 int

C语言之贪吃蛇(conio.h)

写完基于Linux中curses库的贪吃蛇,发现只需要用到一个WIN的API(移动光标那个)改写move(int y, int x)函数,然后加上conio.h(一般编译器都会包含这个头文件)的getch(),就可以在Windows系统运行! Linux版链接:http://blog.csdn.net/u013351484/article/details/43940803 游戏规则: 初始时两条蛇会在中间,一条蛇头是'@',食物是'$':另一条蛇头是'+',食物是'*',蛇身都是'#'.WASD

C语言之贪吃蛇

利用链表的贪吃蛇,感觉自己写的时候还是有很多东西不熟悉, 1.预编译 2.很多关于系统的头文件也不是很熟悉 3.关于内存 第一个是.h头文件 #ifndef _SNAKE_H_H_H #define _SNAKE_H_H_H //调节游戏界面大小,这里设置为15*15 int const COL=15; int const ROW=15; //蛇结点 typedef struct Node { //data域 int x; int y; //指针域 struct Node* pre; struc

C语言之贪吃蛇(ncurses)

声明: 以下内容可能会引起某些读者不适, 请小心阅读. 有些内容并没有详细介绍, 可能简单理解也是错误的, 但是这都是为了尽量简单. 前言: 代码是很久之前写的,属于边想边写的那种,很混乱. 推荐材料: NCURSES Programming HOWTO 贪吃蛇应该是我们这代人都玩过的游戏.而如果我们要写一个贪吃蛇最需要考虑的就是贪吃蛇是如何移动的.其实贪吃蛇的移动就是尾部的减少和头部的增加. 这篇文章: 介绍一些ncurses库的基础内容 贪吃蛇游戏的代码解释 介绍一些ncurses库的基础内