VUE+Canvas 간단 한 오목 게임 의 전 과정 실현

12933 단어 vuecanvas오목
머리말
포석 에 있어 오목 은 무 작위 운동 을 하 는 게임 에 비해 실현 하기 가 상대 적 으로 간단 하고 사고방식 도 뚜렷 하 다.모두 다음 과 같다.
(1)바둑판 그리 기;
(2)사건 을 감청 하여 흑백 바둑 알 그리 기;
(3)매번 탈락 한 후에 5 자가 연결 되 는 지 판단 하고 있 으 면 이긴다.
가장 복잡 한 것 은 아마도 오목 이 이 겼 다 고 판단 하 는 것 일 것 입 니 다.그러면 간단 한 것 부터 시작 해서 바둑판 을 그 려 보 세 요~
1.바둑판 그리 기
바둑판 은 매우 간단 하 다.우 리 는 15*15 의 바둑판 을 그 려 서 횡선 과 세로 선 이 서로 교차 된다.

drawCheckerboard() {
      //    
      let _this = this;
      _this.ctx.beginPath();
      _this.ctx.fillStyle = "#fff";
      _this.ctx.rect(0, 0, 450, 450);
      _this.ctx.fill();
      for (var i = 0; i < 15; i++) {
        _this.ctx.beginPath();
        _this.ctx.strokeStyle = "#D6D1D1";
        _this.ctx.moveTo(15 + i * 30, 15); //     15  ,  30px;
        _this.ctx.lineTo(15 + i * 30, 435);
        _this.ctx.stroke();
        _this.ctx.moveTo(15, 15 + i * 30); //     15  ,  30px;
        _this.ctx.lineTo(435, 15 + i * 30);
        _this.ctx.stroke();
 
        _this.resultArr.push(new Array(15).fill(0));
      }
}
먼저 450*450 의 정사각형 으로 바닥 을 닦 고 사방 에 15 너비 의 공백 을 남 긴 다음 에 간격 이 30 인 선 을 그린다.for 순환 에서 우 리 는 15*15 의 2 차원 배열 을 초기 화하 고 모두 0 을 채 웠 습 니 다.맞습니다.바로 기록 한 것 입 니 다.

2.감청 클릭 이벤트 흑백 바둑 알 그리 기
자,dom 을 가 져 오 는 김 에 click 사건 을 감청 하여 바둑 알 을 그립 니 다.
let container = document.getElementById("gobang");
container.addEventListener("click", _this.handleClick);

handleClick(event) {
      let x = event.offsetX - 70;
      let y = event.offsetY - 70;
      if (x < 15 || x > 435 || y < 15 || y > 435) {
        //     
        return;
      }
      this.drawChess(x, y);
      if(this.winGame){
        this.drawResult();
        return;
      }
      this.whiteTurn = !this.whiteTurn;
      this.drawText();
}
바둑 알 을 그 리 는 코드:

drawChess(x, y) {
      let _this = this;
      let xLine = Math.round((x - 15) / 30); //    x 
      let yLine = Math.round((y - 15) / 30); //    y 
      if(_this.resultArr[xLine][yLine] !== 0){
        return;
      }
      let grd = _this.ctx.createRadialGradient(
        xLine * 30 + 15,
        yLine * 30 + 15,
        4,
        xLine * 30 + 15,
        yLine * 30 + 15,
        10
      );
      grd.addColorStop(0, _this.whiteTurn ? "#fff" : "#4c4c4c");
      grd.addColorStop(1, _this.whiteTurn ? "#dadada" : "#000");
      _this.ctx.beginPath();
      _this.ctx.fillStyle = grd;
      _this.ctx.arc(
        xLine * 30 + 15,
        yLine * 30 + 15,
        10,
        0,
        2 * Math.PI,
        false
      );
      _this.ctx.fill();
      _this.ctx.closePath();
 
      _this.setResultArr(xLine, yLine);
      _this.checkResult(xLine, yLine);
}
좌 표를 클릭 한 가장 가 까 운 바둑판 의 교차점 을 쉽게 계산 할 수 있 습 니 다.물론 그곳 에 이미 떨 어 졌 다 면 return 해 야 합 니 다.그리고 교점 에 흰 자 나 검 은 자 를 그 려 서 점 변 으로 채 워 서 바둑 알 을 더욱 그럴듯 하 게 보이 게 한다.이 어 대응 하 는 2 차원 배열 에 바둑 알 상황 을 기록 했다.

setResultArr(m, n) {
      let _this = this;
      _this.resultArr[m][n] = _this.whiteTurn ? 1 : 2; //    1;   2
 
}


3.오목 의 승부 결 과 를 검사한다.
승 부 는 어떻게 판단 합 니까?육안 으로 보면 현재 낙 자 를 0,0 원점 으로 좌표 계 를 만 든 다음 에 0°,180°,45°와 135°네 개의 선 에 연속 5 자가 있 는 지 판단 하 는 것 이다.직접 옮 겨 다 니 는 것 보다 네 개의 온라인 데 이 터 를 꺼 내 연 결 된 5 개의 1 이나 2 문자 가 있 는 지 판단 하 는 것 이 좋다.
우리 가 떨 어 진 배열 의 좌 표 는[m,n]이 라 고 가정 하 자.
(1)횡선 결과 배열 문자열:this.resultArr[m].join(');
(2)세로 선의 결과 배열 문자열:

for(let i = 0; i<15; i++){
        lineHorizontal.push(_this.resultArr[i][n]);

}

(3)135°(왼쪽 위 에서 오른쪽 아래):j 는 0-15 에서 각각 this.resultArr[m 를 취한 다. - j][n -j]결과 unshift 는 임시 배열 의 머리 에 들 어가 this.resultArr[m 를 가 져 옵 니 다. + j][n + j]임시 배열 의 꼬리 부분 에 놓 고 결 과 를 이룬다.
(4)45 도(왼쪽 아래 에서 오른쪽 위):j 는 0-15 에서 각각 this.resultArr[m 를 취한 다. + j][n -j]결과 unshift 는 임시 배열 의 머리 에 들 어가 this.resultArr[m 를 가 져 옵 니 다. - j][n + j]임시 배열 의 꼬리 부분 에 놓 고 결 과 를 이룬다.
물론 이 안 에는 배열 의 경 계 를 판단 해 야 한다.
결과 문자열 을 얻 은 후에 우 리 는'22222'나'11111'같은 문자열 이 존재 하 는 지 판단 하고 승 리 를 설명 합 니 다.

checkResult(m ,n){ //      5   
      let _this = this;
      let checkStr = _this.whiteTurn ? CheckStrWhite : CheckStrBlack;
      //   [m,n]           
      let lineVertical = _this.resultArr[m].join('');
      if(lineVertical.indexOf(checkStr) > -1){
        _this.winGame = true;
        return;
      }
      let lineHorizontal = [];
      for(let i = 0; i<15; i++){
        lineHorizontal.push(_this.resultArr[i][n]);
      }
      lineHorizontal = lineHorizontal.join('');
      if(lineHorizontal.indexOf(checkStr) > -1){
        _this.winGame = true;
        return;
      }
      let line135 = [];
      for(let j = 0; j < 15; j++){
        if(m - j >= 0 && n - j >= 0){ //    
          line135.unshift(_this.resultArr[m - j][n -j]);
        }
        if(j > 0 && m + j < 15 && n + j < 15){ //    
          line135.push(_this.resultArr[m + j][n + j]);
        }
      }
      line135 = line135.join('');
      if(line135.indexOf(checkStr) > -1){
        _this.winGame = true;
        return;
      }
      let line45 = [];
      for(let j = 0; j < 15; j++){
        if(m + j < 15 && n - j >= 0){ //    
          line45.unshift(_this.resultArr[m + j][n -j]);
        }
        if(j > 0 && m - j >=0 && n + j < 15){ //    
          line45.push(_this.resultArr[m - j][n + j]);
        }
      }
      line45 = line45.join('');
      if(line45.indexOf(checkStr) > -1){
        _this.winGame = true;
        return;
      }
}
마지막 에 이 겼 으 니 어느 쪽 이 이 겼 는 지 보 여 주세요.

이로써 간단 한 흑백 바둑 게임 이 완성 되 었 습 니 다~~~~
낡은 규칙,원본 코드 붙 이기:

<template>
  <div class="gobang">
    <canvas id="gobang" width="800" height="600"></canvas>
  </div>
</template>
 
<script>
const CheckStrWhite = "11111";
const CheckStrBlack = "22222";
export default {
  name: "Gobang",
  data() {
    return {
      ctx: null,
      winGame: false,
      whiteTurn: false, //    ;true-   
      resultArr: [] //          
    };
  },
  mounted() {
    let _this = this;
    let container = document.getElementById("gobang");
 
    container.addEventListener("click", _this.handleClick);
 
    _this.ctx = container.getContext("2d");
    _this.ctx.translate(70,70);
    _this.drawCheckerboard();
  },
  computed:{
    chessText(){
      return this.whiteTurn ? '  ' : '  ';
    }
  },
  methods: {
    drawCheckerboard() {
      //    
      let _this = this;
      _this.ctx.beginPath();
      _this.ctx.fillStyle = "#fff";
      _this.ctx.rect(0, 0, 450, 450);
      _this.ctx.fill();
      for (var i = 0; i < 15; i++) {
        _this.ctx.beginPath();
        _this.ctx.strokeStyle = "#D6D1D1";
        _this.ctx.moveTo(15 + i * 30, 15); //     15  ,  30px;
        _this.ctx.lineTo(15 + i * 30, 435);
        _this.ctx.stroke();
        _this.ctx.moveTo(15, 15 + i * 30); //     15  ,  30px;   14*14;
        _this.ctx.lineTo(435, 15 + i * 30);
        _this.ctx.stroke();
 
        _this.resultArr.push(new Array(15).fill(0));
      }
      _this.drawText();
    },
    drawChess(x, y) {
      let _this = this;
      let xLine = Math.round((x - 15) / 30); //    x 
      let yLine = Math.round((y - 15) / 30); //    y 
      if(_this.resultArr[xLine][yLine] !== 0){
        return;
      }
      let grd = _this.ctx.createRadialGradient(
        xLine * 30 + 15,
        yLine * 30 + 15,
        4,
        xLine * 30 + 15,
        yLine * 30 + 15,
        10
      );
      grd.addColorStop(0, _this.whiteTurn ? "#fff" : "#4c4c4c");
      grd.addColorStop(1, _this.whiteTurn ? "#dadada" : "#000");
      _this.ctx.beginPath();
      _this.ctx.fillStyle = grd;
      _this.ctx.arc(
        xLine * 30 + 15,
        yLine * 30 + 15,
        10,
        0,
        2 * Math.PI,
        false
      );
      _this.ctx.fill();
      _this.ctx.closePath();
 
      _this.setResultArr(xLine, yLine);
      _this.checkResult(xLine, yLine);
    },
    setResultArr(m, n) {
      let _this = this;
      _this.resultArr[m][n] = _this.whiteTurn ? 1 : 2; //    1;   2
 
    },
    
    checkResult(m ,n){ //      5   
      let _this = this;
      let checkStr = _this.whiteTurn ? CheckStrWhite : CheckStrBlack;
      //   [m,n]           
      let lineVertical = _this.resultArr[m].join('');
      if(lineVertical.indexOf(checkStr) > -1){
        _this.winGame = true;
        return;
      }
      let lineHorizontal = [];
      for(let i = 0; i<15; i++){
        lineHorizontal.push(_this.resultArr[i][n]);
      }
      lineHorizontal = lineHorizontal.join('');
      if(lineHorizontal.indexOf(checkStr) > -1){
        _this.winGame = true;
        return;
      }
      let line135 = [];
      for(let j = 0; j < 15; j++){
        if(m - j >= 0 && n - j >= 0){ //    
          line135.unshift(_this.resultArr[m - j][n -j]);
        }
        if(j > 0 && m + j < 15 && n + j < 15){ //    
          line135.push(_this.resultArr[m + j][n + j]);
        }
      }
      line135 = line135.join('');
      if(line135.indexOf(checkStr) > -1){
        _this.winGame = true;
        return;
      }
      let line45 = [];
      for(let j = 0; j < 15; j++){
        if(m + j < 15 && n - j >= 0){ //    
          line45.unshift(_this.resultArr[m + j][n -j]);
        }
        if(j > 0 && m - j >=0 && n + j < 15){ //    
          line45.push(_this.resultArr[m - j][n + j]);
        }
      }
      line45 = line45.join('');
      if(line45.indexOf(checkStr) > -1){
        _this.winGame = true;
        return;
      }
    },
    drawText(){
      let _this = this;
      _this.ctx.clearRect(435 + 60, 0, 100, 70);
      _this.ctx.fillStyle = "#fff";
      _this.ctx.font="20px Arial";
      _this.ctx.fillText('  :' + _this.chessText, 435 + 70,  35);
    },
    drawResult(){
      let _this = this;
      _this.ctx.fillStyle = "#ff2424";
      _this.ctx.font="20px Arial";
      _this.ctx.fillText(_this.chessText+' !', 435 + 70,  70);
    },
    handleClick(event) {
      let x = event.offsetX - 70;
      let y = event.offsetY - 70;
      if (x < 15 || x > 435 || y < 15 || y > 435) {
        //     
        return;
      }
      this.drawChess(x, y);
      if(this.winGame){
        this.drawResult();
        return;
      }
      this.whiteTurn = !this.whiteTurn;
      this.drawText();
    }
  }
};
</script>
 
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped lang="scss">
.gobang {
  #gobang {
    background: #2a4546;
  }
}
</style>
총결산
VUE+Canvas 가 간단 한 오목 게임 을 실현 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 VUE+Canvas 오목 게임 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기