学了大半个月c,写了个贪吃蛇,来炫炫
本帖最后由 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;//地图信息
int snake_x;//蛇x坐标数组
int snake_y;//蛇y坐标数组
int len;//蛇的长度
int food;//果子坐标
int fx={-1,0,1,0,0,-1,0,1};//方向坐标
int fxn;//当前方向
int sd;//控制速度哦,积分越多,速度越快
void chushi(){//初始地图蛇,果子,方向数据
//蛇的位置初始化
snake_x=10;
snake_y=10;
snake_x=9;
snake_y=10;
snake_x=8;
snake_y=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,food);
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=snake_x;
snake_y=snake_y;
}
snake_x=food;
snake_y=food;
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='.';
}
}
ditu]]='; //初始蛇的坐标
for(int i=1;i<len;i++){
ditu]]='0';
}
ditu]]='F';//初始化果子坐标
//打印地图
for(int y=0;y<kd;y++){
for(int x=0;x<kd;x++){
printf("%c ",ditu);
}
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=snake_x;
snake_y=snake_y;
}
snake_x=fx+snake_x;
snake_y=fx+snake_y;
}
}
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==x && snake_y==y ) {
z=0;
break;
}else if( x==food && y==food){
z=0;
break;
}else{
z=1;
}
}
if(z==1){
food=x;
food=y;
// printf("dsfsdf果子坐标为:%d,%d\n",food,food);
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;
int y=snake_y;
x=x+fx;
y=y+fx;
for(int i=0;i<len;i++){//判断是否在蛇身上
if(x==snake_x && y==snake_y){
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 && y==food){//判断是否在果子上面
t=2;
}
}
if(t==1 || t==2){
fxn=n;
}
return t;
} 楼主的代码在VS中编译不通过 黑龍 发表于 2016-1-23 13:15
楼主的代码在VS中编译不通过
{:5_96:}这个我在Dev-c++里面调试的了,VC还不会了!!不知道格式是怎么样的 ligen超越 发表于 2016-1-23 13:54
这个我在Dev-c++里面调试的了,VC还不会了!!不知道格式是怎么样的
我想问问 你是怎么控制蛇的移动的 只改变量不能让蛇移动吧 黑龍 发表于 2016-1-23 14:12
我想问问 你是怎么控制蛇的移动的 只改变量不能让蛇移动吧
只要知道他移动的方向就可以知道下一个点的位置啊,每次只能移动一格 ligen超越 发表于 2016-1-23 14:25
只要知道他移动的方向就可以知道下一个点的位置啊,每次只能移动一格
那他是怎么移动的呢 ligen超越 发表于 2016-1-23 14:25
只要知道他移动的方向就可以知道下一个点的位置啊,每次只能移动一格
那他是怎么移动的呢 黑龍 发表于 2016-1-23 14:28
那他是怎么移动的呢
蛇头的坐标是5,5,如果它向右移动,坐标就是6,5,所以只要知道了方向,就能知道他下一个移动的坐标,蛇身移动,尾部坐标都是他原来上一个点的坐标,我刚才看了下别人写的代码,用什么结链表,我现在还没学到那个地方,我觉得我这个处理也蛮简单的{:10_277:} 我学了那么长时间C,到现在还不会写贪吃蛇,楼主你厉害啊 ligen超越 发表于 2016-1-23 14:42
蛇头的坐标是5,5,如果它向右移动,坐标就是6,5,所以只要知道了方向,就能知道他下一个移动的坐标,蛇 ...
可你是怎么让蛇移动的呢 不是说坐标 就让蛇移动 zlh 发表于 2016-1-23 14:54
我学了那么长时间C,到现在还不会写贪吃蛇,楼主你厉害啊
谢谢夸赞!!!!{:10_279:} 黑龍 发表于 2016-1-23 15:13
可你是怎么让蛇移动的呢 不是说坐标 就让蛇移动
数据更新(包括蛇的坐标),再重新打印一次,就实现了一次移动啊,就是闪烁!不知道怎么解决了 ligen超越 发表于 2016-1-23 15:31
数据更新(包括蛇的坐标),再重新打印一次,就实现了一次移动啊,就是闪烁!不知道怎么解决了
....我翻遍了你的代码都没看到闪烁 看看 黑龍 发表于 2016-1-23 14:12
我想问问 你是怎么控制蛇的移动的 只改变量不能让蛇移动吧
我也搞不懂怎么让蛇移动 zlh 发表于 2016-1-23 19:26
我也搞不懂怎么让蛇移动
我没有在他的代码里看到任何让蛇移动的代码
除了坐标 zlh 发表于 2016-1-23 19:26
我也搞不懂怎么让蛇移动
不过我发现我不太适合写游戏 。。你总这么写游戏 不写写别的软件啥的? 黑龍 发表于 2016-1-23 19:57
不过我发现我不太适合写游戏 。。你总这么写游戏 不写写别的软件啥的?
我也写过其他的呀,什么学生成绩管理系统之类的 写的不错,支持一下
很厉害啊,你是怎么做到这么高效率的,我感觉我学了一段时间C语言都不知道如何写游戏
页:
[1]
2