kotlin实现五子棋单机游戏

最近学了点kotlin的相关知识,顺手写了一个简单的五子棋单机游戏,分享给大家吧!有兴趣的可以看看

五子棋界面

package wjc.kotlintest

import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.util.AttributeSet
import android.view.View

/**
 * Created by wjc on 2019/12/9.
 */
class MyCustomView : View {

 var paint: Paint = Paint()
 var paintWhite: Paint = Paint()
 var paintBlack: Paint = Paint()
 val H: Int = 12
 val V: Int = 12
 var list = arrayListOf<Data>()//白子和黑子
 var listW = arrayListOf<Data>()//白子
 var listB = arrayListOf<Data>()//黑子

 var wSuccess: Boolean = false //白旗获胜标志
 var bSuccess: Boolean = false //黑棋获胜标志

 init {
  paintWhite.color = Color.WHITE
  paintWhite.style = Paint.Style.FILL
  paintBlack.color = Color.BLACK
  paintBlack.style = Paint.Style.FILL
 }

 constructor(context: Context) : this(context, null)
 constructor(context: Context, attr: AttributeSet?) : this(context, attr, 0)
 constructor(context: Context, attr: AttributeSet?, defStyleAttr: Int) : super(context, attr, defStyleAttr)

 override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
  super.onMeasure(widthMeasureSpec, heightMeasureSpec)
  val widthMode: Int = MeasureSpec.getMode(widthMeasureSpec)
  val widthSize: Int = MeasureSpec.getSize(widthMeasureSpec)
  val heightMode: Int = MeasureSpec.getMode(heightMeasureSpec)
  val heightSize: Int = MeasureSpec.getSize(heightMeasureSpec)
  if (widthMode == MeasureSpec.AT_MOST && heightMode == MeasureSpec.AT_MOST) {
   setMeasuredDimension(760, 760)
  } else if (widthMode == MeasureSpec.AT_MOST) {
   setMeasuredDimension(760, heightSize)
  } else if (heightMode == MeasureSpec.AT_MOST) {
   setMeasuredDimension(widthSize, 760)
  }
 }

 override fun draw(canvas: Canvas?) {
  super.draw(canvas)
  for (i in 0..H) {
   canvas!!.drawLine(20f, 20f + 60 * i, 740f, 20f + 60 * i, paint)
  }
  for (j in 0..V) {
   canvas!!.drawLine(20f + 60 * j, 20f, 20f + 60 * j, 740f, paint)
  }
  if (listW.size != 0) {
   for (item in listW) {
    canvas!!.drawCircle(item.point.x * 60 + 20f, item.point.y * 60 + 20f, 15f, paintWhite)

   }
  }
  if (listB.size != 0) {
   for (item in listB) {
    canvas!!.drawCircle(item.point.x * 60 + 20f, item.point.y * 60 + 20f, 15f, paintBlack)
   }
  }
 }

 fun addData(data: Data) {
  if (list.size == 0) {
   list.add(data)
   listW.add(data)
   return
  }
  if (!select(data)) {
   list.add(data)
   if (listW.size == listB.size) {
    //白旗是否获胜
    wSuccess = isSuccess(data, listW)
    //白旗走
    listW.add(data)
   } else {
    //黑棋是否获胜
    bSuccess = isSuccess(data, listB)
    //黑棋走
    listB.add(data)
   }
  }
 }

 fun select(data: Data): Boolean {
  for (item in list) {
   if (data.equals(item))
    return true
  }
  return false
 }

 fun isSuccess(data: Data, arry: List<Data>): Boolean {
  return horizontalErgodic(data, arry) || verticalErgodic(data, arry) || acrossErgodic(data, arry)
 }

 //横向遍历
 fun horizontalErgodic(data: Data, arry: List<Data>): Boolean {
  //记录连续的棋子数,凑成5个即一方获胜
  var rn = 0
  var ln = 0
  //向右遍历,y相同,x递增
  for (i in 1..5) {
   var _rn: Int = i
   for (item in arry) {
    if (data.point.y == item.point.y) {
     if (data.point.x + i == item.point.x) {
      rn++
      break
     }
    }
   }
   if (_rn != rn) {
    break
   }
  }
  //一方获胜,游戏结束
  if (rn == 4) {
   return true
  }
  //向左遍历,y相同,x递减
  for (i in 1..5) {
   var _ln: Int = i
   for (item in arry) {
    if (data.point.y == item.point.y && data.point.x - i == item.point.x) {
     ln++
     break
    }
   }
   if (_ln != ln) {
    break
   }
  }
  //一方获胜,游戏结束
  if (ln == 4) {
   return true
  }
  //向左向右
  return ln + rn >= 4
 }

 //纵向遍历
 fun verticalErgodic(data: Data, arry: List<Data>): Boolean {
  //记录连续的棋子数,凑成5个即一方获胜
  var tn = 0
  var bn = 0
  //向上遍历,x相同,y递增
  for (i in 1..5) {
   val _tn: Int = i
   for (item in arry) {
    if (data.point.x == item.point.x && data.point.y + i == item.point.y) {
     tn++
     break
    }
   }
   if (_tn != tn) {
    break
   }
  }
  //一方获胜,游戏结束
  if (tn == 4) {
   return true
  }
  //向下遍历,x相同,y递减
  for (i in 1..5) {
   val _bn: Int = i
   for (item in arry) {
    if (data.point.x == item.point.x && data.point.y - i == item.point.y) {
     bn++
     break
    }
   }
   if (_bn != bn) {
    break
   }
  }
  if (bn == 4) {
   return true
  }
  //向左向右
  return bn + tn >= 4
 }

 //对角遍历
 fun acrossErgodic(data: Data, arry: List<Data>): Boolean {
  var lt = 0 //左上方向连续棋子个数
  var lb = 0 //左下方向连续棋子个数
  var rt = 0 //右上方向连续棋子个数
  var rb = 0 //右下方向连续棋子个数
  //右下方向遍历
  for (i in 1..5) {
   val _rb: Int = i
   for (item in arry) {
    if (data.point.x + i == item.point.x && data.point.y + i == item.point.y) {
     rb++
     break
    }
   }
   if (_rb != rb) {
    break
   }
  }
  if (rb == 4) {
   return true
  }
  //左上方向遍历
  for (i in 1..5) {
   val _lt: Int = i
   for (item in arry) {
    if (data.point.x - i == item.point.x && data.point.y - i == item.point.y) {
     lt++
     break
    }
   }
   if (_lt != lt) {
    break
   }
  }
  if (lt == 4) {
   return true
  }
  //左上右下这条对角线
  if (lt + rb >= 4) {
   return true
  }
  //右上遍历
  for (i in 1..5) {
   val _rt: Int = i
   for (item in arry) {
    if (data.point.x + i == item.point.x && data.point.y - i == item.point.y) {
     rt++
     break
    }
   }
   if (_rt != rt) {
    break
   }
  }
  if (rt == 4) {
   return true
  }
  //左下遍历
  for (i in 1..5) {
   val _lb: Int = i
   for (item in arry) {
    if (data.point.x - i == item.point.x && data.point.y + i == item.point.y) {
     lb++
     break
    }
   }
   if (_lb != lb) {
    break
   }
  }
  if (lb == 4) {
   return true
  }
  //左下右上这条对角线
  return lb + rt >= 4
 }

 fun reset() {
  list.clear()
  listW.clear()
  listB.clear()
  wSuccess = false
  bSuccess = false
 }
}

主界面

package wjc.kotlintest

import android.graphics.Point
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.MotionEvent
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
 override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_main)
  custom_view.setOnTouchListener { v, e ->
   when (e.action) {
    MotionEvent.ACTION_DOWN -> {
     val x = e.x
     val y = e.y
     val x_n: Int = ((x - 20) / 60f + 0.5f).toInt()
     val y_n: Int = ((y - 20) / 60f + 0.5f).toInt()
     val data = Data(Point(x_n, y_n))
     custom_view.addData(data)
     custom_view.invalidate()
     if (custom_view.wSuccess) {
      Toast.makeText(this, "白旗获胜!", Toast.LENGTH_LONG).show()
      custom_view.setEnabled(false)
     } else if (custom_view.bSuccess) {
      Toast.makeText(this, "黑棋获胜!", Toast.LENGTH_LONG).show()
      custom_view.setEnabled(false)
     }
    }
   }
   return@setOnTouchListener true
  }
  reset.setOnClickListener {
   custom_view.reset()
   custom_view.invalidate()
   custom_view.setEnabled(true)
  }
 }
}

数据类

package wjc.kotlintest

import android.graphics.Point

/**
 * Created by wjc on 2019/12/10.
 */
data class Data(val point: Point) {
 override fun equals(other: Any?): Boolean {
  if (other is Data) {
   if (point.x == other.point.x && point.y == other.point.y) {
    return true
   } else {
    return false
   }
  } else {
   return false
  }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 基于android实现五子棋开发

    基于Android的五子棋的开发,供大家参考,具体内容如下 需求分析 1 棋盘和棋子绘制 2 按照五子棋的规则制定游戏胜负规则  3 鼠标响应 在对战中 需要通过鼠标点击下棋 进行游戏的基本操作 4 游戏模式 双人对战 两人交替落子 双方孰先孰后随机决定 5 棋子的形式和作用 棋子分为黑白两种棋子 双方各持一种棋子 通过黑先白后的方式来进行对局 6 通过棋子完成五连珠结束游戏 流程图 android stdio中的基本架构 CheckWinner.java package com.example

  • Android自定义View实现五子棋小游戏

    本文实例为大家分享了Android实现五子棋小游戏的具体代码,供大家参考,具体内容如下 配图: 代码: package com.example.fiveson; import java.util.LinkedList; import java.util.List; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphic

  • android简单自定义View实现五子棋

    本文实例为大家分享了android自定义View实现五子棋的具体代码,供大家参考,具体内容如下 先说一下吧,android的自定义View就是自己实现一个类去继承View,实现其中的方法,这里面我最感兴趣的就是onDraw方法了,因为你要的样式都要在这里面进实现,看一下效果图吧: 大概就是介个样子的,长得丑不要紧,能用就行,毕竟只是简单的了解一下嘛! *protected void onDraw(Canvas canvas) { super.onDraw(canvas); RectF rectF

  • Android开发实现的简单五子棋游戏示例

    本文实例讲述了Android开发实现的简单五子棋游戏.分享给大家供大家参考,具体如下: 我刚刚在Android上写的一个五子棋的小程序,在这里跟大家分享一下. 写完以后感觉Android的SDK,虽然也是使用Java的,但是跟Java ME还是有很大不一样. 首先就是Android的SDK没有实现所有的Java ME标准,原来运行在KJava上的应用程序是不能在Android上直接跑的. 另外就是Android的SDK有大量的API是Android自己的,需要开发人员去了解. Android的开

  • Android下SDL2实现五子棋游戏

    本文实例介绍了Android下用SDL2实现一个简单的五子棋游戏,分享给大家供大家参考,具体内容如下 1. Five.c // Five.c // SDL2 五子棋 // gcc -mwindows -o Five Five.c FiveData.c FiveData.h -lSDL2 -lSDL2main -lSDL2_image -lSDL2_ttf //#define _DEBUG_ #include <stdio.h> #include <string.h> #includ

  • Android五子棋游戏程序完整实例分析

    最近学习了五子棋的课程,感觉挺不错.然后自己写了个关于五子棋的android程序,从中还是能够学习到很多东西的.现在我们开始今天五子棋程序的编写历程.程序的源码请参见友情链接: 好了,我们现在开始一步步的构建出项目来,首先是如下的项目结构图: 运行的效果图: 一些前期做准备的代码 1. 主活动类MainActivity,在菜单中加入了再来一局的功能: public class MainActivity extends AppCompatActivity { private ChessBoardV

  • Android自定义View实现五子棋游戏

    本文实例为大家分享了Android五子棋游戏的具体代码,供大家参考,具体内容如下 1.效果图: 2.GobangPanel棋盘面板: public class GobangPanel extends View { private int mPanelWidth;//棋盘的宽度 private float mLineHeight;//行,高要为float private int MAX_LINE = 15;//棋盘行数 private int MAX_COUNT_IN_LINE = 5;//设置赢

  • kotlin实现五子棋单机游戏

    最近学了点kotlin的相关知识,顺手写了一个简单的五子棋单机游戏,分享给大家吧!有兴趣的可以看看 五子棋界面 package wjc.kotlintest import android.content.Context import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.util.AttributeSet import android.v

  • 按键精灵在单机游戏的妙用

    很多人都用按键精灵玩网游 可有谁想过按键精灵可以用在单机游戏上? 我来举几个例子吧 1. 角色扮演 RPG - 很明显的,练级是乏味的,特别是在游戏后期,要杀好多个敌人才嗯能够升级,用按键精灵写个自动练级程序完全是可能的,特别是在现在很多RPG游戏都有"自动"这个功能的情况下,一场战斗后让他自动保存一下(当然,也要用精灵)否则死了就又得重新来啦,嘎嘎,如果你厉害,还能看你是不是死了,死了的话就 load,嘎嘎 2. 即时战略 RTS - 不错,就连即时战略游戏也可以用按键精灵,不知道大

  • java实现五子棋小游戏

    java实现五子棋小游戏 package Gomoku; import java.awt.Toolkit; import javax.swing.JFrame; public class GomokuFrame extends JFrame { //定义一个操作面板 OperatorPane op=null; public GomokuFrame() { //设置名称 this.setTitle("五子棋"); //设置窗口大小 this.setSize(510,510); //设置窗

  • C语言实现五子棋小游戏

    首先我们先来看一个稍微简单些的实现方式: #include <stdio.h> #include <stdlib.h> #define N 15 int chessboard[N + 1][N + 1] = { 0 }; int whoseTurn = 0; void initGame(void); void printChessboard(void); void playChess(void); int judge(int, int); int main(void) { init

  • python实现五子棋小游戏

    本文实例为大家分享了python实现五子棋小游戏的具体代码,供大家参考,具体内容如下 暑假学了十几天python,然后用pygame模块写了一个五子棋的小游戏,代码跟有缘人分享一下. import numpy as np import pygame import sys import traceback import copy from pygame.locals import * pygame.init() pygame.mixer.init() #颜色 background=(201,202

  • js实现双人五子棋小游戏

    本文实例为大家分享了js实现双人五子棋小游戏的具体代码,供大家参考,具体内容如下 这是自己自学js的时候,在网上找的js源码,由于是自学,花了数小时才把这个源码大致弄明白. 大致算法 自定义棋盘规格,直接在棋盘建新div就可以,长度宽度用计算就可以了.下棋,在div里再建class,这里要给每个class标一个site值,由site值写出该棋子竖直方向和横向的坐标,由坐标可以写出棋子胜利的条件.而棋子的黑白走是用标识符,偶的标识符则是白棋子的class.奇的标识符则是黑棋子的class. ps

  • js+canvas实现五子棋小游戏

    本文实例为大家分享了js+canvas实现五子棋小游戏的具体代码,供大家参考,具体内容如下 效果展示: 源码展示: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>五子棋</title> <style> * { margin: 0; padding: 0; } body { margin-to

  • Java项目实现五子棋小游戏

    本文实例为大家分享了Java实现五子棋小游戏的具体代码,供大家参考,具体内容如下 项目名称 五子棋小游戏 项目描述 可以改变获胜棋子数,率先连成棋数的人获胜 代码实现 测试类 public class Test { public static void main(String[] args) { FiveChess fiveChess = new FiveChess(); fiveChess.start(); } } 主类:实现主方法 public class FiveChess { priva

  • JavaScript实现五子棋小游戏

    本文实例为大家分享了JavaScript实现五子棋小游戏的具体代码,供大家参考,具体内容如下 HTML部分 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>五子棋</title> <style> * { padding: 0; margin: 0; } body{ padding-top: 1

随机推荐