#include<stdio.h>
#include<stdlib.h>
#include<ncurses.h>
#include<signal.h>
#include<sys/time.h>
#include<fcntl.h>
#define DFL_SPEED 500 /* snake default speed */
#define _LEN 9
int maxx,maxy;
int *psnk,*lsnk,*px,*py;
void delay1s(int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++);
}
void drawrect(int rows,int cols)
{
int begainrow,endrow,begaincol,endcol;
int currow=0,curcol=0;
int i,j;
int count;
begainrow=0;
endrow =rows - 1;
begaincol=0;
endcol =cols - 1;
currow=begainrow,curcol=begaincol;
for(count=0;count<rows*cols;count++)
{
// 从左到右显示一行
for(;;)
{
mvaddch(currow,curcol,'A');
refresh();
delay1s(100);
if(curcol != endcol)
curcol ++;
else
{
endcol--;
break;
}
}
// 从上倒下显示一竖行
for(;;)
{
if(currow != endrow)
currow++;
else
{
endrow--;
break;
}
mvaddch(currow,curcol,'A');
refresh();
delay1s(3000);
}
// 从右到左显示一行
for(;;)
{
if(curcol != begaincol)
curcol--;
else
{
begaincol++;
break;
}
mvaddch(currow,curcol,'A');
refresh();
delay1s(3000);
}
// 从下到上显示一行
for(;;)
{
if(currow != begainrow+1)
currow--;
else
{
begainrow++;
break;
}
mvaddch(currow,curcol,'A');
refresh();
delay1s(3000);
}
}
}
void disppoint(int rows,int cols)
{
int currow,curcol;
int c;
currow = rand() % rows;
curcol = rand() % cols;
keypad(stdscr, true);
}
typedef struct food
{
int x;
int y;
}_FOOD;
_FOOD fo;
void showfo(int cols,int rows) //随机食物
{
mvaddch(fo.y,fo.x,' ');
fo.x=rand() % cols ;
fo.y=rand() % rows ;
mvaddch(fo.y,fo.x,'?');
}
//蛇头是否碰到食物
int eat(int x,int y,int y1,int x1)
{
if(x ==x1 && y == y1)
{
showfo(maxy-1,maxx-1); //碰到食物响应代码
//mvaddch(1,1,'K');
return 1;
}
return 0;
}
void snkj(int len,int *p) //显示蛇身体,和清除蛇的尾巴
{
int i;
char g='@';
for(i=len;i>=0;i--)
{
if(i==len)
{
mvaddch(p[2*i],p[2*i+1],' ');
}
else
{
if(i==0)
{
mvaddch(p[2*i],p[2*i+1],'#');
continue;
}
mvaddch(p[2*i],p[2*i+1],g);
//g++;
}
}
}
void ch2(int *x,int *y) //数据交换
{
int temp;
temp=*x;
*x = *y;
*y = temp;
}
void snkjmv(int x,int y,int *p,int len) //蛇数组移动
{
int i;
for(i=0;i<=len;i++)
{
ch2(&p[0],&p[2*(i+1)]);
ch2(&p[1],&p[2*(i+1)+1]);
}
p[0]=x;
p[1]=y;
}
void addsnkL(int x,int y,int *p,int len) //加蛇长度
{
int i;
for(i=2*len-1;i<=0;i=i-2)
{
p[i+2]=p[i];
p[i+1]=p[i-1];
}
}
int same(int a,int b) //比较2数是否相等
{
if(a == b)
return 1;
return 0;
}
int samesnk(int *p,int len) //数组是否与第一个数组相等
{
int i;
for(i=1;i<len;i++)
{
if ( same(p[0],p[2*i]) == 1 && same(p[1],p[2*i+1]) == 1) //game over
{
return 1;
}
}
return 0;
}
int set_ticker(int n_msecs)
{
struct itimerval new_timeset;
long n_sec, n_usecs;
n_sec = n_msecs / 1000; /* int second part */
n_usecs = (n_msecs % 1000) * 1000L; /* microsecond part */
new_timeset.it_interval.tv_sec = n_sec; /* set reload */
new_timeset.it_interval.tv_usec = n_usecs;
new_timeset.it_value.tv_sec = n_sec; /* set new ticker value */
new_timeset.it_value.tv_usec = n_usecs;
return setitimer(ITIMER_REAL, &new_timeset, NULL);
}
void gameover(int *x,int *y)
{
if(*y==-1)
{*y=maxx-1;endwin();exit(0);}
if(*y>=maxx)
{*y=0;endwin();exit(0);}
if(*x>=maxy)
{*x=0;endwin();exit(0);}
if(*x==-1)
{*x=maxy-1;endwin();exit(0);}
}
void moveSnk(int *p)
{
if( p[0] - p[2] >0 && p[1] - p[3] == 0)
{
*py = *py + 1;
snkjmv(*py,*px,p,*lsnk); //一直下
if(samesnk(p,*lsnk)==1) //撞到自己game over
{
endwin();
exit(0);
}
gameover(px,py); //撞到墙game over
}
else if( p[0] - p[2] <0 && p[1] - p[3] == 0)
{ //一直上
*py = *py - 1;
snkjmv(*py,*px,p,*lsnk);
if(samesnk(p,*lsnk)==1) //撞到自己game over
{
endwin();
exit(0);
}
gameover(px,py); //撞到墙game over
}
if( p[1] - p[3] >0 && p[0] - p[2] == 0)
{
//一直左
*px = *px + 1;
snkjmv(*py,*px,p,*lsnk);
if(samesnk(p,*lsnk)==1) //撞到自己game over
{
endwin();
exit(0);
}
gameover(px,py); //撞到墙game over
}
else if( p[1] - p[3] <0 && p[0] - p[2] == 0)
{
//一直右
*px = *px - 1;
snkjmv(*py,*px,p,*lsnk);
if(samesnk(p,*lsnk)==1) //撞到自己game over
{
endwin();
exit(0);
}
gameover(px,py); //撞到墙game over
}
}
void Snake_Move() //1s定时器信号
{
//signal(SIGALRM, SIG_IGN);
//showfo(maxy,maxx); //随机食物
moveSnk(psnk);
signal(SIGALRM, Snake_Move);
}
int main(int argc,char *argv[])
{
//char mesg[]="Just a string"; /* 将要被打印的字符串*/
int snk[500]={10,8,10,7,10,6,10,5,10,4,10,3,10,2,10,1,10,0}; //初始化蛇的身体位置
psnk = snk;
unsigned int ch,x=8,y=10;
int fen=0;
px = &x;
py = &y;
int snklen = _LEN; //蛇的初始长度
lsnk= &snklen;
int rows,cols; /* 存储行号和列号的变量,用于指定光标位置*/
srand(time(NULL));
initscr(); /* 进入curses 模式*/
getmaxyx(stdscr,rows,cols); /* 取得stdscr(标准输出设备)的行数和列数*/
maxx=rows;
maxy=cols;
keypad(stdscr,true);
noecho();
snkj(snklen,snk); //显示蛇的开始位置
showfo(cols-1,rows-1);//第一个食物
refresh();
fcntl(0,F_SETFL, O_NONBLOCK); //getch非阻赛
signal(SIGALRM, Snake_Move);
set_ticker(DFL_SPEED); //DFL_SPEED = 1000
while(1)
{
ch=getch();
if(ch == 'q')//退出
{
break;
}
if(ch == 'a')//
{
showfo(cols,rows);
}
if(ch == KEY_UP )//蛇上
{
y--;
if(y==-1)
{y=rows-1;break;}
snkjmv(y,x,snk,snklen); //蛇数组 移动
}
if(ch == KEY_DOWN )//蛇下
{
y++;
if(y>=rows)
{y=0;break;}
snkjmv(y,x,snk,snklen); //蛇数组 移动
}
if(ch == KEY_RIGHT )//蛇右
{
x++;
if(x>=cols)
{x=0;break;}
snkjmv(y,x,snk,snklen); //蛇数组 移动
}
if(ch == KEY_LEFT )//蛇左
{
x--;
if(x==-1)
{x=cols-1;break;}
snkjmv(y,x,snk,snklen); //蛇数组 移动
}
//snkjmv(y,x,snk,snklen); //蛇数组 移动
snkj(snklen,snk); //显示 蛇数组
mvprintw(maxx-1,0,"count : %d snk long : %d ",fen,snklen);
//mvprintw(0,0,"ni");
refresh();
if( eat(fo.x,fo.y,snk[0],snk[1]) ==1)//吃到食物触发事件
{
snklen=snklen+1;
addsnkL(y,x,snk,snklen);
fen=snklen*2+fen;
}
if(samesnk(snk,snklen)==1) //撞到自己game over
break;
//setTicker(20);
//set_ticker(500);
}
endwin();
return 0;
}

小猪3号
- 粉丝: 1
最新资源
- 大模型(LLMs)算法工程师面试题及我的答案记录仓库
- 从零开始学大模型Transformer、GPT2、BERT pre-training and fine-tuning from scratch
- 开源智能体项目:支持 6 大聊天平台、Onebotv11 一对多连接、流式信息 agent、对话键盘气泡生成,支持 10 + 大模型接口且持续更新,可转换多模型接口为带上下文通用格式
- 该仓库主要记录 大模型(LLMs) 算法工程师相关的面试题与我写的答案
- 大数据平台架构下的模型管理与权限控制体系
- 开源的智能体项目 支持6种聊天平台 Onebotv11一对多连接 流式信息 agent 对话keyboard气泡生成 支持10+大模型接口(持续更新) 具有将多种大模型接口转化为带有上下文的通用格式的
- 针对复杂业务逻辑的Java实现系统,抽象出一套编程框架,借鉴领域模型的设计方法,使得开发体验更加环保、更加友好,大大提高代码的后期可维护性
- 大数据平台下模型管理与权限控制平台
- 《大语言模型》综述全书学习笔记
- 《大语言模型》综述全书的学习笔记整理
- log4j日志的监控系统,采用web形式展现各模块的运行状态,支持邮件短信报警,适用于一般企业大中型业务生成系统的监控;业务模块定时30秒采用json格式输出到文件
- log4j日志的监控系统,采用web形式展现各模块的运行状态,支持邮件短信报警,适用于一般企业大中型业务生成系统的监控;业务模块定时30秒采用json格式输出到文件
- 从 0 到 1 学用模块化等技术打造大型 Android 项目架构模式
- 基于 模块化+Kotlin+协程+Retrofit+Jetpack+MVVM 架构.能提供大家学习如何从0到1打造一个符合[大型Android项目的架构模式]
- txs0104e数据表(官方资料)
- 基于 模块化+Kotlin+协程+Retrofit+Jetpack+MVVM 架构.能提供大家学习如何从0到1打造一个符合[大型Android项目的架构模式]
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


