C语言贪吃蛇,浅AI

Cplusplus
回复
happy886rr
渐入佳境
渐入佳境
帖子: 45
注册时间: 2016年09月27日 16:11
联系:

C语言贪吃蛇,浅AI

帖子 happy886rr »

C语言写的贪吃蛇,只给它添加了10多行浅AI,智能度居中,还未添加行走策略,不过它已经有了一定的智商。

代码: 全选

#include   <conio.h>
#include   <stdio.h>
#include  <stdlib.h>
#include    <time.h>
#include <Windows.h>

/**********按键定义**************/
#define U 8
#define D 6
#define L 9
#define R 7

/**********初始化参数************/
int Level=1,Score=0,ST;
int POINT_V[31][31],SS=8,S=8;
int Xe=15,Ye=30,X=15,Y=26,Xf,Yf,Xo=7,Yo=2;

/**********光标位置函数**********/
void Pos(int x,int y)
{
	COORD pos;
	HANDLE hOutput;
	pos.X=x;
	pos.Y=y;
	hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOutput,pos);
}

/***********标数转换器***********/
int Dx(int N)
{
	return (8-(N|1))*(N&1);
}
int Dy(int N)
{
	return (8-(N|1))*((N^1)&1);
}

/***********判断自己的肉*********/
int Sme(int N)
{
	if(N>5 && N<10){return 1;}
	return 0;
}

/**********初始化地图************/
void CreatMap()
{
	int i,j;
	printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
	for(j=1;j<=30;j++) {printf("┃                              ┃\n");}
	printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛");

	for(j=1;j<=30;j++){
		for(i=1; i<=30;i++){
			POINT_V[i][j]=0;		
		}
	}
	for(j=27;j<=30;j++){
		Pos(2*15,j);printf("■");
		POINT_V[15][j]=8;
	}
	Pos(2*15,26);printf("⊙");
	Pos(2*7,2);printf("△");
	POINT_V[15][26]=3,POINT_V[7][2]=10;
} 

/**********按键获取**************/
int Getkey(int N,int T)
{
	int i,KEY_V,start=clock();
 	do{
 		if(kbhit()){
	 		KEY_V=(int)(getch());
 			if(KEY_V<97){KEY_V+=32;}
 			return KEY_V;
 		}
		for(i=0;i<=N;i++);
	}while((clock()-start)<T);
	return -1;
}

/***********游戏主程序***********/
int GameCycle(int N, int T, int F1)
{
	int KEY_V;
	while(1) {
		KEY_V=Getkey(N,T);
		if     (KEY_V==119 && SS!=D){SS=8;}
		else if(KEY_V==115 && SS!=U){SS=6;}
		else if(KEY_V==97  && SS!=R){SS=9;}
		else if(KEY_V==100 && SS!=L){SS=7;}
		else if(KEY_V==112){getch();}
		else if(KEY_V==113){return 0;}
		Pos(2,31);           
		S=POINT_V[Xe][Ye],Xf=X+Dx(SS),Yf=Y+Dy(SS);                         //数据处理
		if(Sme(POINT_V[Xf][Yf])){
			if(F1==1 && (KEY_V<0)){
				if(Dy(SS)==0){
					ST=POINT_V[Xf][Yf],SS=(ST==6)?8:6,Xf=X,Yf=Y+Dy(SS);
				}
				else if(Dx(SS)==0){
					ST=POINT_V[Xf][Yf],SS=(ST==7)?9:7,Xf=X+Dx(SS),Yf=Y;
				}					
			}else{
				if(KEY_V<0){
					printf("蛇太贪了,连自己的肉也不放过!");
				}else{
					printf("蛇被你害死了!");
				}
				getch(); 
				return 0;
			}
		}
		if(F1==1 && (KEY_V<0)){
			if(Xf==0 || Xf==31 || Yf==0 || Yf==31){
				if(!Dy(SS)){
					SS=6+2*(rand()%2),Xf=X,Yf=Y+Dy(SS);
					if(Yf==0 || Yf==31){
						SS=(SS==6)?8:6,Yf=Y+Dy(SS);
					}
				}else{
					SS=7+2*(rand()%2),Xf=X+Dx(SS),Yf=Y;
					if(Xf==0 || Xf==31){
						SS=(SS==7)?9:7,Xf=X+Dx(SS);
					}
				}
			}
			if(Dy(SS)==0 && X==Xo){
				ST=SS,SS=(Y-Yo)>0?8:6,Xf=X,Yf=Y+Dy(SS);
				if(Sme(POINT_V[Xf][Yf])){SS=ST,Xf=X+Dx(SS),Yf=Y+Dy(SS);}
			}
			else if(Dx(SS)==0 && Y==Yo){
				ST=SS,SS=(X-Xo)>0?9:7,Xf=X+Dx(SS),Yf=Y;
				if(Sme(POINT_V[Xf][Yf])){SS=ST,Xf=X+Dx(SS),Yf=Y+Dy(SS);}
			}
		}
		else if(Xf==0 || Xf==31 || Yf==0 || Yf==31){
			printf("蛇死了,游戏结束!");
			getch();
			return 0; 	
		}
		if(Sme(POINT_V[Xf][Yf])){
			printf("蛇已被困住了!!!");
			getch();
			return 0;
		}	
		Pos(2*Xf,Yf);printf("⊙");                                         //动态显示
		Pos(2*X,Y);printf("■");
		POINT_V[X][Y]=SS;
		if(POINT_V[Xf][Yf]<10){
			Pos(2*Xe,Ye);printf(" ");
			POINT_V[X][Y]=SS,POINT_V[Xe][Ye]=0;
			Xe+=Dx(S),Ye+=Dy(S);
		}else{
			do{
				Xo=1+rand()%30,Yo=1+rand()%30;                     //随机食物
				if(POINT_V[Xo][Yo]==0){break;}
			}while(POINT_V[Xo][Yo]!=0);
			Pos(2*Xo,Yo);printf("△");
			POINT_V[Xo][Yo]=10,Score++;
			if(Score>Level*5){
				Level++,T-=1;
			} 
		}
		X=Xf,Y=Yf;
		Pos(2,0);printf("[LEVEL %d]  Score:%d\n",Level,Score);
	}
}

/**********Main主函数***********/
int main()
{
	srand((unsigned)time(NULL));
	int N=50,T=20,F=1;
	CreatMap();
	GameCycle(N,T,F);
	return 0;
}
上次由 happy886rr 在 2016年09月28日 22:58,总共编辑 1 次。
头像
523066680
Administrator
Administrator
帖子: 573
注册时间: 2016年07月19日 12:14
联系:

Re: C语言贪吃蛇,浅AI

帖子 523066680 »

你试试将所有花括号都换行,过一阵子,就会有不同感受。
个人经历:
批处理的括号从来没有换行的说法,到了Perl,差不多一两年的时间都是写的短小的脚本,不需要换行。
很多人吐槽过,不予理会。直到用写那个终端wiki工具,上了千行,开始转行,也没觉得多特别,但是一两个月过去后,竟然无法
直视自己以前的代码……

1
happy886rr
渐入佳境
渐入佳境
帖子: 45
注册时间: 2016年09月27日 16:11
联系:

Re: C语言贪吃蛇,浅AI

帖子 happy886rr »

523066680 写了:你试试将所有花括号都换行,过一阵子,就会有不同感受。…
:) 主要是使用大众风格,我只对函数体的花括号换行,其他一律连行,因为我一直都是记事本写C代码。记事本下都一个颜色,换了行会搞不清。代码编辑器很少用的,我90%的代码都用记事本搞得。当然现在正在学习使用编辑器调试,在编辑器下,我会换行的。
头像
523066680
Administrator
Administrator
帖子: 573
注册时间: 2016年07月19日 12:14
联系:

Re: C语言贪吃蛇,浅AI

帖子 523066680 »

batcher好像在那边python区转载过一个自动贪吃蛇直到填满屏幕的,一直没去看,希望有天能自己搞定 :shy
头像
523066680
Administrator
Administrator
帖子: 573
注册时间: 2016年07月19日 12:14
联系:

语法高亮测试 Re: C语言贪吃蛇,浅AI

帖子 523066680 »

代码: 全选

use utf8;
use Encode;
use Modern::Perl;
use File::Slurp;
use Mojo::UserAgent;
use JSON qw/from_json to_json/;
STDOUT->autoflush(1);


sub gbk { encode('gbk', $_[0]) }
sub utf8 { encode('utf8', $_[0]) }
sub u2gbk { encode('gbk', decode('utf8', $_[0])) }
sub uni { decode('utf8', $_[0]) }

回复

在线用户

正浏览此版面之用户: 没有注册用户 和 0 访客