马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
}
|