一个linux下的贪吃蛇

这是一款使用C语言和curses库编写的简单贪吃蛇游戏,已在CentOS7和FreeBSD11.2上成功运行并测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个以前写的小东西,没有进行完善。用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 ==
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值