一个以前写的小东西,没有进行完善。用c和curses库写的
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <curses.h>
#include <time.h>
#include <signal.h>
#include <sys/time.h>
#ifndef TIOCGWINSZ
#include <sys/ioctl.h>
#endif
#define ERRBUFSIZE 128
#define DEFSNAKE 'o' //蛇身字符
#define DEFFOOD 'x' //食物字符
#define DEFLINES 33 //窗口行
#define DEFCOLS 80 //窗口列
#define DEFHL 3 //底栏
#define DEFVL 12 //侧边栏
#define DEFINTERVAL 20000 //间隔时间20ms
#define DEFMINSLEN 4 //默认蛇长
#define DEFMAXSLEN 5 //最大蛇长
#define DEFFLEN 3 //食物数量
#define TIMEBUFSIZE 32
struct snake //蛇身坐标
{
int sk_l;
int sk_c;
};
struct food //食物坐标
{
int fd_l;
int fd_c;
int fd_used;
};
struct gameobj //游戏数据
{
struct snake * obj_snake;
struct food * obj_food;
int obj_snakelen;
int obj_lines;
int obj_cols;
int obj_score;
time_t obj_ptim;
};
struct gamesetting //游戏设置
{
int wlines;
int wcols;
int hl;
int vl;
int interval;
int hz; //每秒中断次数
int fullout; //中断次数大或等于fullout则中断次数置0
int statflag; //当前状态
int minslen; //初始蛇长
int maxslen;
int flen; //食物数量
WINDOW * mwin; //游戏窗口
};
struct gameobj obj;
struct gamesetting st;
int pcomm,comm; //pcomm: 上一次输入字符 comm: 当前输入的字符
/*
obj.statflag是游戏状态
0: 停止
1: 运行
2: 暂停
*/
static void
err_exit(const char * fmt, ...)
{
char buf[ERRBUFSIZE];
va_list va;
va_start(va,fmt);
vsnprintf(buf,ERRBUFSIZE,fmt,va);
delwin(st.mwin);
endwin();
fprintf(stderr,"%s\n",buf);
exit(1);
}
static inline void *
malloc_clean(int c, size_t count)
{
void *p = malloc(count);
return memset(p, c, count);
}
void
do_exit(void)
{
delwin(st.mwin);
endwin();
exit(0);
}
WINDOW *
draw_win(WINDOW * pwin, int slines, int scols)
{
WINDOW * win;
if((win = subwin(pwin,st.wlines,st.wcols,slines,scols)) == NULL)
return NULL;
box(win,'|','-'); //画边框
mvwhline(win,st.wlines-3,1,'-',st.wcols-2); //画底栏
mvwvline(win,1,st.wcols-12,'|',st.wlines-4); //画侧边栏
return win;
}
void
clear_win(void)
{
int i,j;
for(i = 1;i < obj.obj_lines;i++)
for(j = 1;j < obj.obj_cols;j++)
mvwaddch(st.mwin,i,j,' ');
wrefresh(st.mwin);
}
int
test_comm(int ch) //检查输入的字符
{
if(ch != 'w' && ch != 'a' && ch != 's' && ch != 'd')
return 0;
if(pcomm == 'w' && ch == 's')
return 0;
if(pcomm ==