我按照360搜索提供的贪食蛇程序编写总是出现1个错误,请大师及各位前辈指点!
/* 贪食蛇程序 by champking */#define N 200
#include'graphics.h'
#include <stdlib.h>
#include <dos.h>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i, key;
int score = 0;/*得分*/
int gamespeed = 100000;/*游戏速度自己调整*/
struct Food
{
int x;/*食物的横坐标*/
int y;/*食物的纵坐标*/
int yes;/*判断是否要出现食的变量*/
}
food;/*食物的结构体*/
struct Snake;
{
int x ;
int y ;
int node;/*蛇的节数*/
int direction;/*蛇移动方向*/
int life;/*蛇的生命,0活着,1死亡*/
}
snake;
void Init(void);/*图形驱动*/
void Close(void);/*图形结束*/
void Drawk(void);/*开始画面*/
void GameOver(void);/*结束游戏*/
void GamePlay(void);/*玩游戏具体过程*/
void PrScore(void);/*输出成绩*/
/*主函数*/
void main(void);
{
Init();/*图形驱动*/
DrawK();/*开始画面*/
GamePlay();/*玩游戏具体过程*/
Close();/*图形结束*/
}
/*图形驱动*/
void Init(void);
{
int gd = DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
}
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
void DrawK(void);
{
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/
for(i = 50; i<=600; i+=10);/*画围墙*/
{
rectangle(i,40, i + 10, 49);/*上边*/
rectangle(i,451, i + 10,460);/*下边*/
}
for(i = 40; i <=450; i+=10);
{
rectangle(50,i,59,i+10);/*左边*/
rectangle(601,i,610,i + 10);/*右边*/
}
}
/*玩游戏具体过程*/
void GamePlay(void);
{
randomize();/*随机数发生器*/
food.yes = 1;/*1表示需要出现新食物,0表示已经存在食物*/
snake.life = 0; /*活着*/
snake.direction = 1; /*方向往右*/
snake.x = 100; snake.y =100; /*蛇头*/
snake.x = 110; snake.y =100;
snake.node = 2; /*节数*/
PrScore();/*输出得分*/
while(1);/*可以重复玩游戏,压ESC键结束*/
{
while()!kbhit());/*在没有按键的情况下,蛇自己移动身体*/
{
if(food.yes = = 1);/*需要出现新食物*/
{
food.x = rand()%400 + 60;
food.y = rand()%350 + 60;
while(food.x % 10)! = 0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x ++;
while(food.y % 10)! = 0)
food.y ++;
food.yes = 0 ;/*画面上有食物了*/
}
if(food.yes == 0);/*画面上有食物了就要显示*/
{
setcolor(GREEN);
rectangle(food.x,food.y,food.x +10, food.y -10);
}
for(i = snake.node -1; i>0; i--);/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
{
snake.x = snake.x;
snake.y = snake.y;
}
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头 */
switch(snake.direction);
{
case 1: snake.x+= 10; break;
case 2: sanke.x-= 10; break;
case 3: snake.y-= 10; break;
case 4: snake.y+= 10; break;
}
for(i = 3; i < snake.node; i++);/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
{
if(snake.x = = snake.x&& snake.y = = snake.y);
{
GameOver();/*显示失败*/
snake.life = 1 ;
break;
}
}
if(snake.x<55||snake.x>595||snake.y<55||snake.y>455);/*蛇是否撞到墙壁*/
{
GameOver();/*本次游戏结束*/
snake.life=1; /*蛇死*/
}
if(snake.life = = 1);/*以上两种判断以后,如果蛇死就出内循环不,重新开始*/
break;
if(snake.x == food.x && snake.y == food.y);/*吃到食物以后*/
{
setcolor(0);/*把画面上的食物东西去掉*/
rectangle(food.x,food.y,food.x +10,food.y -10);
snake.x =- 20; snake.y=-20;
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++;/*蛇的身体长一节*/
food.yes =1; /*画面上需要出现新的食物*/
score + = 10 ;
PrScore();/*输出新得分*/
}
setcolor(4);/*画出蛇*/
for(i = 0; i<snake.node; i++);
rectangle(snake.x,snake.y,snake.x + 10,snake.y-10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的最后一节*/
rectangle(snake.x,snake.y,snake.x+10,snake.y-10);
}
/*endwhile(!kbhit)*/
if(snake.life == 1);/*如果蛇死就跳出循环*/
break;
key = bioskey (0);/*接收按键*/
if(key == ESC)/*按ESC键退出*/
break;
else
if(key == UP&& snake.direction)! =4)
/*判断是否往相反的方向移动*/
snake.direction =3;
else
if(key == RIGHT && snake.direction! = 2)
snake.direction=1;
else
if(key == LEFT && snake.direction! =1)
snake.direction =2;
else
if(key == DOWN && snake.direction! =3)
snake.direction = 4 ;
}
/*endwhile(1)*/
}
/*游戏结束*/
void GameOver(void);
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GAME OVER");
getch();
}
/*输出成绩*/
void PrScore(void);
{
char str;
setfillstyle (SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy (55,20,str);
}
/*图形结束*/
void Close(void);
{
getch();
closegraph();
}
代码太长了,请贴出出错提示 --------------------Configuration: snake - Win32 Debug--------------------
Compiling...
Greedy snake.cpp
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(5) : error C2015: too many characters in constant
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(5) : error C2006: #include expected a filename, found 'constant'
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(40) : error C2447: missing function header (old-style formal list?)
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(48) : error C2501: 'snake' : missing storage-class or type specifiers
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(61) : error C2447: missing function header (old-style formal list?)
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(77) : error C2447: missing function header (old-style formal list?)
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(91) : error C2447: missing function header (old-style formal list?)
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(125) : error C2447: missing function header (old-style formal list?)
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(330) : error C2447: missing function header (old-style formal list?)
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(349) : error C2447: missing function header (old-style formal list?)
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(370) : error C2447: missing function header (old-style formal list?)
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(393) : error C2143: syntax error : missing ';' before '}'
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(393) : error C2143: syntax error : missing ';' before '}'
e:\vc++\msdev98\myprojects\snake\greedy snake.cpp(393) : error C2143: syntax error : missing ';' before '}'
执行 cl.exe 时出错.
snake.exe - 1 error(s), 0 warning(s)
宝妹 发表于 2017-10-28 11:19
--------------------Configuration: snake - Win32 Debug--------------------
Compiling...
Greedy sna ...
错误修改:
1、结构体定义
struct Snake; /*应该去年后面的";"*/
{
int x ;
int y ;
int node;/*蛇的节数*/
int direction;/*蛇移动方向*/
int life;/*蛇的生命,0活着,1死亡*/
}snake;
2、while()!kbhit()); /*应该改为while(!kbhit());*/
3、while(1); /*应该去年后面的“;”*/
weizhongyang 发表于 2017-10-28 12:19
错误修改:
1、结构体定义
struct Snake; /*应该去年后面的";"*/
修改后的程序:
/* 贪食蛇程序 by champking */
#define N 200
#include'graphics.h'
#include <stdlib.h>
#include <dos.h>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i, key;
int score = 0;/*得分*/
int gamespeed = 100000;/*游戏速度自己调整*/
struct Food
{
int x;/*食物的横坐标*/
int y;/*食物的纵坐标*/
int yes;/*判断是否要出现食的变量*/
}food;/*食物的结构体*/
struct Snake
{
int x ;
int y ;
int node;/*蛇的节数*/
int direction;/*蛇移动方向*/
int life;/*蛇的生命,0活着,1死亡*/
}snake;
void Init(void);/*图形驱动*/
void Close(void);/*图形结束*/
void Drawk(void);/*开始画面*/
void GameOver(void);/*结束游戏*/
void GamePlay(void);/*玩游戏具体过程*/
void PrScore(void);/*输出成绩*/
/*主函数*/
void main(void);
{
Init();/*图形驱动*/
DrawK();/*开始画面*/
GamePlay();/*玩游戏具体过程*/
Close();/*图形结束*/
}
/*图形驱动*/
void Init(void);
{
int gd = DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
}
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
void DrawK(void);
{
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/
for(i = 50; i<=600; i+=10);/*画围墙*/
{
rectangle(i,40, i + 10, 49);/*上边*/
rectangle(i,451, i + 10,460);/*下边*/
}
for(i = 40; i <=450; i+=10);
{
rectangle(50,i,59,i+10);/*左边*/
rectangle(601,i,610,i + 10);/*右边*/
}
}
/*玩游戏具体过程*/
void GamePlay(void);
{
randomize();/*随机数发生器*/
food.yes = 1;/*1表示需要出现新食物,0表示已经存在食物*/
snake.life = 0; /*活着*/
snake.direction = 1; /*方向往右*/
snake.x = 100; snake.y =100; /*蛇头*/
snake.x = 110; snake.y =100;
snake.node = 2; /*节数*/
PrScore();/*输出得分*/
while(1)/*可以重复玩游戏,压ESC键结束*/
{
while(!kbhit());/*在没有按键的情况下,蛇自己移动身体*/
{
if(food.yes = = 1);/*需要出现新食物*/
{
food.x = rand()%400 + 60;
food.y = rand()%350 + 60;
while(food.x % 10)! = 0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x ++;
while(food.y % 10)! = 0)
food.y ++;
food.yes = 0 ;/*画面上有食物了*/
}
if(food.yes == 0);/*画面上有食物了就要显示*/
{
setcolor(GREEN);
rectangle(food.x,food.y,food.x +10, food.y -10);
}
for(i = snake.node -1; i>0; i--);/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
{
snake.x = snake.x;
snake.y = snake.y;
}
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头 */
switch(snake.direction);
{
case 1: snake.x+= 10; break;
case 2: sanke.x-= 10; break;
case 3: snake.y-= 10; break;
case 4: snake.y+= 10; break;
default:break;
}
for(i = 3; i < snake.node; i++);/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
{
if(snake.x = = snake.x&& snake.y = = snake.y);
{
GameOver();/*显示失败*/
snake.life = 1 ;
break;
}
}
if(snake.x<55||snake.x>595||snake.y<55||snake.y>455);/*蛇是否撞到墙壁*/
{
GameOver();/*本次游戏结束*/
snake.life=1; /*蛇死*/
}
if(snake.life = = 1);/*以上两种判断以后,如果蛇死就出内循环不,重新开始*/
break;
if(snake.x == food.x && snake.y == food.y);/*吃到食物以后*/
{
setcolor(0);/*把画面上的食物东西去掉*/
rectangle(food.x,food.y,food.x +10,food.y -10);
snake.x =- 20; snake.y=-20;
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++;/*蛇的身体长一节*/
food.yes =1; /*画面上需要出现新的食物*/
score + = 10 ;
PrScore();/*输出新得分*/
}
setcolor(4);/*画出蛇*/
for(i = 0; i<snake.node; i++);
rectangle(snake.x,snake.y,snake.x + 10,snake.y-10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的最后一节*/
rectangle(snake.x,snake.y,snake.x+10,snake.y-10);
}/*endwhile(!kbhit)*/
if(snake.life == 1);/*如果蛇死就跳出循环*/
break;
key = bioskey (0);/*接收按键*/
if(key == ESC)/*按ESC键退出*/
break;
else if(key == UP&& snake.direction)! =4)
/*判断是否往相反的方向移动*/
snake.direction =3;
else if(key == RIGHT && snake.direction! = 2)
snake.direction=1;
else if(key == LEFT && snake.direction! =1)
snake.direction =2;
else if(key == DOWN && snake.direction! =3)
snake.direction = 4 ;
}
/*endwhile(1)*/
}
/*游戏结束*/
void GameOver(void);
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GAME OVER");
getch();
}
/*输出成绩*/
void PrScore(void);
{
char str;
setfillstyle (SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy (55,20,str);
}
/*图形结束*/
void Close(void);
{
getch();
closegraph();
} weizhongyang 发表于 2017-10-28 12:21
修改后的程序:
谢谢,我这就去试一下!看看能不能运行{:5_92:} weizhongyang 发表于 2017-10-28 12:21
修改后的程序:
我试过了还是不行,1. struct Snake 去掉了分号
2. while()!kbhit());这个我本来是按照你输入的样子的,但它老提示说少)和;所以才加上去的。
3.while(1);也是上面的提示才加上去的,但现在试了还是运行不了。 宝妹 发表于 2017-10-28 14:57
我试过了还是不行,1. struct Snake 去掉了分号
2. while()!kbhit());这个我本来是按照你输入的样子的 ...
先确认几个问题
1、用的是什么编译软件
2、头文件graphics.h是否能链接到
3、判断时,不需要在后面加";", 如if,for后面你都加了;
试下修改后的代码:
/* 贪食蛇程序 by champking */
#define N 200
#include'graphics.h'
#include <stdlib.h>
#include <dos.h>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i, key;
int score = 0;/*得分*/
int gamespeed = 100000;/*游戏速度自己调整*/
struct Food
{
int x;/*食物的横坐标*/
int y;/*食物的纵坐标*/
int yes;/*判断是否要出现食的变量*/
}food;/*食物的结构体*/
struct Snake
{
int x ;
int y ;
int node;/*蛇的节数*/
int direction;/*蛇移动方向*/
int life;/*蛇的生命,0活着,1死亡*/
}snake;
void Init(void);/*图形驱动*/
void Close(void);/*图形结束*/
void Drawk(void);/*开始画面*/
void GameOver(void);/*结束游戏*/
void GamePlay(void);/*玩游戏具体过程*/
void PrScore(void);/*输出成绩*/
/*主函数*/
void main(void)
{
Init();/*图形驱动*/
DrawK();/*开始画面*/
GamePlay();/*玩游戏具体过程*/
Close();/*图形结束*/
}
/*图形驱动*/
void Init(void)
{
int gd = DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
}
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
void DrawK(void)
{
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/
for(i = 50; i<=600; i+=10)/*画围墙*/
{
rectangle(i,40, i + 10, 49);/*上边*/
rectangle(i,451, i + 10,460);/*下边*/
}
for(i = 40; i <=450; i+=10)
{
rectangle(50,i,59,i+10);/*左边*/
rectangle(601,i,610,i + 10);/*右边*/
}
}
/*玩游戏具体过程*/
void GamePlay(void)
{
randomize();/*随机数发生器*/
food.yes = 1;/*1表示需要出现新食物,0表示已经存在食物*/
snake.life = 0; /*活着*/
snake.direction = 1; /*方向往右*/
snake.x = 100; snake.y =100; /*蛇头*/
snake.x = 110; snake.y =100;
snake.node = 2; /*节数*/
PrScore();/*输出得分*/
while(1)/*可以重复玩游戏,压ESC键结束*/
{
while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/
{
if(food.yes = = 1)/*需要出现新食物*/
{
food.x = rand()%400 + 60;
food.y = rand()%350 + 60;
while(food.x % 10)! = 0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x ++;
while(food.y % 10)! = 0)
food.y ++;
food.yes = 0 ;/*画面上有食物了*/
}
if(food.yes == 0)/*画面上有食物了就要显示*/
{
setcolor(GREEN);
rectangle(food.x,food.y,food.x +10, food.y -10);
}
for(i = snake.node -1; i>0; i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
{
snake.x = snake.x;
snake.y = snake.y;
}
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头 */
switch(snake.direction)
{
case 1: snake.x+= 10; break;
case 2: sanke.x-= 10; break;
case 3: snake.y-= 10; break;
case 4: snake.y+= 10; break;
default:break;
}
for(i = 3; i < snake.node; i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
{
if(snake.x = = snake.x&& snake.y = = snake.y)
{
GameOver();/*显示失败*/
snake.life = 1 ;
break;
}
}
if(snake.x<55||snake.x>595||snake.y<55||snake.y>455)/*蛇是否撞到墙壁*/
{
GameOver();/*本次游戏结束*/
snake.life=1; /*蛇死*/
}
if(snake.life = = 1)/*以上两种判断以后,如果蛇死就出内循环不,重新开始*/
break;
if(snake.x == food.x && snake.y == food.y)/*吃到食物以后*/
{
setcolor(0);/*把画面上的食物东西去掉*/
rectangle(food.x,food.y,food.x +10,food.y -10);
snake.x =- 20; snake.y=-20;
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++;/*蛇的身体长一节*/
food.yes =1; /*画面上需要出现新的食物*/
score + = 10 ;
PrScore();/*输出新得分*/
}
setcolor(4);/*画出蛇*/
for(i = 0; i<snake.node; i++)
rectangle(snake.x,snake.y,snake.x + 10,snake.y-10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的最后一节*/
rectangle(snake.x,snake.y,snake.x+10,snake.y-10);
}/*endwhile(!kbhit)*/
if(snake.life == 1)/*如果蛇死就跳出循环*/
break;
key = bioskey (0);/*接收按键*/
if(key == ESC)/*按ESC键退出*/
break;
else if(key == UP&& snake.direction)! =4)
/*判断是否往相反的方向移动*/
snake.direction =3;
else if(key == RIGHT && snake.direction! = 2)
snake.direction=1;
else if(key == LEFT && snake.direction! =1)
snake.direction =2;
else if(key == DOWN && snake.direction! =3)
snake.direction = 4 ;
}
/*endwhile(1)*/
}
/*游戏结束*/
void GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GAME OVER");
getch();
}
/*输出成绩*/
void PrScore(void)
{
char str;
setfillstyle (SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy (55,20,str);
}
/*图形结束*/
void Close(void)
{
getch();
closegraph();
} weizhongyang 发表于 2017-10-29 11:42
先确认几个问题
1、用的是什么编译软件
2、头文件graphics.h是否能链接到
不好意思,本来昨天回复过的,但是由于截图上传错误又无法更换与删除因而失去了发帖的机会,只得今天再发,以下是我的操作,请过目! 宝妹 发表于 2017-10-30 16:33
不好意思,本来昨天回复过的,但是由于截图上传错误又无法更换与删除因而失去了发帖的机会,只得今天再发 ...
你的这个软件安装目录怎么还有乱码,且有中文目录
改成英文的目录,不要有乱码目录
再试试我上面的程序,是否能编译过。 weizhongyang 发表于 2017-10-30 17:20
你的这个软件安装目录怎么还有乱码,且有中文目录
改成英文的目录,不要有乱码目录
好的。 weizhongyang 发表于 2017-10-30 17:20
你的这个软件安装目录怎么还有乱码,且有中文目录
改成英文的目录,不要有乱码目录
这位前辈,我刚才按照你的指导从小甲鱼的软件下载处安装了英文版的VC++软件,并在include里面安装了头文件graphics.h,现在的结果是检查0错误,但程序仍无法运行,我的截图如下,请过目: 本帖最后由 宝妹 于 2017-10-31 22:31 编辑
weizhongyang 发表于 2017-10-30 17:20
你的这个软件安装目录怎么还有乱码,且有中文目录
改成英文的目录,不要有乱码目录
另外前辈,这是我找到的另一种关于贪食蛇的源代码,它却可以运行,甚至是在原来那个中文版带乱码的编辑器里,我想知道它是怎么做到的,请过目:
#include <windows.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define N 21
int apple,num;
char score;
char tail;
void gotoxy(int x, int y) //输出坐标
{
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
void color(int b) //颜色函数
{
HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ;
SetConsoleTextAttribute(hConsole,b) ;
}
int Block(char head) //判断出界
{
if ((head < 1) || (head > N) || (head < 1) || (head > N))
return 1;
return 0;
}
int Eat(char snake) //吃了苹果
{
if ((snake == apple) && (snake == apple))
{
apple = apple = apple = 0;
gotoxy(N+44,10);
color(13);
printf("%d",score*10);
color(11);
return 1;
}
return 0;
}
void Draw(char **snake, int len) //蛇移动
{
if (apple)
{
gotoxy(apple * 2, apple);
color(12);
printf("●");
color(11);
}
gotoxy(tail * 2, tail);
if (tail)
{
color(num);
printf("★");
color(num);
}
else
printf("■");
gotoxy(snake * 2, snake);
color(num);
printf("★");
color(num);
putchar('\n');
}
char** Move(char **snake, char dirx, int *len) //控制方向
{
int i, full = Eat(snake);
memcpy(tail, snake[(*len)-1], 2);
for (i = (*len) - 1; i > 0; --i)
memcpy(snake, snake, 2);
switch (dirx)
{
case 'w': case 'W': --snake; break;
case 's': case 'S': ++snake; break;
case 'a': case 'A': --snake; break;
case 'd': case 'D': ++snake; break;
default: ;
}
if (full)
{
snake = (char **)realloc(snake, sizeof(char *) * ((*len) + 1));
snake[(*len)] = (char *)malloc(sizeof(char) * 2);
memcpy(snake[(*len)], tail, 2);
++(*len);
++score;
if(score < 16)
++score;
tail = 1;
}
else
tail = 0;
return snake;
}
void init(char plate, char ***snake_x, int *len)//初始化
{
int i, j;
char **snake = NULL;
*len = 3;
score = score =3;
snake = (char **)realloc(snake, sizeof(char *) * (*len));
for (i = 0; i < *len; ++i)
snake = (char *)malloc(sizeof(char) * 2);
for (i = 0; i < 3; ++i)
{
snake = N/2 + 1;
snake = N/2 + 1 + i;
}
for (i = 1; i <= N; ++i)
for (j = 1; j <= N; ++j)
plate = 1;
apple = rand()%N + 1; apple = rand()%N + 1;
apple = 1;
for (i = 0; i < N + 2; ++i)
{
gotoxy(0, i);
for (j = 0; j < N + 2; ++j)
{
switch (plate)
{
case 0:
color(12);printf("□");color(11); continue;
case 1: printf("■"); continue;
default: ;
}
}
putchar('\n');
}
for (i = 0; i < (*len); ++i)
{
gotoxy(snake * 2, snake);
printf("★");
}
putchar('\n');
*snake_x = snake;
}
void Manual()
{
gotoxy(N+30,2);
color(10);
printf("按 W S A D 移动方向");
gotoxy(N+30,4);
printf("按 space 键暂停");
gotoxy(N+30,8);
color(11);
printf("历史最高分为: ");
color(12);
gotoxy(N+44,8);
printf("%d",score*10);
color(11);
gotoxy(N+30,12);
printf("你现在得分为: 0");
}
int File_in() //取记录的分数
{
FILE *fp;
if((fp = fopen("C:\\tcs.txt","a+")) == NULL)
{
gotoxy(N+18, N+2);
printf("文件不能打开\n");
exit(0);
}
if((score = fgetc(fp)) != EOF);
else
score = 0;
return 0;
}
int File_out() //存数据
{
FILE *fp;
if(score > score)
{gotoxy(10,10);
color(12);
puts("闯关失败 加油耶");
gotoxy(0,N+2);
return 0;
}
if((fp = fopen("C:\\tcs.txt","w+")) == NULL)
{
printf("文件不能打开\n");
exit(0);
}
if(fputc(--score,fp)==EOF)
printf("输出失败\n");
gotoxy(10,10);
color(12);
puts("恭喜您打破记录");
gotoxy(0,N+2);
return 0;
}
void Free(char **snake, int len) //释放空间
{
int i;
for (i = 0; i < len; ++i)
free(snake);
free(snake);
}
int main(void)
{
int len;
char ch = 'g';
char a = {{0}};
char **snake;
srand((unsigned)time(NULL));
color(11);
File_in();
init(a, &snake, &len);
Manual();
while (ch != 0x1B) // 按 ESC 结束
{
Draw(snake, len);
if (!apple) {
apple = rand()%N + 1;
apple = rand()%N + 1;
apple = 1;
num++;
if(num>8)
num=0;
}
Sleep(200-score*10);
setbuf(stdin, NULL);
if (kbhit())
{
gotoxy(0, N+2);
ch = getche();
}
snake = Move(snake, ch, &len);
if (Block(snake)==1)
{
gotoxy(N+2, N+2);
puts("你输了");
File_out();
Free(snake, len);
getche();
exit(0);
}
}
Free(snake, len);
exit(0);
} 宝妹 发表于 2017-10-31 22:29
另外前辈,这是我找到的另一种关于贪食蛇的源代码,它却可以运行,甚至是在原来那个中文版带乱码的编辑 ...
你好,
这个可以支持,是因为这所用的是windows的VC自带的图形库文件<conio.h><windows.h>,所以可以跑起来没问题。
但貌似graphics.h这个文件是在TC软件里的,是从外面引用进来的吧,程序运行不了,应该是不兼容的问题。 宝妹 发表于 2017-10-31 22:29
另外前辈,这是我找到的另一种关于贪食蛇的源代码,它却可以运行,甚至是在原来那个中文版带乱码的编辑 ...
如果真想用graphics.h文件来画图形的话
可以参照这个看看:http://www.cnblogs.com/geore/p/5914664.html
以及:http://blog.csdn.net/bcbobo21cn/article/details/51207782
weizhongyang 发表于 2017-11-1 15:26
你好,
这个可以支持,是因为这所用的是windows的VC自带的图形库文件,所以可以跑起来没问题。
谢谢!实不相瞒前辈,我现在电脑里面乱乱的,之前随便的安装了一个中文版的VC++编译器后,因为你说有乱码于是又安装了一个英文版的,这次没有乱码,但不兼容,没曾想原来的那个乱码的中文版编译器也不能用了,因为输入了C语言的第一课,您好!世界,已经无法运行了,我现在正在清理E盘,删除所有,然后再重新安装,看看是否能再次运行。{:5_91:}{:5_93:} weizhongyang 发表于 2017-11-1 15:28
如果真想用graphics.h文件来画图形的话
可以参照这个看看:http://www.cnblogs.com/geore/p/5914664.htm ...
今天太晚了,只看到前辈发的第一个网址,在TC编译器里面加了graphics.h文件,但结果如下面的截图,{:5_93:}看来任何事物一开始可能都是欺生的……{:5_92:} 宝妹 发表于 2017-11-1 23:13
今天太晚了,只看到前辈发的第一个网址,在TC编译器里面加了graphics.h文件,但结果如下面的截图,{:5_93 ...
建议好好看看这个:http://www.cnblogs.com/geore/p/5914664.html
里面详细告诉你怎么用graphics.h,有两种方法可以解决此问题,参照一下吧
你可以的,加油{:5_95:} weizhongyang 发表于 2017-11-2 08:59
建议好好看看这个:http://www.cnblogs.com/geore/p/5914664.html
里面详细告诉你怎么用graphics.h,有 ...
思索了一天,觉得这段时间一直不太对劲,不在状态,而且每次下载VC++编译器的时候,总有人打断,谢谢前辈的指点,我可能会休息一二天或者调整好心态再继续学习,在这里给前辈留下言,不回复觉得不太礼貌,祝前辈你工作顺利,身体健康!
页:
[1]