|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 ligen超越 于 2016-1-23 17:54 编辑
希望大神改进下啦,从键盘获取字符,到操控蛇运动,这个困扰了我很久,准备多线程的,但是还没学,所以用了很笨的方法;
- #include <iostream>
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- #include <conio.h>
- #include <windows.h>
- #define kd 20//坐标长度
- /* run this program using the console pauser or add your own getch, system("pause") or input loop */
- void chushi();//初始化画数据
- void print_ditu();//打印地图
- void move(int n);//移动 (移动方向)
- char jieshou();//接受字符输入,直到接受到字符才返回;
- void scgz();//生产随机果子
- int qdqfx();//取当前方向
- int jiance(int n);//检测当前移动是否正确 返回0,这个非法移动,返回1,移动是正确的 ,返回-1游戏失败
- char ditu[kd][kd];//地图信息
- int snake_x[kd*kd];//蛇x坐标数组
- int snake_y[kd*kd];//蛇y坐标数组
- int len;//蛇的长度
- int food[2];//果子坐标
- int fx[8]={-1,0,1,0,0,-1,0,1};//方向坐标
- int fxn;//当前方向
- int sd;//控制速度哦,积分越多,速度越快
- void chushi(){//初始地图蛇,果子,方向数据
- //蛇的位置初始化
- snake_x[0]=10;
- snake_y[0]=10;
- snake_x[1]=9;
- snake_y[1]=10;
- snake_x[2]=8;
- snake_y[2]=10;
- len=3;//蛇的开始长度
- scgz();//生产随机果子
- fxn=2;//初始方向是向右边
- system("cls");//清屏专用
- printf("请选择难度,1简单,2普通,3难,4很难\n");
- char nd=jieshou();
- if(nd=='1'){
- sd=800;
- }else if(nd=='2'){
- sd=600;
- }else if(nd=='3'){
- sd=400;
- }else if(nd=='4'){
- sd=200;
- }else{
- sd=500;//没有正确选择的初始一个中度的难度
- }
- }
- int main(int argc, char** argv) {
- chushi();//初始化一些数据
-
-
- while(1){
-
- system("cls");//清屏专用
- print_ditu();//打印地图
- printf("请用A D W S 调控!“+”加号键盘为暂停和继续\n");
- printf("你当前的积分为:%d\n",(len-3)*10);
-
- Sleep(sd);
- //printf("果子坐标为:%d,%d\n",food[0],food[1]);
- int yx;//取当前状态
- yx= qdqfx();
- if(yx==4){//游戏暂停哦
- printf("请安“+”加号键继续!!");
- while(jieshou()!='+'){//游戏继续啦
- }
- }else{
- int zt;//取当前控制符的状态 赋值给临时变量
- zt=jiance(yx);
-
- if(zt==-1){//移动失败
- system("cls");//清屏专用
- printf("游戏失败啦!你当前的积分为:%d\n",(len-3)*10);
- printf("继续游戏请按“1”,其他键退出");
- char yy;
- yy=jieshou();
-
- if(yy=='1'){
- chushi();//初始化数据,再重头开始
- continue;
- } else{
- break;
- }
-
- }else if(zt==1 || zt==0){//移动正常
- move(fxn);
- }else if(zt==2){//吃到了果子
-
- len=len+1;
- for(int i=0;i<len-1;i++){
- snake_x[len-i-1]=snake_x[len-i-2];
- snake_y[len-i-1]=snake_y[len-i-2];
- }
- snake_x[0]=food[0];
- snake_y[0]=food[1];
- scgz();
- //这边的难度可以自己设计,具体的我没有深究过
- sd=sd*19/20;
- }
- }
-
-
-
-
- }
- return 0;
- }
- void print_ditu(){//打印地图哦!
-
- // 初始化地图
- for(int y=0;y<kd;y++){
- for(int x=0;x<kd;x++){
- ditu[x][y]='.';
- }
- }
- ditu[snake_x[0]][snake_y[0]]='; //初始蛇的坐标
- for(int i=1;i<len;i++){
- ditu[snake_x[i]][snake_y[i]]='0';
- }
-
- ditu[food[0]][food[1]]='F';//初始化果子坐标
- //打印地图
- for(int y=0;y<kd;y++){
- for(int x=0;x<kd;x++){
- printf("%c ",ditu[x][y]);
- }
- printf("\n");
- }
- }
- int qdqfx(){//取当前方向坐标
- char f='\0';
- int n=kbhit();
- if(n){
- f=getch();
- while(kbhit()){
- getch();
- }
- }
- n=-1;
- if(f=='a'){
- n=0;
- }else if(f=='w'){
- n=1;
- }else if(f=='d'){
- n=2;
- }else if(f=='s'){
- n=3;
- }else if(f=='\0'){
- n=fxn;//还是原来的fxn方向
- }else if(f=='+'){
- n=4;//这个是暂停继续
- }else{
- n=fxn;
- }
- return n;
- }
- void move(int n){
- //针对蛇的坐标移动
- if(n>=0){
-
- for(int i=0;i<len-1;i++){
- snake_x[len-i-1]=snake_x[len-i-2];
- snake_y[len-i-1]=snake_y[len-i-2];
-
- }
-
- snake_x[0]=fx[n]+snake_x[1];
- snake_y[0]=fx[n+4]+snake_y[1];
-
-
- }
- }
- char jieshou(){//接受字符输入,直到接受到字符才返回; //BUG多多,这一块不知道怎么解决
- while( !kbhit() ){
- Sleep(2);
- }
- char ls=getch();
-
- while(kbhit()){
- getch();
- }
- return ls;
-
- }
- void scgz(){//生产随机果子
-
- int x,y;//零时的值
- int z;//是否成功生产
- int send=(int)time(NULL);
- srand(send);//置随机种子
- while(1){
- x=rand()%(kd-1);
- y=rand()%(kd-1);
- for(int i=0;i<len;i++){
- if(snake_x[i]==x && snake_y[i]==y ) {
- z=0;
- break;
- }else if( x==food[0] && y==food[1]){
- z=0;
- break;
- }else{
- z=1;
- }
- }
- if(z==1){
- food[0]=x;
- food[1]=y;
- // printf("dsfsdf果子坐标为:%d,%d\n",food[0],food[1]);
- break;
- }
- }
- }
- int jiance(int n){//返回0,这个非法移动,返回1,移动是正确的 ,返回-1游戏失败 返回2吃到了果子
- //printf("n的值为:%d\n",n);
-
- int t=1;//看状态
- int s; //临时值
-
- s=n-fxn;
- if(s<0){//取绝对值
- s=-s;
- }
- //printf("s的值为:%d, n的值为:%d,fxn的值为:%d\n",s,n,fxn);
- if(s==2){
- t=0;
- }else{
- //printf("n的值为:%d\n",n);
- int x=snake_x[0];
- int y=snake_y[0];
-
- x=x+fx[n];
- y=y+fx[n+4];
- for(int i=0;i<len;i++){//判断是否在蛇身上
- if(x==snake_x[i] && y==snake_y[i]){
- t=-1;
- break;
- }
- }
- //printf("x的值为:%d,y的值为:y%d\n",x,y);
- if(!(x>=0 && x<kd && y>=0 && y<kd)){//判断是否在边界
- t=-1;
- }
- if(x==food[0] && y==food[1]){//判断是否在果子上面
- t=2;
- }
- }
-
- if(t==1 || t==2){
- fxn=n;
- }
-
- return t;
- }
复制代码 |
-
评分
-
查看全部评分
|