易码技术论坛

 找回密码
 加入易码
搜索
查看: 284754|回复: 9

[原创]极限井字棋LAVA版及源码!

[复制链接]
发表于 2004-9-11 20:14:00 | 显示全部楼层
8错,比小尾编的好多了
 楼主| 发表于 2004-8-30 23:56:00 | 显示全部楼层
上面的代码随机数错误了,产生的是0-9的数字,应该这样:
  j=(rand()*9/32768)+1;//产生1-9的数字
但是那个RAR里面的LAV是正确的,原因是在下修改了代码却没有保存
发表于 2004-8-31 11:55:00 | 显示全部楼层
顶你!!!!另外~

那个RAR中的LAV也是有BUG的,需要加上那个正确的随机代码重新编译就可以了~

[此贴子已经被作者于2004-8-31 11:58:13编辑过]

发表于 2004-8-31 12:02:00 | 显示全部楼层
当然~还是要顶!
发表于 2004-9-18 15:32:00 | 显示全部楼层
产生随机数也可以     j=rand()%9+1;//产生1-9的数字
这样就不容易错了
发表于 2004-9-24 20:03:00 | 显示全部楼层
厉害
发表于 2004-9-24 23:36:00 | 显示全部楼层
我还以为lava又支持switch了呢
郁闷!!!!
 楼主| 发表于 2004-8-30 23:12:16 | 显示全部楼层 |阅读模式
已经用LAVA重写了,在下是对着资料写的,第一次用LAVA,LAVA认证机器认证是FOR ALL的~~呵呵[upload=rar]viewFile.asp?ID=44[/upload]
以下是代码:
/************************************************

程 序 名:极限井字棋
采用语言:LAVA
创 作 于:2004-8
修    改:PM 10:20 2004/8/30
原    作:空小子
第二作者:
第三作者:
....
规    则:Copyleft(自由版权)
说    明:无
************************************************/

#define TRUE   1
#define FALSE   0


//棋子代码,如:玩家1对应代码为1
#define ID_BLANK  0
#define ID_PLAYER1  1
#define ID_PLAYER2  3
#define ID_COMPUTER  2

#define MAN_VS_COMPUTER 1
#define MAN_VS_MAN  2

char box[10];
int x,y;              //棋子坐标
int vs_mode;          //对战,如:人机对战(player1 VS computer)
int piece_num;        //棋子数目,传统模式有9个,极限模式有6个
int player;           //当前下子的一方,如:ID_PLAYER1 表示玩家1
int AIOpPos;       //智能操作点

int Checkkey(int key)
{
if (key==27) return 27;
else if (key==98) return 1;
else if (key==110) return 2;
else if (key==109) return 3;
else if (key==103) return 4;
else if (key==104) return 5;
else if (key==106) return 6;
else if (key==116) return 7;
else if (key==121) return 8;
else if (key==117) return 9;
else return 0;
}

//设置棋子坐标
void set_xy(int key)
{
if (key==1||key==4||key==7) x=60;
if (key==2||key==5||key==8) x=80;
if (key==3||key==6||key==9) x=100;
if (key==1||key==2||key==3) y=60;
if (key==4||key==5||key==6) y=40;
if (key==7||key==8||key==9) y=20;
}

//检测目标
int SeekAim(int AimID1_num, int AimID1,int AimID2,int SeekTimes)
{
int i,Num;

Num=AimID1_num;
AIOpPos=0;
for(i=1;i<10;i=i+4)
{
  if (box==AimID1) Num--;
  if (box==AimID2) AIOpPos=i;
}
if (0==Num && AIOpPos!=0) SeekTimes--;
if (0==SeekTimes) return 1;

Num=AimID1_num;
AIOpPos=0;
for(i=3;i<8;i=i+2)
{
  if (box==AimID1) Num--;
  if (box==AimID2) AIOpPos=i;
}
if (0==Num && AIOpPos!=0) SeekTimes--;
if (0==SeekTimes) return 2;

Num=AimID1_num;
AIOpPos=0;
for(i=1;i<4;i++)
{
  if (box==AimID1) Num--;
  if (box==AimID2) AIOpPos=i;
}
if (0==Num && AIOpPos!=0) SeekTimes--;
if (0==SeekTimes) return 3;

Num=AimID1_num;
AIOpPos=0;
for(i=4;i<7;i++)
{
  if (box==AimID1) Num--;
  if (box==AimID2) AIOpPos=i;
}
if (0==Num && AIOpPos!=0) SeekTimes--;
if (0==SeekTimes) return 4;

Num=AimID1_num;
AIOpPos=0;
for(i=7;i<10;i++)
{
  if (box==AimID1) Num--;
  if (box==AimID2) AIOpPos=i;
}
if (0==Num && AIOpPos!=0) SeekTimes--;
if (0==SeekTimes) return 5;

Num=AimID1_num;
AIOpPos=0;
for(i=1;i<8;i=i+3)
{
  if (box==AimID1) Num--;
  if (box==AimID2) AIOpPos=i;
}
if (0==Num && AIOpPos!=0) SeekTimes--;
if (0==SeekTimes) return 6;

Num=AimID1_num;
AIOpPos=0;
for(i=2;i<9;i=i+3)
{
  if (box==AimID1) Num--;
  if (box==AimID2) AIOpPos=i;
}
if (0==Num && AIOpPos!=0) SeekTimes--;
if (0==SeekTimes) return 7;

Num=AimID1_num;
AIOpPos=0;
for(i=3;i<10;i=i+3)
{
  if (box==AimID1) Num--;
  if (box==AimID2) AIOpPos=i;
}
if (0==Num && AIOpPos!=0) SeekTimes--;
if (0==SeekTimes) return 8;

return 0;
}

void Player1()
{
char key,OldKey;
OldKey=0;
while(player==ID_PLAYER1)
{
  key=Checkkey(getchar());
  if (key==27) exit(0);
  set_xy(key);
  if (key!=OldKey && piece_num>0 && box[key]==ID_BLANK)
  {
   box[key]=ID_PLAYER1;
   piece_num--;
   Circle(x,y,7,0,1);
   if (vs_mode==MAN_VS_COMPUTER) player=ID_COMPUTER; else player=ID_PLAYER2;
  }
  else if (piece_num==0 && box[key]==ID_PLAYER1)
  {
   OldKey=key;
   box[key]=ID_BLANK;
   piece_num++;
   Circle(x,y,7,1,0);
   player=ID_PLAYER1;
  }
}

//胜利后的效果待如,可采用积分制
if (SeekAim(3,ID_PLAYER1,ID_PLAYER1,1))
{
  TextOut(20,8,"玩家1获胜!",192);
  getchar();
  exit(0);
}
}


void Player2()
{
char key,OldKey;
OldKey=0;
while(player==ID_PLAYER2)
{
  key=CheckKey(getchar());
  if (key==27) exit(0);
  set_xy(key);
  if (key!=OldKey && piece_num>0 && box[key]==ID_BLANK)
  {
   box[key]=ID_PLAYER2;
   piece_num--;
   Circle(x,y,7,0,1);
   player=ID_PLAYER1;
  }
  else if (piece_num==0 && box[key]==ID_PLAYER2)
  {
   OldKey=key;
   box[key]=ID_BLANK;
   piece_num++;
   Circle(x,y,7,1,1);
   player=ID_PLAYER2;
  }
}

//胜利后的效果待如,可采用积分制
if (SeekAim(3,ID_PLAYER2,ID_PLAYER2,1))
{
  TextOut(20,8,"玩家2获胜!",192);
  getchar();
  exit(0);
}
}

void computer()
{
int i,j,BakAIOpPos,UnHoldPos1,UnHoldPos2,Win;

//赢
Win=SeekAim(2,ID_COMPUTER,ID_BLANK,1);
if (Win)
{
  if (0==piece_num)
  for(i=1;i<10;i++)
  //直线中的子不许提
  if ((Win==1 && i!=1 && i!=5 && i!=9 && box==ID_COMPUTER) ||
      (Win==2 && i!=3 && i!=5 && i!=7 && box==ID_COMPUTER) ||
      (Win==3 && i!=1 && i!=2 && i!=3 && box==ID_COMPUTER) ||
      (Win==4 && i!=4 && i!=5 && i!=6 && box==ID_COMPUTER) ||
      (Win==5 && i!=7 && i!=8 && i!=9 && box==ID_COMPUTER) ||
      (Win==6 && i!=1 && i!=4 && i!=7 && box==ID_COMPUTER) ||
      (Win==7 && i!=2 && i!=5 && i!=8 && box==ID_COMPUTER) ||
      (Win==8 && i!=3 && i!=6 && i!=9 && box==ID_COMPUTER))
  {
   set_xy(i);
   Circle(x,y,7,1,0);
   break;
  }
  set_xy(AIOpPos);
  Circle(x,y,7,1,1);

  //胜利后的效果待如,可采用积分制
  TextOut(20,8,"电脑获胜!",192);
  getchar();
  exit(0);
}

//禁止提子位置
if (0==piece_num)
{
  UnHoldPos1=0;
  UnHoldPos2=0;
  if (SeekAim(2,ID_PLAYER1,ID_COMPUTER,1)) UnHoldPos1=AIOpPos;
  if (SeekAim(2,ID_PLAYER1,ID_COMPUTER,2)) UnHoldPos2=AIOpPos;
}

//防
if (SeekAim(2,ID_PLAYER1,ID_BLANK,1))
{
  if (0==piece_num)
  for(i=1;i<10;i++)
  if (i!=UnHoldPos1 && i!=UnHoldPos2 && box==ID_COMPUTER)
  {
   box=ID_BLANK;
   set_xy(i);
   Circle(x,y,7,1,0);
   piece_num++;
   break;
  }
  box[AIOpPos]=ID_COMPUTER;
  set_xy(AIOpPos);
  Circle(x,y,7,1,1);
  player=ID_PLAYER1;
  piece_num--;
  return;
}


//此随机操作将中间格的优先权去掉,降低了难度了
while(1)
{
  j=rand()*10/32767;
  if (box[j]==ID_BLANK)
  {
   if (0==piece_num)
   for(i=1;i<10;i++)
   if (i!=UnHoldPos1 && i!=UnHoldPos2 && box==ID_COMPUTER)
   {
    box=ID_BLANK;
    set_xy(i);
    Circle(x,y,7,1,0);
    piece_num++;
    break;
   }
   box[j]=ID_COMPUTER;
   set_xy(j);
   Circle(x,y,7,1,1);
   player=ID_PLAYER1;
   piece_num--;
   return;
  }
}
}
//关于
void about()
{
ClearScreen();
SetScreen(1);
Locate(2,1);
printf("编  写:空小子");
Locate(3,1);
printf("规  则:自由版权");
Locate(4,1);
printf("E-MAIL:kxz-kong@163.com");
UpdateLCD(0);
TextOut(20,8,"【极限井字棋】",192);

//画3D框
Box(1,1,155,75,0,1);
Box(3,3,153,73,0,1);
Box(5, 75, 160, 80, 1,1);
Box(155, 5, 160, 80, 1,1);

getchar();
}

//菜单
int set_menu()
{
char ch;

CATCH_KEY:
ch=getchar();
if (ch==27) exit(0);
else if(ch=='b') return 1;
else if(ch=='n') return 2;
goto CATCH_KEY;
}

//设置
void set()
{
ClearScreen();
SetScreen(0);
Locate(0,0);
printf("%s","对战:");
Locate(1,4);
printf("%s","1.人机对战");
Locate(3,4);
printf("%s","2.人脑对战");
UpdateLCD(0);
vs_mode=set_menu();

ClearScreen();
SetScreen(0);
Locate(0,0);
printf("%s","模式:");
Locate(1,4);
printf("%s","1.极限模式");
Locate(3,4);
printf("%s","2.传统模式");
UpdateLCD(0);
  //设置棋子数目
piece_num=(set_menu())*3 + 3;

ClearScreen();
SetScreen(0);
Locate(0,0);
printf("%s","优先:");
Locate(1,4);
printf("%s"," 1.人先行 ");
Locate(3,4);
printf("%s"," 2.电脑先 ");
UpdateLCD(0);
//设置优先级
if (vs_mode==MAN_VS_COMPUTER) player=set_menu();
else player=ID_PLAYER1;
}

//初始化
void init()
{
int i;

//数组初始化
for(i=1;i<10;i++) box=0;

ClearScreen();
SetScreen(0);
UpdateLCD(0);

//棋盘
Box(48,8,112,72,0,1);
Box(50,10,110,70,0,1);
Box(70,10,90,70,0,1);
Box(50,30,110,50,0,1);
//阴影
Box(112,15,115,72,1,1);
Box(55,72,115,75,1,1);

}

void start()
{
while(1)
{
  if (vs_mode==MAN_VS_COMPUTER)
  {
   if (player==ID_PLAYER1) Player1(); else computer();
  }
  else
  {
   Player1();
   Player2();
  }
}
}

void main()
{
about();
set();
init();
start();
}

发表于 2008-8-10 18:17:01 | 显示全部楼层

回复 1# 的帖子

爽呀,大哥厉害!
发表于 2008-8-10 19:50:34 | 显示全部楼层
LS………………
这个……
这是2004年的帖子????
这是违规的。
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-3-29 02:50 , Processed in 0.013462 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表