类似华容道游戏源码

 

/*       puzzle.c
Author: zmofun 1999.12.7
All rights is reserved.    */

#include <conio.h>
#include <dos.h>
#include <stdio.h>
#include<stdlib.h>
#define PSTARTX 30
#define PSTARTY  6
#define PWIDTH   20
#define PHEIGHT  11

puzzlemain()
{
 char scrbuff[1000];
 gettext(PSTARTX,PSTARTY,PSTARTX+PWIDTH,PSTARTY+PHEIGHT,scrbuff);
 play();
 puttext(PSTARTX,PSTARTY,PSTARTX+PWIDTH,PSTARTY+PHEIGHT,scrbuff);
 
}

ispass(int num[4][4])
{
 int i,j;
 for(i=0;i<4;i++)
  for(j=0;j<4;j++)
   if (num[i][j]!=i*4+j+1)
    return 0;
   return 1;
}

beep(int d)
{
 char originalbits,bits;
 bits=originalbits=inportb(0x61);
 outportb(0x61,bits&0xfc);
 outportb(0x43,0xb6);
 
 outportb(0x42,989);
 outportb(0x42,5);
 outportb(0x61,bits|3);
 delay(d);
 outportb(0x61,bits&0xfc);
 outportb(0x61,originalbits);
}

move(int direct,int *l,int *c,int num[4][4])
{
 static char *str[16]={" 1"," 2"," 3"," 4"," 5"," 6"," 7"," 8"," 9",
  "10","11","12","13","14","15","  "};
 int pass=0;
 int t;
 setscrcolor(BLUE,WHITE);
 switch(direct)
    {
 case 1:
  if ((*l>=0)&&(*l<=2))
  { *l=*l+1;
  t=num[*l][*c];
  num[*l][*c]=num[*l-1][*c];
  num[*l-1][*c]=t;
  putsxy(PSTARTX+3+(*c)*4,PSTARTY+2+(*l)*2,str[num[*l][*c]-1]);
  putsxy(PSTARTX+3+(*c)*4,PSTARTY+2+(*l-1)*2,str[num[*l-1][*c]-1]);
  beep(500);
  if (ispass(num))
   pass=1;
  }
  else
   beep(5000);
  break;

 case 2:
  if ((*c>=0)&&(*c<=2))
  { *c=*c+1;
  t=num[*l][*c];
  num[*l][*c]=num[*l][*c-1];
  num[*l][*c-1]=t;
  putsxy(PSTARTX+3+(*c)*4,PSTARTY+2+(*l)*2,str[num[*l][*c]-1]);
  putsxy(PSTARTX+3+(*c-1)*4,PSTARTY+2+(*l)*2,str[num[*l][*c-1]-1]);
  beep(500);
  if (ispass(num))
   pass=1;
  }
  else
   beep(5000);
  break;

 case 3:
  if ((*c<=3)&&(*c>0))
  {
   *c=*c-1;
   t=num[*l][*c];
   num[*l][*c]=num[*l][*c+1];
   num[*l][*c+1]=t;
   putsxy(PSTARTX+3+(*c)*4,PSTARTY+2+(*l)*2,str[num[*l][*c]-1]);
   putsxy(PSTARTX+3+(*c+1)*4,PSTARTY+2+(*l)*2,str[num[*l][*c+1]-1]);
   beep(500);
   if(ispass(num))
    pass=1;
  }
  else beep(5000);
  break;

 case 4:
  if ((*l<=3)&&(*l>0))
  {
   *l=*l-1;
   t=num[*l][*c];
   num[*l][*c]=num[*l+1][*c];
   num[*l+1][*c]=t;
   putsxy(PSTARTX+3+(*c)*4,PSTARTY+2+(*l)*2,str[num[*l][*c]-1]);
   putsxy(PSTARTX+3+(*c)*4,PSTARTY+2+(*l+1)*2,str[num[*l+1][*c]-1]);
   beep(500);
   if(ispass(num))
    pass=1;
  }
  else beep(5000);
  break;
    }
 return pass;
}

play()
{
 int key;
 int exitgame=0;
 int l,c;
 static char *str[16]={" 1"," 2"," 3"," 4"," 5"," 6"," 7"," 8"," 9",
  "10","11","12","13","14","15","  "};
 static int num[4][4];
 drawframe(num,str,&l,&c);
 while(!exitgame)
 {
  while(bioskey(1)==0);
  key=bioskey(0);
  switch(key)
  {

  case UPA:
   if(move(1,&l,&c,num))
   {
    if(!getyesno("    Passed! Play again?"))
     exitgame=1;
    else
     drawframe(num,str,&l,&c);
   }
   break;

  case DOWNA:
   if(move(4,&l,&c,num))
   {
    if(!getyesno("    Passed! Play again?"))
     exitgame=1;
    else
     drawframe(num,str,&l,&c);
   }
   break;

  case LEFTA:
   if(move(2,&l,&c,num))
   {
    if(!getyesno("    Passed! Play again?"))
     exitgame=1;
    else
     drawframe(num,str,&l,&c);
   }
   break;

  case RIGHTA:
   if(move(3,&l,&c,num))
   {
    if(!getyesno("    Passed! Play again?"))
     exitgame=1;
    else
     drawframe(num,str,&l,&c);
   }
   break;

  case RETURN:
   break;

  case ESC:
   if(!getyesno("  Do you want play again?"))
    exitgame=1;
   else
    drawframe(num,str,&l,&c);
   break;

  default:
   break;
  }
    }
}

getyesno(char *s)
{
 int key=0;
 int yesno=1;
 char buff[400];
 gettext(25,8,55,13,buff);
 setscrcolor(BLUE,WHITE);
 box(25,8,30,5);
 putsxy(27,9,s);
 setscrcolor(RED,YELLOW);
 putsxy(32,11,"Yes");
 setscrcolor(LIGHTGRAY,WHITE);
 putsxy(45,11,"No");
 while(key!=RETURN)
 {
  while(bioskey(1)==0);
  key=bioskey(0);
  switch(key)
  {
  case LEFTA:
  case RIGHTA:
   if (yesno)
   {
    yesno=0;
    setscrcolor(LIGHTGRAY,WHITE);
    putsxy(32,11,"Yes");
    setscrcolor(RED,YELLOW);
    putsxy(45,11,"No");
   }
   else
   {
    yesno=1;
    setscrcolor(RED,YELLOW);
    putsxy(32,11,"Yes");
    setscrcolor(LIGHTGRAY,WHITE);
    putsxy(45,11,"No");
   }
   break;

  default:
   break;
  }
 }
 puttext(25,8,55,13,buff);
 return yesno;
}

initnumber(int num[4][4],int *l,int *c)
{
 int i,j,t;
 int n[20][16]={
  {1,6,2,3,5,13,4,8,16,10,14,7,9,15,11,12},
  {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16},
  {1,16,2,3,5,6,7,4,9,10,11,8,13,14,15,12},
  {2,3,7,16,6,11,14,4,1,10,13,8,5,9,15,12},
  {10,16,15,7,8,2,3,4,1,6,11,12,9,5,13,14},
  {8,3,15,2,13,6,1,14,10,5,11,7,4,9,16,12},
  {9,10,5,6,15,14,1,3,11,13,2,4,16,7,12,8},
  {5,6,1,2,10,4,14,3,9,13,12,8,15,11,16,7},
  {13,6,14,2,1,5,7,4,10,15,12,3,16,9,11,8},
  {6,2,3,8,1,14,13,12,9,4,11,16,5,10,7,15},
  {2,3,8,7,6,9,15,4,1,13,10,12,5,14,16,11},
  {3,2,8,12,1,11,13,15,5,6,16,7,9,10,14,4}
 };
 t=random(12);
 for(i=0;i<4;i++)
  for(j=0;j<4;j++)
  {
   num[i][j]=n[t][i*4+j];
   if (num[i][j]==16)
    *l=i,*c=j;
  }
}

drawframe(int num[4][4],char *str[16],int *l,int *c)
{
 int i,j;
 setscrcolor(LIGHTGRAY,GREEN);
 initnumber(num,l,c);
 box(PSTARTX,PSTARTY,PWIDTH,PHEIGHT);
 setscrcolor(BLUE,YELLOW);
 for(i=0;i<4;i++)
  for(j=0;j<4;j++)
   putsxy(PSTARTX+3+j*4,PSTARTY+2+i*2,str[num[i][j]-1]);
}.

package 华容道; import java.awt.*; import java.awt.event.*; //主函数 public class Main { public static void main(String[] args) { new Hua_Rong_Road(); } } //人物按钮颜色 class Person extends Button implements FocusListener{ int number; Color c=new Color(255,245,170); Person(int number,String s) { super(s); setBackground(c);//人物的颜色背景是黄色 this.number=number; c=getBackground(); addFocusListener(this);//好像是焦点监听器 } public void focusGained(FocusEvent e) { setBackground(Color.red);//只要单击该按钮则按钮变颜色 } public void focusLost(FocusEvent e) { setBackground(c);//上一个按钮回复原先的颜色 } } //华容道总类 class Hua_Rong_Road extends Frame implements MouseListener,KeyListener,ActionListener{ Person person[] = new Person[10]; Button left,right,above,below; Button restart = new Button("Start");//重新开始按钮 public Hua_Rong_Road() { init(); setBounds(100,100,320,360); setVisible(true);//设置Frame为可见,默认为不可见 validate(); addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); } public void init() { setLayout(null); add(restart); restart.setBounds(100, 320, 120, 25); restart.addActionListener(this); String name[]={"我","陆逊","姜维","陈宫","许攸","邓艾","周瑜","庞统","诸葛亮","贾诩"}; for(int k=0;k<name.length;k++) { person[k]=new Person(k,name[k]); person[k].addMouseListener(this); person[k].addKeyListener(this); add(person[k]); }//为所有的按钮注册所需的东西 person[0].setBounds(104, 54, 100, 100); person[1].setBounds(104,154, 100, 50); person[2].setBounds(54, 154, 50, 100); person[3].setBounds(204, 154, 50, 100);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值