贪吃蛇-控制台
来源:互联网 发布:网络药品经营管理办法 编辑:程序博客网 时间:2024/05/31 18:40
本文把游戏区域就行编号,第一行从0到WIDTH-1,…… 到HEIGHT-1 到 WIDTH*HEIGHT-1(二维数组)。并用trace[LEN]数组保存snake移动的轨迹(保存的是数值,数值就能表现出所在的行和列),(trace[0]始终为snake的头部),根据display()函数绘图,延时,在绘图,达到刷新屏幕的效果。
#include <stdio.h>#include <stdlib.h>#include <windows.h>#include <time.h>#include <conio.h>#define HEIGHT 10#define WIDTH 10#define LEN HEIGHT*WIDTH/2#define SPEED 800enum moveState{ UP = -1*WIDTH, DOWN = WIDTH, LEFT = -1, RIGHT = 1};int x, y; /* rand point */int trace[LEN] = {0}; /* trace the snake */ moveState ms = UP; /* default UP */int len = 1; /* snake length */void display();void gotoxy(int x, int y);void automove();void randpoint();void gameover();void keyinput();int merge();int main(void){ srand(time(0)); x = rand()%WIDTH; while((y = rand()%HEIGHT) == 0) // y != 0 ; trace[0] = y*WIDTH + x; display(); randpoint(); while(1){ keyinput(); } return 0;}/* goto (x, y) point oisition */void gotoxy(int x, int y){ HANDLE hOut; COORD pos={x, y}; // windows API, 光标位置 hOut=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hOut,pos); // set //SetConsoleTextAttribute(hOut,0x00|0x05);}void display(){ int i, j; gotoxy(0,0); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x00|0x05); // API, set color /* display the bound */ for(i = 0; i < HEIGHT+2; i++){ for(j = 0; j < WIDTH+2; j++){ if(i == 0 || i == HEIGHT+1 || j == 0 || j == WIDTH+1) printf("□"); /* 2 char */ else printf(" "); } printf("\n"); } SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x00|0x06); // API, set color gotoxy(WIDTH*2+4, HEIGHT/3); printf("\t ↑ ← ↓ → space"); gotoxy(WIDTH*2+4, HEIGHT/5*3); printf("\t score: %d", len*100); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x00|0x07); // API, set color /* display the rand point */ gotoxy(2*x+2, y+1); // include bound printf("■"); // 2 char SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x00|0x02); // API, set color /* display the snake */ for(i = 0; i < len; i++){ gotoxy(trace[i]%WIDTH*2+2, trace[i]/WIDTH+1); printf("■"); } Sleep(SPEED); // delay SPEED ms }/* 根据ms的方向进行移位,保存新的路径 */void automove(){ int i; /* shift bit */ for(i = len-1; i > 0; i--){ trace[i] = trace[i-1]; } trace[i] += ms; /* i = 0 */ }/* 合并新的随机点 */int merge(){ int i; int temp = y*WIDTH + x; if(temp == trace[0]){ /* shift bit */ len++; for(i = len-1; i > 0; i--){ trace[i] = trace[i-1]; } trace[i] += ms; /* i = 0 */ return 1; } return 0;}/* born randpoint */void randpoint(){ int i; while(1){ x = rand()%WIDTH; y = rand()%HEIGHT; for(i = 0; i < len; i++) if(y*WIDTH+x == trace[i]) break; if(i == len) return; }}void keyinput(){ int i; while(!kbhit()){ // no keyboard input automove(); if(trace[0] < 1 || trace[0] > HEIGHT*WIDTH || trace[0]%WIDTH == WIDTH-1 && ms == LEFT || trace[0]%WIDTH == 0 && ms == RIGHT) gameover(); for(i = 1; i < len; i++) if(trace[0] == trace[i]) gameover(); if(merge() == 1) randpoint(); display(); } int key = getch(); //获取键盘输入 if(key == 27) exit(0); else if(key == ' '){ // space for Pause while(getch() != ' ') ; } else if(key == 0xE0){ //方向键会产生2个字符 key = getch(); switch(key){ case 0x48: //up ms = UP; break; case 0x4B: //left ms = LEFT; break; case 0x4D: //right ms = RIGHT; break; case 0x50: //down ms = DOWN; break; } } automove(); /* judge out of the bound */ if(trace[0] < 1 || trace[0] > HEIGHT*WIDTH || trace[0]%WIDTH == WIDTH-1 && ms == LEFT || trace[0]%WIDTH == 0 && ms == RIGHT) gameover(); /* judge head touched the body */ for(i = 1; i < len; i++) if(trace[0] == trace[i]) gameover(); if(merge() == 1) randpoint(); display();}void gameover(){ gotoxy(WIDTH/2, HEIGHT/2); printf("you are lost!\n"); gotoxy(0, HEIGHT+2); exit(0);}
0 0
- 控制台 贪吃蛇 游戏
- 控制台简易贪吃蛇
- 控制台版贪吃蛇
- 控制台贪吃蛇
- C++控制台贪吃蛇
- 贪吃蛇-控制台
- 控制台贪吃蛇
- c++控制台贪吃蛇
- 控制台贪吃蛇
- 贪吃蛇~~C++控制台实现!
- 控制台小游戏之贪吃蛇
- 控制台版贪吃蛇java
- 控制台的简单贪吃蛇
- C语言控制台贪吃蛇
- 基于控制台的贪吃蛇小游戏
- 控制台 简单 双链表贪吃蛇的实现
- 控制台c++贪吃蛇的简单实现
- Linux下控制台版贪吃蛇
- 利用百度APIStoreSDK获取Json数据并解析加载到ListView上
- Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果
- R操作mysql 中数据
- 安装Ubuntu时的硬盘分区方案
- C++数组和指针的区别详解
- 贪吃蛇-控制台
- LeetCode #7 Reverse Integer C# Solution
- json特殊字符串处理
- Android IPC机制(五):详解Bundle与“信使”——Messenger
- git github 学习笔记
- 1、cas4.0 单点登录 之 https证书
- 深刻理解Live555源码,掌握这把RTSP,RTP的瑞士军刀
- angularjs 与 springmvc 遇到的一些问题
- 算法导论 第22章 22.1-3