贪吃蛇源代码(低配版)
来源:互联网 发布:b2c网络建站 编辑:程序博客网 时间:2024/06/09 23:07
这个代码是刚学完C语言在没看任何别人贪吃蛇代码情况下,纯粹按自己理解写出来的。用了三天时间吧,反正没事就想。用数组搞定,成功运行后自己很开心,觉得自己很牛B,但实际的游戏体验并不好,用cls清屏,屏幕狂闪。后来在网上找到了原因,说用双缓冲能解决。但是看了半天也没理解。倒是误打误撞用一个重新定位光标的方法解决了(这游戏画面不好,只能说有贪吃蛇的最基本功能)。后面去看了别人家的代码,才知道自己要改进的地方太多了。
/***********************************************程序名称:贪吃蛇游戏*作者相关:Neal Caffrey(893399065)*修改时间:2017-05-14***********************************************/#include <stdio.h>#include <windows.h>#include <time.h>#include <conio.h>/**************宏定义区*****************/#define HIGH 20#define WIDTH 40#define BLANK 32#define HEAD 1#define BOODY 2#define FOOD 3#define WALL 4/***************结构体定义区************/typedef struct INFO { int x; int y; struct INFO *next;} SNAKE;void Initialize(char data[HIGH][WIDTH]); //初始化SNAKE *Beign(char data[HIGH][WIDTH], char *direction); //开始SNAKE *Find_Tail(SNAKE *head); //找尾巴SNAKE Food(char data[HIGH][WIDTH]); //随机产生食物char Option(char direction); //操作SNAKE *Move(char data[HIGH][WIDTH], SNAKE *head, char direction,SNAKE *food); //移动void Display(char data[HIGH][WIDTH]); //显示void Free_Snake(SNAKE *head); //释放链表int Game();int main(void) { char sign; system("color 81"); Game(); return 0;}int Game() { int i, j; char data[HIGH][WIDTH]; char direction; SNAKE *head; SNAKE food; Initialize(data); head = Beign(data, &direction); food = Food(data); HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); COORD coord = {0,0}; CONSOLE_CURSOR_INFO cci; cci.bVisible=0; cci.dwSize=1; SetConsoleCursorInfo(handle, &cci); while(1) { direction = Option(direction); if((head = Move(data, head, direction, &food)) == NULL) { getch(); return 1; } Display(data); SetConsoleCursorPosition(handle, coord); Sleep(200); }}/*初始化*/void Initialize(char data[HIGH][WIDTH]) { int i, j; for(i=0; i<HIGH; i++) { for(j=0; j<WIDTH-1; j++) data[i][j] = WALL; //墙 data[i][j] = '\0'; } for(i=1; i<HIGH-1; i++) for(j=1; j<WIDTH-2; j++) data[i][j] = BLANK; //空白}/*开始*/SNAKE* Beign(char data[HIGH][WIDTH],char *direction) { int x, y; int i; SNAKE *head, *p1, *p2; int random; head = (SNAKE *)malloc(sizeof(SNAKE)); srand(time(NULL)); x = rand()%(HIGH-4)+2; y = rand()%(WIDTH-10)+5; head->x = x; head->y = y; data[head->x][head->y] = HEAD; p1 = head; for(i=1; i<3; i++) { p2 = (SNAKE *)malloc(sizeof(SNAKE)); p2->x = x; p2->y = y-i; p1->next = p2; p1 = p2; } p2->next = head; *direction = 'd'; return head;}SNAKE *Find_Tail(SNAKE *head) { SNAKE *p1; p1 = head; do { p1 = p1->next; } while(p1->next != head); return p1;}SNAKE Food(char data[HIGH][WIDTH]) { int x, y; SNAKE food; while(1) { srand(time(NULL)); x = rand()%HIGH; y = rand()%WIDTH; if(data[x][y] == BLANK) { food.x = x; food.y = y; data[x][y] = FOOD; return food; } }}char Option(char direction) { char temp ; if(kbhit() != 0) { while(kbhit() != 0) temp = getch(); switch(temp) { case 'w': if(direction == 's') return direction; direction = temp; break; case 's': if(direction == 'w') return direction; direction = temp; break; case 'a': if(direction == 'd') return direction; direction = temp; break; case 'd': if(direction == 'a') return direction; direction = temp; break; default: break; } } return direction;}SNAKE *Move(char data[HIGH][WIDTH], SNAKE *head, char direction,SNAKE *food) { SNAKE *tail, *p1; tail = Find_Tail(head); SNAKE temp; switch(direction) { case 'w': { temp.x = (head)->x-1; temp.y = (head)->y; break; } case 's': { temp.x = (head)->x+1; temp.y = (head)->y; break; } case 'a': { temp.x = (head)->x; temp.y = (head)->y-1; break; } case 'd': { temp.x = (head)->x; temp.y = (head)->y+1; break; } } if(data[temp.x][temp.y] == BLANK) { data[temp.x][temp.y] = HEAD; data[head->x][head->y] = BOODY; data[tail->x][tail->y] = BLANK; } else if(data[temp.x][temp.y] == FOOD) { p1 = (SNAKE*)malloc(sizeof(SNAKE)); p1->x = temp.x; p1->y = temp.y; *food = Food(data); p1->next = head; tail->next = p1; data[temp.x][temp.y] = HEAD; data[head->x][head->y] = BOODY; data[tail->x][tail->y] = BOODY; return p1; } else {// system("cls"); printf("\n\n\n\n\n\n\n\n\n\n\n\n\nYou have died!\n"); Free_Snake(head); return NULL; } tail->x = temp.x; tail->y = temp.y; return tail;}void Display(char data[HIGH][WIDTH]) { int i; for(i=0; i<HIGH; i++) puts(data[i]);}void Free_Snake(SNAKE *head) { SNAKE *p1; SNAKE *p2; p2 = head; do { p1 = head; head = head->next; free(p1); } while(head != p2);}
-
阅读全文
0 0
- 贪吃蛇源代码(低配版)
- 贪吃蛇游戏的源代码(汇编)
- 简易贪吃蛇(JAVA版)源代码
- 贪吃蛇源代码
- 贪吃蛇源代码
- opengl贪吃蛇源代码
- python贪吃蛇源代码
- C++贪吃蛇源代码
- 贪吃蛇源代码分析
- MFC贪吃蛇+源代码
- java贪吃蛇源代码
- 贪吃蛇源代码
- C++贪吃蛇源代码
- C++贪吃蛇源代码
- java贪吃蛇源代码
- 贪吃蛇java源代码
- 贪吃蛇源代码
- 贪吃蛇java源代码
- 在Android中使用Lambda表达式
- 矩估计法
- SpringMVC登陆小demo
- LeetCode 3. Longest Substring Without Repeating Characters
- 最小二乘法-回归问题中的作用
- 贪吃蛇源代码(低配版)
- Python 之os.walk()
- Srping学习笔记之AOP
- 程序小白---File文件类的使用
- 设计模式笔记
- 求链表中倒数第K个结点
- 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
- CStdioFile
- sorl5.5导入mysql数据库中数据