บทความนี้อธิบายถึงรหัสเกมหมากรุก Gozi ที่ใช้ใน Java มันถูกแชร์กับคุณสำหรับการอ้างอิงของคุณ รหัสเฉพาะมีดังนี้
1. วัตถุประสงค์เชิงปฏิบัติ
1. หลักการออกแบบอินเตอร์เฟส Javagui
2. หลักการตรวจสอบเหตุการณ์เมาส์ (Mouselistener, MousemotionListener)
2. เนื้อหาที่ใช้งานได้จริง
ออกแบบโปรแกรม Gochi อย่างง่ายที่สามารถตระหนักถึงกระบวนการเกมหมากรุก Gochi ดังแสดงในรูปด้านล่าง
1. บอร์ดหมากรุก Gozi
แพ็คเกจ cn.edu.ouc.fivechess; นำเข้า Java.awt.Color; นำเข้า Java.awt.Cursor; นำเข้า Java.awt.Dimension; นำเข้า java.awt.graphics; นำเข้า java.awt.graphics2d; นำเข้า java.awt.image; นำเข้า Java.awt.RadialgradientPaint; นำเข้า java.awt.renderinghints; นำเข้า java.awt.toolkit; นำเข้า java.awt.event.mousevent; นำเข้า java.awt.event.mouselistener; นำเข้า java.awt.event.mousemotionlistener; นำเข้า java.awt.geom.ellipse2d; นำเข้า Javax.swing.*; /*** goziqi-chess-chess-board คลาส*/กระดานหมากรุกระดับสาธารณะขยาย JPanel ใช้ mouselistener {public public final int margin = 30; // margin public public int grid_span = 35; chesslist = จุดใหม่ [(แถว+1)*(cols+1)]; // เริ่มต้นแต่ละองค์ประกอบอาร์เรย์เป็นโมฆะบูลีน isblack = true; // ค่าเริ่มต้นเริ่มต้นด้วยหมากรุกสีดำ boolean ครั้งแรก gameover = false; // เป็นเกมที่จบลง ภาพเงา Color Colortemp; Public Chessboard () {// Setbackground (color.blue); // ตั้งค่าสีพื้นหลังเป็น img สีส้ม = toolkit.getdefaulttoolkit (). getImage ("board.jpg"); Shadows = Toolkit.getDefaultToolkit (). getImage ("shadows.jpg"); addmouselistener (นี่); addmousemotionListener (ใหม่ mousemotionListener () {โมฆะสาธารณะ mousedragged (MouseEvent E) {} โมฆะสาธารณะ mousemoved (MouseEvent E) {int x1 = (e.getx ()-margin+grid_span/2)/grid_span; // y1 = (e.gety ()-มาร์จิ้น+grid_span/2)/grid_span; SetCursor (เคอร์เซอร์ใหม่ (Cursor.default_cursor)); } // วาดโมฆะสาธารณะ PaintComponent (กราฟิก g) {super.paintComponent (g); // วาดกระดานหมากรุก int imgwidth = img.getWidth (นี่); int imgheight = img.getheight (นี่); // รับความกว้างและความสูงของภาพ int fwidth = getWidth (); int fheight = getheight (); // รับความกว้างและความสูงของหน้าต่าง int x = (fwidth-imgwidth)/2; int y = (fheight-imgheight)/2; G.Drawimage (IMG, X, Y, NULL); สำหรับ (int i = 0; i <= rows; i ++) {// วาดเส้นแนวนอน g.drawline (มาร์จิ้น, ระยะขอบ+i*grid_span, มาร์จิ้น+cols*grid_span, มาร์จิ้น+i*grid_span); } สำหรับ (int i = 0; i <= cols; i ++) {// วาดเส้นแนวตั้ง g.drawline (มาร์จิ้น+i*grid_span, มาร์จิ้น, ระยะขอบ+i*grid_span); } // วาดชิ้นหมากรุกสำหรับ (int i = 0; i <chesscount; i ++) {// สี่แยกกริด x, y พิกัด int xpos = chesslist [i] .getx ()*grid_span+ระยะขอบ; int ypos = chesslist [i] .gety ()*grid_span+margin; G.SetColor (chesslist [i] .getColor ()); // ตั้งค่าสี // G.Filloval (XPOS-point.diameter/2, ypos-point.diameter/2, //point.diameter, point.diameter); //g.drawimage(Shadows, xpos-point.diameter/2, ypos-point.diameter/2, point.diameter, point.diameter, null); colortemp = chesslist [i] .getColor (); if (colortemp == color.black) {RadialgradientPaint Paint = ใหม่ RadialgradientPaint (XPOS-POINT.Diameter/2+25, YPOS-POINT.Diameter/2+10, 20, Float ใหม่ [] {0F, 1F}, สีใหม่ [] ((graphics2d) g) .setPaint (สี); ((graphics2d) g) .setrenderinghint (renderinghints.key_antialiasing, renderinghints.value_antialias_on); ((graphics2d) g) .setrenderinghint (renderinghints.key_alpha_interpolation, renderinghints.value_alpha_interpolation_default); } อื่นถ้า (colortemp == color.white) {radialgradientpaint paint = ใหม่ radialgradientPaint (xpos-point.diameter/2+25, ypos-point.diameter/2+10, 70, float ใหม่ [] {0f, 1f} สีใหม่ ((graphics2d) g) .setPaint (สี); ((graphics2d) g) .setrenderinghint (renderinghints.key_antialiasing, renderinghints.value_antialias_on); ((graphics2d) g) .setrenderinghint (renderinghints.key_alpha_interpolation, renderinghints.value_alpha_interpolation_default); } Ellipse2d e = ใหม่ Ellipse2d.float (XPOS-point.diameter/2, ypos-point.diameter/2, 34, 35); ((graphics2d) g) .fill (e); // กล่องสี่เหลี่ยมสีแดงทำเครื่องหมายชิ้นหมากรุกชิ้นสุดท้ายถ้า (i == ChessCount-1) {// ถ้ามันเป็นชิ้นหมากรุกชิ้นสุดท้าย G.SetColor (color.red); G.DrawRect (XPOS-POINT.Diameter/2, YPOS-POINT.Diameter/2, 34, 35); }}} โมฆะสาธารณะ mousepressed (MouseEvent E) {// เมาส์ถูกเรียกเมื่อกดบนส่วนประกอบ // เกมไม่สามารถเล่นได้อีกต่อไปถ้า (GameOver) กลับมา; สตริง colorname = isblack? "ดำ": "หมากรุกสีขาว"; // แปลงตำแหน่งพิกัดของเมาส์คลิกที่ดัชนีกริด xindex = (e.getx ()-มาร์จิ้น+grid_span/2)/grid_span; Yindex = (e.gety ()-มาร์จิ้น+grid_span/2)/grid_span; // ถ้าคุณออกไปข้างนอกกระดานหมากรุกคุณจะไม่สามารถใส่ได้ถ้า (XINDEX <0 || XINDEX> ROWS || Yindex <0 || Yindex> Cols) กลับมา; // หากมีชิ้นหมากรุกในตำแหน่ง x และ y คุณจะไม่สามารถใส่ได้ถ้า (findchess (xindex, yindex)) กลับ; // ถ้าคุณทำได้เมื่อเสร็จแล้วคุณจะไม่สามารถใส่ได้เมื่อเสร็จสิ้น จุด (xindex, yindex, isblack? color.black: color.white); Chesslist [ChessCount ++] = CH; repaint (); // แจ้งระบบให้วาดใหม่ // หากคุณชนะให้ส่งข้อความแจ้งและไม่สามารถเล่นหมากรุกต่อไปได้ถ้า (iswin ()) {String msg = string.format ("ขอแสดงความยินดี, %s ชนะ!", colorname); joptionpane.ShowMessagedialog (นี่, ผงชูรส); gameover = true; } isblack =! isblack; } // วิธีการเขียนทับ Mouselistener โมฆะสาธารณะ mouseclicked (MouseEvent E) {// เรียกว่าเมื่อปุ่มเมาส์คลิกที่ส่วนประกอบ} โมฆะสาธารณะ mouseentered (MouseEvent E) {// เรียกเมื่อเมาส์เข้ามา Mouserleased (MouseEvent E) {// เรียกว่าเมื่อปุ่มเมาส์ถูกปล่อยออกมาบนส่วนประกอบ} // เรียกในหมากรุกหมากรุกเพื่อดูว่ามีชิ้นส่วนหมากรุกที่มีดัชนี x และ y ที่มีอยู่ในบูลีนส่วนตัว (int x, int y) } return false; } บูลีนส่วนตัว iswin () {int continueCount = 1; // จำนวนชิ้นหมากรุกต่อเนื่อง // มองไปทางทิศตะวันตกในแนวนอนสำหรับ (int x = xindex-1; x> = 0; x-) {color c = isblack? color.black: color.hite; if (getChess (x, yindex, c)! = null) {continueCount ++; } else break; } // มองไปทางทิศตะวันออกในแนวนอนสำหรับ (int x = xindex+1; x <= cols; x ++) {color c = isblack? color.black: color.white; if (getChess (x, yindex, c)! = null) {continueCount ++; } else break; } if (continueCount> = 5) {return true; } else continueCount = 1; // ดำเนินการค้นหาอีกครั้งในแนวตั้ง // ค้นหาขึ้นไปสำหรับ (int y = yindex-1; y> = 0; y-) {color c = isblack? color.black: color.white; if (getChess (xindex, y, c)! = null) {continueCount ++; } else break; } // ดูลงไป (int y = yindex+1; y <= rows; y ++) {color c = isblack? color.black: color.white; if (getChess (xindex, y, c)! = null) continueCount ++; แตกอื่น; } if (continueCount> = 5) ส่งคืนจริง; อย่างอื่นต่อเนื่อง = 1; // ค้นหาต่อไปสำหรับสถานการณ์อื่น: outriquely // Northeast ค้นหา (int x = xindex+1, y = yindex-1; y> = 0 && x <= cols; x ++, y-) {color c = isblack? color.black: color.white; if (getChess (x, y, c)! = null) {ContinueCount ++; } else break; } // การค้นหาทางตะวันตกเฉียงใต้สำหรับ (int x = xindex-1, y = yindex+1; x> = 0 && y <= แถว; x-, y ++) {color c = isblack? color.black: color.white; if (getChess (x, y, c)! = null) {ContinueCount ++; } else break; } if (continueCount> = 5) ส่งคืนจริง; อย่างอื่นต่อเนื่อง = 1; // ค้นหาต่อในสถานการณ์อื่น: Oblique // Northwest ค้นหา (int x = xindex-1, y = yindex-1; x> = 0 && y> = 0; x-, y-) {color c = isblack? color.black: color.white; ถ้า (getChess (x, y, c)! = null) ContinUecount ++; แตกอื่น; } // ตะวันออกเฉียงใต้มองหา (int x = xindex+1, y = yindex+1; x <= cols && y <= แถว; x ++, y ++) {color c = isblack? color.black: color.white; ถ้า (getChess (x, y, c)! = null) ContinUecount ++; แตกอื่น; } if (continueCount> = 5) ส่งคืนจริง; อย่างอื่นต่อเนื่อง = 1; กลับเท็จ; } จุดส่วนตัว getChess (int xindex, int yindex, สีสี) {สำหรับ (จุด p: chesslist) {ถ้า (p! = null && p.getx () == xindex && p.gety () == yindex && p.getColor () == สี) กลับ p; } return null; } โมฆะสาธารณะ retartGame () {// ล้างชิ้นหมากรุกสำหรับ (int i = 0; i <chesslist.length; i ++) {chesslist [i] = null; } // กู้คืนค่าตัวแปรที่เกี่ยวข้องกับเกม isblack = true; gameover = false; // คือเกมจบเกม chessCount = 0; // จำนวนหมากรุกและชิ้นส่วนปัจจุบัน repaint (); } // ตอบกลับไปที่ Chess Public Void GoBack () {ถ้า (chessCount == 0) return; Chesslist [ChessCount-1] = NULL; Chesscount-; if (chessCount> 0) {xIndex = chesslist [chessCount-1] .getx (); Yindex = Chesslist [ChessCount-1] .gety (); } isblack =! isblack; ทาสีใหม่ (); } // มิติสี่เหลี่ยมผืนผ้ามิติสาธารณะ getPreferredSize () {ส่งคืนมิติใหม่ (มาร์จิ้น*2 +grid_span*cols, มาร์จิ้น*2 +grid_span*แถว); - 2. ชิ้นหมากรุก
แพ็คเกจ cn.edu.ouc.fivechess; นำเข้า Java.awt.Color; /*** คลาสหมากรุก*/จุดระดับสาธารณะ {private int x; // x ดัชนีในกระดานหมากรุกส่วนตัว int y; // y ดัชนีในกระดานหมากรุกสีส่วนตัวสี; // สีสาธารณะคงที่เส้นผ่าศูนย์กลางสุดท้ายของสาธารณะ = 30; // เส้นผ่านศูนย์กลางจุดสาธารณะ (int x, int y, สีสี) this.y = y; this.color = color; } public int getx () {// รับดัชนีของ x ในคณะกรรมการหมากรุกส่งคืน x; } สาธารณะ int getey () {return y; } สีสาธารณะ getColor () {// รับสีของชิ้นส่วนหมากรุกกลับสี - 3. คลาสเฟรมหลักของ Gozi
แพ็คเกจ cn.edu.ouc.fivechess; นำเข้า java.awt.event.*; นำเข้า Java.awt.*; นำเข้า Javax.swing.*; /* Goji Main Framework, โปรแกรม*/ คลาสสาธารณะ startChessJFrame ขยาย JFrame {กระดานหมากรุกส่วนตัว; แถบเครื่องมือ JPanel ส่วนตัว; JBUTTON Private JButton StartButton, BackButton, ExitButton; JMENUBAR ส่วนตัว Menubar; ส่วนตัว JMENU SYSMENU; jmenuitem ส่วนตัว startmenuitem, exitmenuitem, backmenuitem; // รีสตาร์ท, ออกและความเสียใจรายการเมนูสาธารณะ startChessJFrame () {settitle ("สแตนด์อโลน goji"); // ตั้งค่า Title Chessboard = New Chessboard (); container contentPane = getContentPane (); ContentPane.add (กระดานหมากรุก); chessboard.SetOpaque (จริง); // สร้างและเพิ่มเมนู menubar = new jmenubar (); // เริ่มต้นเมนูแถบ sysmenu = ใหม่ jmenu ("ระบบ"); // เริ่มต้นเมนู // เริ่มต้นเมนูรายการ startMenuitem = ใหม่ jMenuitem ("รีสตาร์ท"); ExitMenuitem = new JMenuitem ("Exit"); backmenuitem = new jmenuitem ("กลับใจ"); // เพิ่มรายการเมนูสามรายการในเมนู sysmenu.add (startMenuitem); sysmenu.add (exitmenuitem); sysmenu.add (backmenuitem); // เริ่มต้นคลาสภายใน myitemListener lis = ใหม่ myitemListener (); // ลงทะเบียนสามเมนูไปยังผู้ฟังเหตุการณ์ this.startmenuitem.addactionListener (lis); backmenuitem.addactionListener (lis); Exitmenuitem.addactionListener (LIS); menubar.add (sysmenu); // เพิ่มเมนูระบบลงในแถบเมนู setjmenubar (menubar); // ตั้ง menubar ไปยังแถบเครื่องมือ Menubar = new JPanel (); // อินสแตนติสแผงเครื่องมือ // สามปุ่มเริ่มต้น ExitButton = new JButton ("Exit"); backbutton = new JButton ("กลับใจ"); // เค้าโครงปุ่มแผงเครื่องมือด้วย FlowLayout Toolbar.SetLayout (FlowLayout ใหม่ (flowlayout.left)); // เพิ่มสามปุ่มลงในแถบเครื่องมือเครื่องมือ ADD (StartButton); Toolbar.add (ExitButton); Toolbar.Add (backbutton); // ลงทะเบียนปุ่มสามปุ่มเพื่อฟังเหตุการณ์ startbutton.addactionListener (LIS); ExitButton.AddactionListener (LIS); backbutton.addactionListener (lis); backbutton.addactionListener (lis); // วางแผงเครื่องมือไปยังอินเทอร์เฟซ "ใต้" นั่นคือเพิ่ม (แถบเครื่องมือ, BorderLayout.South); เพิ่ม (Chessboard); // เพิ่มวัตถุแผงลงในฟอร์ม // ตั้งค่าอินเตอร์เฟสปิดเหตุการณ์ setDefaultCloseOperation (jframe.exit_on_close); // setsize (800,800); Pack (); // ขนาด Adaptive} คลาสส่วนตัว MyItemListener ใช้ ActionListener {โมฆะสาธารณะ ActionPerformed (ActionEvent E) {Object obj = E.getSource (); // รับแหล่งที่มาของเหตุการณ์ถ้า (obj == startChessJFrame.This.StartMenuitEm System.out.out.println ("เริ่ม"); chessboard.restartgame (); } อื่นถ้า (obj == exitmenuitem || obj == exitbutton) system.exit (0); อื่นถ้า (obj == backmenuitem || obj == backbutton) {system.out.println ("การกลับใจใหม่ ... "); chessboard.goback (); }}} โมฆะคงที่สาธารณะหลัก (สตริง [] args) {startChessJFrame f = ใหม่ startChessJFrame (); // สร้างเฟรมหลัก f.setVisible (จริง); // แสดงเฟรมหลัก}}}}}} 3. สรุป
1. การออกแบบและการใช้งานเมนู?
2. วิธีการวาดชิ้นหมากรุกหลังจากที่เมาส์คลิกบนกระดานหมากรุก? วิธีการวาดกล่องสีแดงสำหรับชิ้นหมากรุกที่คุณเพิ่งติดตั้ง?
3. โครงสร้างข้อมูลสำหรับคะแนนหมากรุกคืออะไร?
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์สำหรับทุกคนในการเรียนรู้การเขียนโปรแกรม Java