团队博客

棋奕人生五子棋团队博客
设计思路
1、获取棋盘设计一个14X14围棋棋盘,由两玩家交替或人机进行对战,并可以实现以下功能。五子棋的规则为:
2、下棋方法两人分别执黑白两色棋子。轮流在棋盘上选择一个无子的交叉点落子,无子的交叉点又被称为空点。
3、输赢判断每次下完一颗棋子,就通过程序从横、竖、斜各个方向扫描棋盘,如果在某个方向中,有同种颜色的棋子达到五连子,则此颜色的玩家为赢。如果没有相同颜色的棋子达到五连子,则继续游戏。
五子棋游戏通过主窗体的构建整体框架,之后在通过鼠标与系统的接口操作,实现绘制棋子的操作。且人机操作时系统通过自动走棋模块进行对战,判断正负的模块对于双方下棋结果做出反应。最终实现整体游戏。
详细设计
1、构造主窗体
2、功能描述
设置五子棋程序的主菜单,游戏模式,棋盘规格,外观,帮助等界面格式。
1、五子棋的主菜单为—【开始游戏】,【模式】,【棋盘】,【帮助】,【主题】【游戏类型】的并行选项,以此引导游戏的进行。
2.对战模式为人机与双人对战两种模式
3.棋盘为大小两种选择,两种棋盘规格不同,玩家可根据个人喜好自行选择
4.帮助,用于提示新手玩家游戏规则。
5.游戏规则与普通五子棋规则等同,当任意一方棋子五子连成一线即可获胜。玩家可在游戏过程中悔棋,认输或重新开始。
3、输入数据
输入:鼠标点击窗口的各个选项
有效性检验规则:鼠标在窗口的点击位置
(一)输出数据
1.点击“开始游戏”选项,开始进入游戏界面。输出形式:游戏开始,可进行游戏
2.点击“模式”选项,可选择人机对战或玩家对战模式。输出形式:选择人机对战模式,玩家落子后,系统自动与玩家对战。选择玩家对战模式,系统进入判断正负模块。
(二)数据设计
给出本程序中的局部数据结构说明,包括数据结构名称,功能说明,具体数据结构说明(定义、注释设计、取值)等。相关数据库表,数据存储设计(具体说明需要以文件方式保存的数据文件名、数据存储格式、数据项及属性等。)
(三)算法和流程
详细描述根据输入数据产生输出数据的算法和流程。
(四)函数说明
具体说明模块中的各个函数,包括函数名称及其所在文件,功能,格式,参数,全局变量,局部变量,返回值,算法说明,使用约束等。
(五) 全局数据结构与该模块的关系
说明该模块访问了哪些全局数据结构。

 * 构造五子棋游戏的主窗体
  */
 public ChessFrame(){
  this.setTitle("棋奕人生");
  cm = new ChessModel(1);
  mp = new MainPanel(cm);
  Container con = this.getContentPane();
  con.add(mp,"Center");
  this.setResizable(false);
  this.addWindowListener(new ChessWindowEvent());
  MapSize(14,14);
  JMenuBar mbar = new JMenuBar();
  this.setJMenuBar(mbar);
  JMenu gameMenu = new JMenu("开始游戏");
  mbar.add(makeMenu(gameMenu,new Object[]{"开局",null,"认输",null,"悔棋",null,"重新开始",null,"退出"},this));
  JMenu sizeMenu = new JMenu("游戏设置");
  mbar.add(makeMenu(sizeMenu,new Object[]{"标准棋盘",null,"扩大棋盘","开启音乐",null,"关闭音乐"},this));
  JMenu backGroundMenu = new JMenu("游戏类型");
  mbar.add(makeMenu(backGroundMenu,new Object[]{"软件",null,"网页"},this));
  JMenu modeMenu = new JMenu("模式");
  mbar.add(makeMenu(modeMenu,new Object[]{"人机对战",null,"人人对战"},this));
  JMenu lookMenu = new JMenu("主题");
  mbar.add(makeMenu(lookMenu,new Object[]{"类型1",null,"类型2",null,"类型3",null,"类型4"},this));
  JMenu helpMenu = new JMenu("帮助");
  mbar.add(makeMenu(helpMenu,new Object[]{"游戏说明",null,"版本更新"},this));
 }
 *五子棋游戏的主菜单
  */
 public JMenu makeMenu(Object parent,Object items[],Object target){
  JMenu m = null;
  if(parent instanceof JMenu){
   m = (JMenu)parent;
  }else if(parent instanceof String){
   m = new JMenu((String)parent);
  }else{
   return null;
  }
  for(int i=0;i<items.length;i++){
   if(items[i]==null){
    m.addSeparator();
   }else{
    m.add(makeMenuItem(items[i],target));
   }
  }
  return m;
 }
public void actionPerformed(ActionEvent e){
  String arg = e.getActionCommand();
        try{
   if(arg.equals("类型1")){
    UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
   }else {
    UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
   }
   
   SwingUtilities.updateComponentTreeUI(this);
  }catch(Exception ee){
   
  }
  try{
if(arg.equals("类型3")){
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.mac.MacLookAndFeel");
 }else {
SwingUtilities.updateComponentTreeUI(this);
  }catch(Exception ee){
  if(arg.equals("网页")) {
  Desktop deskdop=Desktop.getDesktop();
  try {
   deskdop.browse(new URI("libs\\html\1.html"));
  } catch (IOException e1) {
   e1.printStackTrace();
  } catch (URISyntaxException e1) {
   e1.printStackTrace();
  }
 }
if(arg.equals("开启音乐")) {
   try {   
    URL cb;   
    File f = new File("\\lib\\高山流水 (古筝独奏).wav");
    // 引号里面的是音乐文件所在的路径   
    cb = f.toURL();   
    AudioClip aau;   
    aau = Applet.newAudioClip(cb);     
    aau.play();    
    aau.loop();
    //循环播放   
    System.out.println("开启音乐");  
    // 循环播放 aau.play()   
    //单曲 aau.stop()停止播放   
    } catch (MalformedURLException e1) { 
     e1.printStackTrace();  
     } 
      }
       if(arg.equals("关闭音乐")) {
   try {   
    URL cb;   
    File f = new File("src\\lib\\高山流水 (古筝独奏).wav");
    // 引号里面的是音乐文件所在的路径   
    cb = f.toURL();   
    AudioClip aau;   
    aau = Applet.newAudioClip(cb);  
    System.out.println("关闭音乐"); 
    aau.stop(); 
    } catch (MalformedURLException e1) { 
     e1.printStackTrace();  
     } 
      } 
      
public void computerDoB(int width,int height) {
  int max_black,max_white,max_temp,max=0,xx=0,yy=0;
  setisOdd(true);
  for(int i=0;i<=width;i++){
   for(int j=0;j<=height;j++){
    /*算法判断是否下子 */
    if(!chessExist(i, j)){
     //判断白子的最大
     max_white=checkMax(i,j,2);
     //判断黑子的最大
     max_black=checkMax(i,j,1);
     max_temp=Math.max(max_white, max_black);
     if(max_temp>max){
      max=max_temp;
      xx=i;
      yy=j;
     }
    }
   }
  }
  setX(xx);
  setY(yy);
  this.arrMapShow[xx][yy]=2;
 } 
 /*
  * 记录电脑下子后的横向坐标
  */
 public void setX(int x) {
  this.x=x;
 }
 /*
  * 记录电脑下子后的纵向坐标
  */
 public void setY(int y) {
  this.y=y;
 }
 /*
  * 获取电脑下子的横向坐�?
  */
 public int getX(){
  return this.x;
 }
 /*
  * 获取电脑下子的纵向坐�?
  */
 public int getY(){
  return this.y;
 }
public int checkMax(int x,int y,int black_or_white) {
  int num=0,max_num=0;
  int x_temp = x, y_temp = y;
  int x_temp1 = x_temp, y_temp1 = y_temp;
  //判断右边
  for(int i=1;i<5;i++){
   x_temp1+=1;
   if(x_temp1>this.width){
    break;
   }
   if(this.arrMapShow[x_temp1][y_temp1]==black_or_white){
    num++;
   }else{
    break;
   }
  }
  //判断左边
  x_temp1 = x_temp;
  for(int i=1;i<5;i++){
   x_temp1-=1;
   if(x_temp1<0){
    break;
   }
   if(this.arrMapShow[x_temp1][y_temp1]==black_or_white){
    num++;
   }else{
    break;
   }
  }
  if(num<5){
   max_num=num;
  }
  //判断上面
  x_temp1 = x_temp;
  y_temp1 = y_temp;
  num=0;
  for(int i=1;i<5;i++){
   y_temp1-=1;
   if(y_temp1<0){
    break;
   }
   if(this.arrMapShow[x_temp1][y_temp1]==black_or_white){
    num++;
   }else{
    break;
   }
  }
  //判断下面
  y_temp1 = y_temp;
  for(int i=1;i<5;i++){
   y_temp1+=1;
   if(y_temp1>this.height){
    break;
   }
   if(this.arrMapShow[x_temp1][y_temp1]==black_or_white){
    num++;
   }else{
    break;
   }
  }
  if(num>max_num&&num<5){
   max_num=num;
  }
  //判断左上�?
  x_temp1=x_temp;
  y_temp1=y_temp;
  num=0;
  for(int i=1;i<5;i++){
   x_temp1-=1;
   y_temp1-=1;
   if(y_temp1<0||x_temp1<0){
    break;
   }
   if(this.arrMapShow[x_temp1][y_temp1]==black_or_white){
    num++;
   }else{
    break;
   }
  }
  //判断右下�?
  x_temp1=x_temp;
  y_temp1=y_temp;
  for(int i=1;i<5;i++){
   x_temp1+=1;
   y_temp1+=1;
   if(y_temp1>this.height||x_temp1>this.width){
    break;
   }
   if(this.arrMapShow[x_temp1][y_temp1]==black_or_white){
    num++;
   }else{
    break;
   }
  }
  if(num>max_num&&num<5){
   max_num=num;
  }
  //判断右上�?
  x_temp1=x_temp;
  y_temp1=y_temp;
  num=0;
  for(int i=1;i<5;i++){
   x_temp1+=1;
   y_temp1-=1;
   if(y_temp1<0||x_temp1>this.width){
    break;
   }
   if(this.arrMapShow[x_temp1][y_temp1]==black_or_white){
    num++;
   }else{
    break;
   }
  }
  //判断左下�?
  x_temp1=x_temp;
  y_temp1=y_temp;
  for(int i=1;i<5;i++){
   x_temp1-=1;
   y_temp1+=1;
   if(y_temp1>this.height||x_temp1<0){
    break;
   }
   if(this.arrMapShow[x_temp1][y_temp1]==black_or_white){
    num++;
   }else{
    break;
   }
  }
  if(num>max_num&&num<5){
   max_num=num;
  }
  return max_num;
 }

设计体会与小结
一个编程语言最强大的地方不是它是容易学,或者难学,而是它拥有一个强大的库。1个完全面向对象的语言,JAVA的命名规则是很容易让人接受的。而且容易被编程人员经过实践训练,对JAVA 的综合应用能力有了较大的提高,另外对JAVA 的特点有了更次的认识。这次实践中使用的代码虽然不长,但类与类之间也有很强的逻辑关系,这就面向对象语言的最大优势,这样可使我们更轻松的运用JAVA。
经过努力,查阅相关资料,终于完成该课题,虽然效果不是很好,但亲手做过之后还是很有成就感的。
通过此次课程设计,将我本学期所学的JAVA知识得到巩固和应用,在设计的过程中我遇到了很到问题,不过在杨中杰老师和同学们的帮助和自己的思考下还是很好的完成了。这此课程设计还让我懂得了写程序不能闭门造车,要努力拓宽知识面,开阔视野,拓展思维。它还让我学会了在网上查阅那些无限的资料。通过对此课题的开发,使我对用Eclipse开发平台有了一个比较清楚的认识,体会到理论和实践的重要性。由于自己的分析设计和程序经验不足,该系统设计和实现过程中,还有许多没有完善的地方,比如用户界面设计不够美观,发现很多问题,都会有进一步的完善,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值