/*
* main.c (1.0)
* 贪吃蛇游戏主要逻辑与界面的实现
*
* By Eric-JR Chen
* diamont1001@163.com
* 2011年2月
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "main.h"
/* 游戏资源 */
const char *BG = "■";
const char *BODY = "○";//"□";//"●";//"█";
const char *BODY_HEAD = "㊣";
const char *BODY_FOOD = "☆";//"◆";
static STATUS sys_gs; //游戏状态
static DIRECTION sys_dir; //当前方向
static int sys_speed = 100; //速度
//纹理缓存
static SHOWNODE showBuff[ROW*COL*2];
static int BuffIndex = 0;
//游戏分数
static int TotalScore = 0;
/* SHOW WELCOME */
void showWelcome(void){
printf("\t\t******************************************\n");
printf("\t\t* Welcome to Snake Gameing. *\n");
printf("\t\t* By Eric-JR Chen 2011-2 *\n");
printf("\t\t* diamont1001@163.com *\n");
printf("\t\t* 【1~9】Start in Level 1~9 *\n");
printf("\t\t* 【Enter】 Start in default *\n");
printf("\t\t* 【Esc】 Esc *\n");
printf("\t\t******************************************\n");
JR_SetCursor(0,8);
}
/* 将一个 NODE放到纹理缓冲区 */
void showInBuff(SHOWNODE buffer){
showBuff[BuffIndex].x = buffer.x;
showBuff[BuffIndex].y = buffer.y;
strcpy(showBuff[BuffIndex].text, buffer.text);
BuffIndex ++;
}
/* 将snake尾部清空 */
void blackTail(){
strcpy(pSnakeHead->node.text, BG);
showInBuff(pSnakeHead->node);
DelSNode();
}
/* 显示背景 */
void showBG(void){
int i = 0, j = 0;
char backshow[10];
strcpy(backshow, BG);
JR_SetCursorStart();
for(i=0; i<ROW; i++){
for(j=0; j<COL; j++){
printf("%s", backshow);
}
printf("\t\t\t\n");
}
JR_SetCursor(COL*2+1, 0);
printf("Score : %d", TotalScore);
JR_SetCursor(COL*2+1, 1);
printf("Speed : %d", sys_speed);
JR_SetCursor(COL*2+1, 3);
printf("UP :【↑】【W】【w】");
JR_SetCursor(COL*2+1, 4);
printf("LEFT :【←】【A】【a】");
JR_SetCursor(COL*2+1, 5);
printf("DOWN :【↓】【S】【s】");
JR_SetCursor(COL*2+1, 6);
printf("RIGHT:【→】【D】【d】");
JR_SetCursor(COL*2+1, 8);
printf("PAUSE :【ENTER】");
JR_SetCursor(COL*2+1, 9);
printf("RESUME:【ENTER】");
JR_SetCursor(COL*2+1, 10);
printf("ESC :【ESC】");
}
/* 游戏显示 */
void show(void){
if(sys_gs == GAMING){
int i = 0;
if(BuffIndex == 0) return ;
for(i=0; i<BuffIndex; i++){
JR_SetCursor(showBuff[i].x, showBuff[i].y);
printf("%s", showBuff[i].text);
}
BuffIndex = 0;
JR_SetCursor(0, COL+1);
}
}
/* 开始新游戏 */
void startGame(void){
SNAKE ps;
showBG();
InitSnake(4);
BuffIndex = 0;
TotalScore = 0;
ps = pSnakeHead;
while(ps){
showInBuff(ps->node);
ps = ps->next;
}
GetFood();
showInBuff(FOOD);
JR_SetCursor(0, ROW+2);
printf("Food : %d, %d, %s\t", FOOD.x, FOOD.y, FOOD.text);
sys_dir = RIGHT;
setTimer(sys_speed);
startTimer();
}
/* Game over */
void gameOver(){
DeleteSnake();
}
/* 游戏初始化 */
void initGame(void){
setTimer(33);
startTimer();
sys_gs = WELCOME;
showWelcome();
}
/* 按键检测 */
void updateKey(void){
if(!JR_AnyKeys()) return ;
if(JR_IsKeyDown(JR_KEY_ESC)){ //ESC
sys_gs = STOP;
exit(0);
}
switch(sys_gs){
case WELCOME :
case DIE:
//START GAME
if(JR_IsKeyDown(JR_KEY_ENTER)){
stopTimer();
sys_gs = GAMING;
JR_SetCursor(COL*2+9, 1);
printf("%d", sys_speed);
startGame();
}
else if(JR_GetKeyNum() >= '1' && JR_GetKeyNum() <= '9'){
sys_speed = 200 - (JR_GetKeyNum()-'0') * 18;
stopTimer();
sys_gs = GAMING;
showBG();
JR_SetCursor(COL*2+9, 1);
printf("%d", sys_speed);
startGame();
}
break;
case GAMING :
if(JR_IsKeyDown(JR_KEY_ENTER)){ //PAUSE
sys_gs = PAUSE;
printf("Pause! 【Enter】to continue!【Esc】to esc!\t");
JR_SetCursor(0, ROW+1);
}else if(JR_IsKeyDown(JR_KEY_UP) || JR_IsKeyDown('w') || JR_IsKeyDown('W')){
if(sys_dir == LEFT || sys_dir == RIGHT){
sys_dir = UP;
}
}else if(JR_IsKeyDown(JR_KEY_DOWN) || JR_IsKeyDown('s') || JR_IsKeyDown('S')){
if(sys_dir == LEFT || sys_dir == RIGHT){
sys_dir = DOWN;
}
}else if(JR_IsKeyDown(JR_KEY_LEFT) || JR_IsKeyDown('a') || JR_IsKeyDown('A')){
if(sys_dir == UP || sys_dir == DOWN){
sys_dir = LEFT;
}
}else if(JR_IsKeyDown(JR_KEY_RIGHT) || JR_IsKeyDown('d') || JR_IsKeyDown('D')){
if(sys_dir == UP || sys_dir == DOWN){
sys_dir = RIGHT;
}
}
break;
case PAUSE :
if(JR_IsKeyDown(JR_KEY_ENTER)){ //resume
sys_gs = GAMING;
printf("Continue!\t\t\t\t\t\t");
JR_SetCursor(0, ROW+1);
}
break;
case STOP:
break;
}
}
/* 更新snake */
void updateSnake(void){
SNAKE ps = NULL;
if(sys_gs != GAMING) return ;
//还原BODY
strcpy(pSnakeTail->node.text, BODY);
showInBuff(pSnakeTail->node);
ps = malloc(sizeof(SNAKENODE));
switch(sys_dir){
case UP:
ps->node.x = pSnakeTail->node.x;
ps->node.y = pSnakeTail->node.y - 1;
break;
case DOWN:
ps->node.x = pSnakeTail->node.x;
ps->node.y = pSnakeTail->node.y + 1;
break;
case LEFT:
ps->node.x = pSnakeTail->node.x - 2;
ps->node.y = pSnakeTail->node.y;
break;
case RIGHT:
ps->node.x = pSnakeTail->node.x + 2;
ps->node.y = pSnakeTail->node.y;
break;
}
strcpy(ps->node.text, BODY);
AddSNode(ps);
showInBuff(ps->node);
if(pSnakeTail->node.x != FOOD.x || pSnakeTail->node.y != FOOD.y){
blackTail();
}else{
TotalScore ++;
JR_SetCursor(COL*2+9, 0);
printf("%d", TotalScore);
GetFood();
showInBuff(FOOD);
JR_SetCursor(0, ROW+2);
printf("Food : %d, %d, %s\t", FOOD.x, FOOD.y, FOOD.text);
}
if(!checkSnake()){
sys_gs = DIE;
gameOver();
printf("Game Over! 【1~9】or【Enter】 to continue!【Esc】to esc!\t");
JR_SetCursor(0, ROW+1);
}
}
/* 定时器中的功能实现,在ontimer()中自动定时调用 */
void mainTimer(void){
updateKey();
updateSnake();
show();
}
int main()
{
initGame();
while(1){
ontimer(); //定时器处理函数,功能实现在mainTimer()
}
gameOver();
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
C语言写的字符界面贪吃蛇(原创)- 不闪屏
共27个文件
o:12个
h:6个
c:6个
5星 · 超过95%的资源 需积分: 44 73 下载量 123 浏览量
2011-02-21
10:07:21
上传
评论 9
收藏 29KB RAR 举报
温馨提示
之前在网上下载了几位网友的贪吃蛇,看了下,觉得屏幕好闪,因为他们很多人都是用system("cls")来刷新屏幕的,所以难免会闪。在下一时兴致大发,也写了个,用WIN—API函数来控制光标输出,去除了闪屏的问题。有需要的童鞋欢迎下载交流。^_^ 1.该小游戏并没有引用到任何第三方库,完全是调用标准C的库函数和WIN-API函数的。 2.该小游戏引用到之前封装好的几个函数:定时器、随机数、键盘响应、光标移动,所以也可以作为以上几个函数的一个例子。 3.字符界面:屏幕根据“按需刷新”原则,每次只是刷新有变化的区域。总体上个人感觉还不错啦,哈哈!莫喷…… 4.代码设计:状态加定时器驱动,个人感觉可以满足大多数单线程小游戏的开发。 环境:code::blocks + MinGW PS:有的朋友用VS或者VC打开,发现编译不过,是因为编译器不同,VS要求比较严格,声明和定义一定要放到前面,解决方法:在JR_timer.c里面,把以下这句放到函数或者文件的前面就行了: extern void mainTimer();
资源推荐
资源详情
资源评论
收起资源包目录
JR_Snake.rar (27个子文件)
JR_Snake
bin
JR_Random.c 912B
JR_KeyBoard.c 880B
JR_Snake.layout 1KB
main.c 7KB
obj
Release
JR_Cursor.o 1KB
JR_KeyBoard.o 707B
JR_timer.o 782B
JR_Random.o 967B
main.o 6KB
snake.o 2KB
Debug
JR_Cursor.o 5KB
JR_KeyBoard.o 2KB
JR_timer.o 3KB
JR_Random.o 3KB
main.o 13KB
snake.o 7KB
JR_Cursor.c 2KB
JR_timer.h 403B
snake.h 1KB
JR_KeyBoard.h 1KB
JR_Snake.depend 2KB
JR_Random.h 327B
snake.c 3KB
JR_timer.c 821B
main.h 507B
JR_Cursor.h 543B
JR_Snake.cbp 2KB
共 27 条
- 1
资源评论
- 5326994232014-06-10还有点闪屏,但是好多了,用gcc也可以编译,感谢分享
- nnnhhhyyy5202013-05-14内容清晰,不错~
- itongle2013-11-16写的很有指导作用,学习了
- guyj932014-05-06很不错,感谢分享,正好在学习这个~
- 擦梦的曲率2013-10-25非常不错,对新手有指导作用
可乐崽
- 粉丝: 41
- 资源: 24
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功