读书人

访问冲突解决方法

发布时间: 2012-03-13 11:21:12 作者: rapoo

访问冲突
#include<stdio.h>
#include<graphics.h>
#include<time.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
#define ESC 27
#define Gamespeed 50 //游戏的速度
struct snake{
int x;
int y;
struct snake *previous;
struct snake *next;
};
struct food{
int x;
int y;
int yes; //控制食物是否出现
}food;
//头结点,尾节点与代替节点
int key=77,key1=77;//记录按键的值,初始化为向右.key1记录上一按键的值防止蛇向相反方向移动
void initgrap(void); //图形化初始
void printwall(void); //画围墙
void newgame(void); //具体的游戏过程
void producefood(void); //产生食物
void move(int i); //移动函数.1,2,3,4表示往哪个方向移动
int GameRes=0; //gameres游戏是否结束
int main(){
initgrap();
printwall();
newgame();
getch();
closegraph();
system("pause");
return 0;
}
void initgrap(void){
int gd,gm;
initgraph(&gd,&gm,"c:\\tc");
}
void printwall(void){
int i;
for(i=40;i<=600;i+=10){
rectangle(i,50,i+10,60);
rectangle(i,400,i+10,410);
} //画两排横的墙
for(i=60;i<=400;i+=10){
rectangle(40,i,50,i+10);
rectangle(600,i,610,i+10); //画两排竖的墙
}
}
struct snake *head,*pt,*tail;
void newgame(void){
srand((unsigned) time(NULL));
food.yes=1;
head=(struct snake *)malloc(sizeof(struct snake));
tail=(struct snake *)malloc(sizeof(struct snake));
head->x=200;
head->y=200;
head->next=tail;
head->previous=NULL;
tail->x=210;
tail->y=200;
tail->next=NULL;
tail->previous=head; //初始化头两节的位置
while(1){ //一直循环直到撞墙或按ESC退出键
if(food.yes==1) //需要产生食物
producefood();
for(pt=tail;pt!=head;pt=pt->previous){
pt->x=pt->previous->x;
pt->y=pt->previous->y; //变为以前的一节
}
if(_kbhit()){
key=_getch();
if(key==ESC)
break; //按退出键推出游戏
key=_getch();
if((key==LEFT&&key1==RIGHT)||(key==UP&&key1==DOWN)||(key==DOWN&&key1==UP)||(key==RIGHT&&key1==LEFT))
key=key1; //按相反键无效
key1=key; //不是相反键
}
switch(key){
case UP:move(1); //1上2下3左4右
break;
case DOWN:move(2);
break;
case LEFT:move(3);
break;
case RIGHT:move(4);
break;
}
for(pt=head->next;pt!=NULL;pt=pt->next){
if((pt->x==head->x)&&(pt->y==head->y)){
GameRes=1;
break;
}
} //判断蛇头是不是撞到了蛇身
if((head->x<40)||(head->x>600)||(head->y<60)||(head->y>400))
GameRes=1; //判断蛇头是否越墙
if(GameRes==1)
break; //以上两种情况就结束
if(head->x==food.x&&head->y==food.y){ //蛇头吃到了食物
setcolor(0);
rectangle(food.x,food.y,food.x+10,food.y-10); //把一开始存在的食物用黑色画去
pt=(struct snake*)malloc(sizeof(snake));
tail->next=pt;
pt->previous=tail;
tail=pt;
tail->x=tail->previous->x-20;
tail->y=tail->previous->y-20; //新产生的一节放在最后一节看不见的位置
food.yes=1; //需要重新产生食物
}
for(pt=head;pt!=NULL;pt=pt->next){
setcolor(999);
rectangle(pt->x,pt->y,pt->x+10,pt->y-10); //把蛇给画出来
}
_sleep(Gamespeed);
setcolor(0); //去除蛇身最后一节
rectangle(tail->x,tail->y,tail->x+10,tail->y-10);

}
}
void producefood(void){
int flag=0; //标志食物已经产生在合适的位置


while(!flag){
food.x=rand()%500;
food.y=rand()%500-70;
for(pt=head;pt!=NULL;pt=pt->next)
if(pt->x==food.x&&pt->y==food.y)
break;
if(pt==NULL)
flag=1;
} //使食物产生的位置不在蛇身上
while((food.x%10)!=0)
food.x++;
while((food.y%10)!=0)
food.y++; //让食物产生在整数格内,这样头才能吃到。
food.yes=0;
setcolor(999);
rectangle(food.x,food.y,food.x+10,food.y-10);
}
void move(int i){ //移动函数
if(i==1)
head->y=head->y-10;
else if(i==2)
head->y=head->y+10;
else if(i==3)
head->x=head->x-10;
else
head->x=head->x+10;
}

这个贪吃蛇吃到食物时,编译器报错是访问冲突,是什么意思啊?

[解决办法]
单步调试,看看哪儿出的错

读书人网 >C语言

热点推荐