c语言写贪吃蛇的问题

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
回复
hanis_ghost
帖子: 41
注册时间: 2015-06-19 21:16

c语言写贪吃蛇的问题

#1

帖子 hanis_ghost » 2017-10-10 18:41

想用ncurses写个c语言贪吃蛇,思路如下:
初始化 -> 接受用户输入,确定前进方向 -> 处理 ->输出
已经写完第二步了,编译链接成功,但./a.out后 显示:Segmentation fault (core dumped)
咋回事?哪里有错么?
另外下面怎么写请给些建议,谢谢。

代码: 全选

#include<stdio.h>
#include<ncurses.h>
#include<stdlib.h>
#include<time.h>

struct snake		//蛇的每一个节点都是个struct
{
	int y;int x;       //y:哪行 x:哪列
	struct snake* next;
};
struct snake* snake_head;
struct snake* dot;
int dir;	//蛇前进的方向 1:左 2:上 3:右 4:下

void main()
{
	//initialization
	int space[42][62]={0};	//游戏平台为42*62的平面
	int i,j,c;
	for(i=0,j=41,c=0;c<62;c++);
		space[i][c]=space[j][c]=3;    //3代表边框
	for(c=0,j=61,i=1;i<41;i++)
		space[i][c]=space[i][j]=3;	  //这两个for画出边框
	    //接下来初始化蛇的位置:从(3,4)到(3,5),刚开始时头在(3,5)
	    //注:上行注释括号中数字是数组下标。蛇的活动范围是40*60的长方形
	snake_head->y=3;
	snake_head->x=5;
	dot=malloc(sizeof(struct snake));
	dot->y=3;
	dot->x=4;
	snake_head->next=dot;
	dot->next=NULL;
	dir=3;
	initscr();
	WINDOW* win=newwin(42,62,0,0);
	keypad(win,TRUE);  //允许使用方向键
	noecho();
	curs_set(0);
	srand(time(NULL));
	halfdelay(5);
	//初始化完成,蛇头在(3,5),蛇身仅有一点(3,4)
	//初始前进方向是右

	while(1)
	{
		//input
		setbuf(stdin,NULL);  //清空输入缓冲区 
		int ch=wgetch(win);
		if(ch==KEY_UP)
			dir=2;
		else if(ch==KEY_DOWN)
			dir=4;
		else if(ch==KEY_LEFT)
			dir=1;
		else if(ch==KEY_RIGHT)
			dir=3;
		//至此,蛇前进的方向确定了!

		//process  //这步在wrefresh()之前刷新蛇的位置
		
		//output   //输出整个2维空间,不用多说
		
	}
	endwin();
}
头像
astolia
论坛版主
帖子: 6386
注册时间: 2008-09-18 13:11

Re: c语言写贪吃蛇的问题

#2

帖子 astolia » 2017-10-10 20:00

你学了这么久了连基本的调试都不会?嫌gdb指令晦涩,就用它的图形前端啊,一跑就知道哪里出问题了

Segmentation fault基本都是指针的问题,你这个程序也不例外。
snake_head你初始化了吗?拿着个野指针就开始用,你也不是第一次犯这个错了吧?

另外,编程问题发到编程板去
头像
qgymib
帖子: 539
注册时间: 2010-04-02 16:44
系统: openSUSE 13.2 x64

Re: c语言写贪吃蛇的问题

#3

帖子 qgymib » 2017-10-12 17:25

ls +1

P.S. 除此之外用valgrind跑一跑,直接给你定位到有问题的行号
正在建设中的个人博客
回复