Advertisement
loloof64

Chessboard.vue

Apr 21st, 2018
386
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <template scoped>
  2.     <AbsoluteLayout
  3.      :width='boardSize' :height='boardSize'
  4.      backgroundColor='salmon'
  5.      >
  6.         <AbsoluteLayout v-for='(itRank, rank) in 8' :key='rank'>
  7.             <Label v-for='(itFile, file) in 8' :key='10*rank + file'
  8.                 :width='cellSize' :height='cellSize'
  9.                 :left='cellX(file)' :top='cellY(rank)'
  10.                 :backgroundColor='colorForRankAndFile(rank, file)'
  11.              />
  12.  
  13.              <SVGImage v-for='(itFile, file) in 8' :key='10*rank + file'
  14.                 v-if='pieceForCell(rank, file)' :src='imageForCell(rank, file)'
  15.                 :width='cellSize' :height='cellSize'
  16.                 :left='cellX(file)' :top='cellY(rank)'
  17.              />
  18.         </AbsoluteLayout>
  19.  
  20.         <Label v-for='(letter, file) in fileCoords' :key='"filecoord_top_" + file'
  21.             fontWeight='bold' :fontSize='fontSize'
  22.             :left='fileCoordX(file)' :top='fileCoordTopY()'
  23.             :text='letter' :color='DodgerBlue'
  24.          />
  25.  
  26.          <Label v-for='(letter, file) in fileCoords' :key='"filecoord_bottom_" + file'
  27.             fontWeight='bold' :fontSize='fontSize'
  28.             :left='fileCoordX(file)' :top='fileCoordBottomY()'
  29.             :text='letter' :color='DodgerBlue'
  30.          />
  31.  
  32.          <Label v-for='(letter, rank) in rankCoords' :key='"rankcoord_left_" + rank'
  33.             fontWeight='bold' :fontSize='fontSize'
  34.             :left='rankCoordLeftX()' :top='rankCoordY(rank)'
  35.             :text='letter' :color='DodgerBlue'
  36.          />
  37.  
  38.          <Label v-for='(letter, rank) in rankCoords' :key='"rankcoord_right_" + rank'
  39.             fontWeight='bold' :fontSize='fontSize'
  40.             :left='rankCoordRightX()' :top='rankCoordY(rank)'
  41.             :text='letter' :color='DodgerBlue'
  42.          />
  43.  
  44.     </AbsoluteLayout>
  45. </template>
  46.  
  47. <script scoped>
  48.     import {ChessCell, FileCoord, RankCoord} from './js/ChessCoord';
  49.     import {ChessLogicProvider} from './js/ChessLogic';
  50.     import {ChessPieceType} from './js/ChessPiece';
  51.  
  52.     export default {
  53.         name: 'Chessboard',
  54.         data(){
  55.             return {
  56.                 imagesLoader,
  57.             }
  58.         },
  59.         props: {
  60.             cellSize: {
  61.                 type: Number,
  62.                 default: 20,
  63.             },
  64.             reversed: {
  65.                 type: Boolean,
  66.                 default: false,
  67.             },
  68.             logic: {
  69.                 type: ChessLogicProvider,
  70.                 required: true,
  71.             }
  72.         },
  73.         computed: {
  74.             boardSize() {
  75.                 return 9*this.cellSize;
  76.             },
  77.             fontSize() {
  78.                 return parseInt(this.cellSize * 0.4);
  79.             },
  80.             fileCoords() {
  81.                 return this.reversed ? "HGFEDCBA" : "ABCDEFGH";
  82.             },
  83.             rankCoords() {
  84.                 return this.reversed ? "12345678" : "87654321";
  85.             },
  86.             pieceForCell(rank, file) {
  87.                 return this.logic.getPieceForCell(new ChessCell(
  88.                     new FileCoord(file), new RankCoord(rank)
  89.                 ));
  90.             },
  91.             imageForCell(rank, file) {
  92.                 const piece = this.logic.getPieceForCell(new ChessCell(
  93.                     new FileCoord(file), new RankCoord(rank)
  94.                 ));
  95.                 let imageRef = '';
  96.                 if (piece.type === ChessPieceType.PAWN){
  97.                     imageRef = piece.isWhiteOwner ? './assets/Chess_plt45.svg' : './assets/Chess_pdt45.svg';
  98.                 } else if (piece.type === ChessPieceType.KNIGHT){
  99.                     imageRef = piece.isWhiteOwner ? './assets/Chess_nlt45.svg' : './assets/Chess_ndt45.svg';
  100.                 } else if (piece.type === ChessPieceType.BISHOP){
  101.                     imageRef = piece.isWhiteOwner ? './assets/Chess_blt45.svg' : './assets/Chess_bdt45.svg';
  102.                 } else if (piece.type === ChessPieceType.ROOK){
  103.                     imageRef = piece.isWhiteOwner ? './assets/Chess_rlt45.svg' : './assets/Chess_rdt45.svg';
  104.                 } else if (piece.type === ChessPieceType.QUEEN){
  105.                     imageRef = piece.isWhiteOwner ? './assets/Chess_qlt45.svg' : './assets/Chess_qdt45.svg';
  106.                 } else if (piece.type === ChessPieceType.KING){
  107.                     imageRef = piece.isWhiteOwner ? './assets/Chess_klt45.svg' : './assets/Chess_kdt45.svg';
  108.                 }
  109.                 return imageRef;
  110.             }
  111.         },
  112.         methods: {
  113.             colorForRankAndFile(lineIndex, index){
  114.                 const whiteCellColor = 'khaki';
  115.                 const blackCellColor = 'saddleBrown';
  116.  
  117.                 return (index + lineIndex) % 2 > 0 ? whiteCellColor : blackCellColor;
  118.             },
  119.             cellY(rankIndex) {
  120.                 return this.cellSize * (7.5 - rankIndex);
  121.             },
  122.             cellX(fileIndex) {
  123.                 return this.cellSize * (0.5 + fileIndex);
  124.             },
  125.             fileCoordX(fileIndex) {
  126.                 return parseInt(this.cellSize * (0.90 + fileIndex));
  127.             },
  128.             fileCoordTopY() {
  129.                 return parseInt(this.cellSize * -0.05);
  130.             },
  131.             fileCoordBottomY() {
  132.                 return parseInt(this.cellSize * 8.45);
  133.             },
  134.             rankCoordY(rankIndex) {
  135.                 return parseInt(this.cellSize * (0.65 + rankIndex));
  136.             },
  137.             rankCoordLeftX() {
  138.                 return parseInt(this.cellSize * 0.15);
  139.             },
  140.             rankCoordRightX() {
  141.                 return parseInt(this.cellSize * 8.65);
  142.             },
  143.         }
  144.     }
  145. </script>
  146.  
  147. <style scoped>
  148. </style>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement