关于贪吃蛇代码的两个问题

gzg9901 2010-03-06 09:43:15

这是网上下载的一段贪吃蛇的C源码,请问

1,函数setCursorVisible,setConsoleTitle,gotoTextPos是C语言的标准库函数吗,
怎么源程序中只有申明没有内容。
2.common头文件(该文件内容在下面有)中的typedef unit8 bool是不是有问题啊,bool不是布尔类型吗,这能定义成unit8?

文件snake.c的主函数如下:(除了列举的三个函数,其他调用函数都有实体)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "pcc32.h"
#include "jkey32.h"

int main()
{
int isPause = 1;
setCursorVisible(0);
setConsoleTitle("Snake by RedOC. 2009.06.27");
initSnake(SNAKE_MIN_LEN);
drawMap();
drawSnake();
while (!isOver)
{
if (!isPause)
{
moveSnake();
if (!isFood)
drawFood();
}
delayMS(200 - snakeLength*2);
if (jkHasKey())
{
switch (jkGetKey())
{
case JK_UP:
if (snakeDir != DIR_DOWN)
snakeDir = DIR_UP;
break;
case JK_DOWN:
if (snakeDir != DIR_UP)
snakeDir = DIR_DOWN;
break;
case JK_LEFT:
if (snakeDir != DIR_RIGHT)
snakeDir = DIR_LEFT;
break;
case JK_RIGHT:
if (snakeDir != DIR_LEFT)
snakeDir = DIR_RIGHT;
break;
case JK_ESC:
case JK_ENTER:
case JK_SPACE:
isPause = !isPause;
break;
default:
break;
}
}
}
gotoTextPos(MAP_BASE_X + MAP_WIDTH - 7, MAP_BASE_Y + MAP_HEIGHT + 1);
printf("Game Over! Score: %d.", snakeLength - SNAKE_MIN_LEN);
getch();
return 0;
}


文件common.h的内容为:
#ifndef COMMON_H_INCLUDED
#define COMMON_H_INCLUDED

typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned int uint32;
typedef uint8 bool;

#endif // COMMON_H_INCLUDED

顺便交代一下,common.h用#include包含在pcc32.h和jkey32.h中
...全文
1014 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
AAA20090987 2010-10-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 chensanmu 的回复:]

#include <graphics.h>这个库函数要报错的。它说No such ......
[/Quote]

这好像是TC里的吧,VC和GCC里是没有的
AAA20090987 2010-10-03
  • 打赏
  • 举报
回复
我前几天刚写过一个linux curses版的贪吃蛇
http://topic.csdn.net/u/20101001/01/2280b2dd-1446-439d-b1f8-cdd9db1fd615.html?88898
希望对你有帮忙
chensanmu 2010-10-03
  • 打赏
  • 举报
回复
#include <graphics.h>这个库函数要报错的。它说No such ......
大道曙光 2010-10-02
  • 打赏
  • 举报
回复
楼主 我看过这个代码 pcc32.h的确是作者自定义的头文件
原文地址:
http://hi.baidu.com/popapple/blog/item/80c4fffafd1cdad7b58f314c.html
iLoveVicki 2010-05-29
  • 打赏
  • 举报
回复
4楼的代码在WIN-TC下能编译运行,蛇移动的算法:

for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}

如果换成链表,效率应该会高些。
cjp801 2010-04-02
  • 打赏
  • 举报
回复
问下

#define JK_FUNC_KEY 0x00
#define JK_CTRL_KEY 0xE0

#define JK_ESC 0x001B
#define JK_ENTER 0x000D
#define JK_SPACE 0x0020
#define JK_BKSPACE 0x0008
#define JK_TAB 0x0009

#define JK_CTRL_Z 0x001A
#define JK_CTRL_X 0x0018
#define JK_CTRL_C 0x0003
#define JK_CTRL_A 0x0001
#define JK_CTRL_S 0x0013
#define JK_CTRL_D 0x0004

#define JK_LEFT 0xE04B
#define JK_RIGHT 0xE04D
#define JK_UP 0xE048
#define JK_DOWN 0xE050
#define JK_INSERT 0xE052
#define JK_HOME 0xE047
#define JK_PGUP 0xE049
#define JK_DELETE 0xE053
#define JK_END 0xE04F
#define JK_PGDW 0xE051

#define JK_F1 0xFF3B
#define JK_F2 0xFF3C
#define JK_F3 0xFF3D
#define JK_F4 0xFF3E
#define JK_F5 0xFF3F
#define JK_F6 0xFF40
#define JK_F7 0xFF41
#define JK_F8 0xFF42
#define JK_F9 0xFF43
#define JK_F10 0xFF44
#define JK_F11 0xE085
#define JK_F12 0xE086
这些宏定义是根据什么定义的
shashenyidaoOCEAN 2010-03-07
  • 打赏
  • 举报
回复
你这个也不能再VC++6.0中用的
引用 4 楼 huanmie_09 的回复:
1、标准库里没有这些函数,应该是作者自定义的一些函数.
2、C语言里本身没有bool这种布尔类型。有些编译器可以识别,是因为编译器自己定义了bool类型,比如:#define bool int。

附上我以前在网上找的并运行成功的贪吃蛇代码,运行环境tc 2.01,供楼主参考:
C/C++ code#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 0x011bint i,key;int score=0;/*得分*/int gamespeed=50000;/*游戏速度自己调整*/struct Food
{int x;/*食物的横坐标*/int y;/*食物的纵坐标*/int yes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/struct Snake
{int x[N];int y[N];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;
registerbgidriver(EGAVGA_driver);
initgraph(&gd,&gm,"");
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[0]=100;snake.y[0]=100;/*蛇头*/
snake.x[1]=110;snake.y[1]=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[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/switch(snake.direction)
{case1:snake.x[0]+=10;break;case2: snake.x[0]-=10;break;case3: snake.y[0]-=10;break;case4: snake.y[0]+=10;break;
}for(i=3;i<snake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
{if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{
GameOver();/*显示失败*/
snake.life=1;break;
}
}if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||
snake.y[0]>455)/*蛇是否撞到墙壁*/
{
GameOver();/*本次游戏结束*/
snake.life=1;/*蛇死*/
}if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/break;if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/
{
setcolor(0);/*把画面上的食物东西去掉*/
rectangle(food.x,food.y,food.x+10,food.y-10);
snake.x[snake.node]=-20;snake.y[snake.node]=-20;/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++;/*蛇的身体长一节*/
food.yes=1;/*画面上需要出现新的食物*/
score+=10;
PrScore();/*输出新得分*/
}
setcolor(4);/*画出蛇*/for(i=0;i<snake.node;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的的最后一节*/
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);
}/*endwhile(!kbhit)*/if(snake.life==1)/*如果蛇死就跳出循环*/break;
key=bioskey(0);/*接收按键*/if(key==ESC)/*按ESC键退出*/break;elseif(key==UP&&snake.direction!=4)/*判断是否往相反的方向移动*/
snake.direction=3;elseif(key==RIGHT&&snake.direction!=2)
snake.direction=1;elseif(key==LEFT&&snake.direction!=1)
snake.direction=2;elseif(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[10];
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();
}
musiclee 2010-03-07
  • 打赏
  • 举报
回复
我有java版的贪吃蛇源码
huanmie_09 2010-03-06
  • 打赏
  • 举报
回复
1、标准库里没有这些函数,应该是作者自定义的一些函数.
2、C语言里本身没有bool这种布尔类型。有些编译器可以识别,是因为编译器自己定义了bool类型,比如:#define bool int。

附上我以前在网上找的并运行成功的贪吃蛇代码,运行环境tc 2.01,供楼主参考:

#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=50000;/*游戏速度自己调整*/
struct Food
{
int x;/*食物的横坐标*/
int y;/*食物的纵坐标*/
int yes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/
struct Snake
{
int x[N];
int y[N];
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;
registerbgidriver(EGAVGA_driver);
initgraph(&gd,&gm,"");
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[0]=100;snake.y[0]=100;/*蛇头*/
snake.x[1]=110;snake.y[1]=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[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
switch(snake.direction)
{
case 1:snake.x[0]+=10;break;
case 2: snake.x[0]-=10;break;
case 3: snake.y[0]-=10;break;
case 4: snake.y[0]+=10;break;
}
for(i=3;i <snake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
{
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{
GameOver();/*显示失败*/
snake.life=1;
break;
}
}
if(snake.x[0] <55||snake.x[0]>595||snake.y[0] <55||
snake.y[0]>455)/*蛇是否撞到墙壁*/
{
GameOver();/*本次游戏结束*/
snake.life=1; /*蛇死*/
}
if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
break;
if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/
{
setcolor(0);/*把画面上的食物东西去掉*/
rectangle(food.x,food.y,food.x+10,food.y-10);
snake.x[snake.node]=-20;snake.y[snake.node]=-20;
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++;/*蛇的身体长一节*/
food.yes=1;/*画面上需要出现新的食物*/
score+=10;
PrScore();/*输出新得分*/
}
setcolor(4);/*画出蛇*/
for(i=0;i <snake.node;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的的最后一节*/
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
snake.x[snake.node-1]+10,snake.y[snake.node-1]-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[10];
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();
}

柯本 2010-03-06
  • 打赏
  • 举报
回复
VC6 已定义了bool类型,所以不能再用
typedef unit8 bool
定义了
gzg9901 2010-03-06
  • 打赏
  • 举报
回复
bool型在vc++6.0中不能被编译器改动吗?

我用的vc++6.0,编译的时候出错,错误信息如下
--------------------Configuration: qqqqq - Win32 Debug--------------------
Compiling...
qqqqq.cpp
c:\program files\microsoft visual studio\myprojects\qqqqq\common.h(11) : error C2371: 'bool' : redefinition; different basic types
c:\program files\microsoft visual studio\myprojects\qqqqq\stdafx.cpp(0) : see declaration of 'bool'
Error executing cl.exe.

qqqqq.exe - 1 error(s), 0 warning(s)
柯本 2010-03-06
  • 打赏
  • 举报
回复
1.不是标准的库函数,与编译器及系统有关
2.bool型一般在编译器中可以表示成整型或单字节型,它是为了提高效率,如果用bit表示,一般的CPU对bit型运算效率没有整型或单字节型高

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧