java實(shí)現(xiàn)簡單五子棋小游戲(1)
本文實(shí)例為大家分享了java實(shí)現(xiàn)簡單五子棋小游戲的具體代碼,供大家參考,具體內(nèi)容如下
講解
五子棋,實(shí)際上就是用一個(gè)數(shù)組來實(shí)現(xiàn)的。沒有其他很復(fù)雜的結(jié)構(gòu)。
首先我們制作五子棋,先要有一個(gè)棋盤。
public void setGraphics(Graphics g){ ?? ??? ?this.g=g; ?? ??? ?for(int i=0;i<11;i++){ ?? ??? ??? ?g.drawLine(100+Size*i, 100, 100+Size*i, 500); ?? ??? ??? ?g.drawLine(100, 100+Size*i, 500, 100+Size*i); ?? ??? ?} ?? ??? ?for(int i=0;i<11;i++){ ?? ??? ??? ?for(int j=0;j<11;j++){ ?? ??? ??? ??? ?chessboard[i][j]=0; ?? ??? ??? ?} ?? ??? ?} ?? ?}
此時(shí)我們?cè)诋嫴忌现谱髁艘粋€(gè)棋盤,圖示如下:
接下來我們要實(shí)現(xiàn)的就是如何去放置棋子了。
放置棋子大體思路就是,當(dāng)我們點(diǎn)擊一個(gè)網(wǎng)格點(diǎn)的時(shí)候,可以出現(xiàn)一個(gè)白棋或者黑棋,所以我們?cè)谶@里需要學(xué)會(huì)如何畫一個(gè)橢圓。
// 繪制一個(gè)橢圓 ? g.drawOval(a-Size/4, b-Size/4, Size/2, Size/2);//修改左上角的坐標(biāo),使畫好的圓恰好在以網(wǎng)格點(diǎn)所在的位置上 // 填充一個(gè)橢圓 ?g.setColor(Color.BLACK); ?g.fillOval(a-Size/4, b-Size/4, Size/2, Size/2);
此時(shí),點(diǎn)擊某一個(gè)位置就會(huì)出現(xiàn)一個(gè)黑棋子。這里我們需要注意的是,我們不可能要求用戶每一次的點(diǎn)擊都非常準(zhǔn)確,所以我們必須設(shè)定一個(gè)范圍,只要這個(gè)范圍內(nèi)的點(diǎn)擊,我們都默認(rèn)點(diǎn)擊到了這個(gè)網(wǎng)格上面。因?yàn)榫W(wǎng)格大小為40,所以我們以一個(gè)網(wǎng)格點(diǎn)位中心,向上下左右移動(dòng)20長度的范圍都屬于這個(gè)點(diǎn)。
白棋的設(shè)置也一樣
if(number==0){ ? ? ? ? ?? ??? ??? ?// 繪制一個(gè)橢圓 ? ? ? ? ? ? ? ? ?? ?g.drawOval(a-Size/4, b-Size/4, Size/2, Size/2);//修改左上角的坐標(biāo),使畫好的圓恰好在以網(wǎng)格點(diǎn)所在的位置上 ? ? ? ? ? ? ? ? ?? ?// 填充一個(gè)橢圓 ? ? ? ? ? ? ? ? ?? ?g.setColor(Color.BLACK); ? ? ? ? ? ? ? ? ?? ?g.fillOval(a-Size/4, b-Size/4, Size/2, Size/2); ? ? ? ? ? ? ? ? ?? ?number++; ? ? ? ? ?? ??? ?} ? ? ? ? ?? ??? ?else{ ? ? ? ? ?? ??? ??? ?g.drawOval(a-Size/4, b-Size/4, Size/2, Size/2); ? ? ? ? ? ? ? ? ?? ?// 填充一個(gè)橢圓 ? ? ? ? ? ? ? ? ?? ?g.setColor(Color.WHITE); ? ? ? ? ? ? ? ? ?? ?g.fillOval(a-Size/4, b-Size/4, Size/2, Size/2); ? ? ? ? ? ? ? ? ?? ?number--; ? ? ? ? ?? ??? ?}
現(xiàn)在我們看一下我們的棋盤,白棋和黑棋都可以放到棋盤上面了,但是依舊存在一個(gè)問題,當(dāng)我們?cè)谕晃恢命c(diǎn)擊兩次后會(huì)發(fā)生覆蓋現(xiàn)象。如何解決?
我們只需要設(shè)置一個(gè)數(shù)組來記錄這個(gè)位置是否放置了棋子就好了
完整代碼
package game; import java.awt.Graphics; import javax.swing.JFrame; public class ShowUI { ?? ?public void Draw(){ ?? ??? ?//設(shè)置格子的大小 ?? ??? ? ?? ??? ?JFrame drawframe=new JFrame();//創(chuàng)建一個(gè)窗體 ?? ??? ?drawframe.setSize(1000,600);//設(shè)置窗體大小 ?? ??? ?drawframe.setLocationRelativeTo(null);//設(shè)置相對(duì)位置 ?? ??? ?drawframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//關(guān)閉窗體操作 ?? ??? ?//創(chuàng)建監(jiān)聽器對(duì)象 ?? ??? ?DrawListener draw = new DrawListener(); ?? ??? ?drawframe.addMouseListener(draw); ?? ??? ?drawframe.setVisible(true);//設(shè)置窗體可見 ?? ??? ?try { ?? ??? ??? ?Thread.sleep(566); ?? ??? ?} catch (InterruptedException e) { ?? ??? ??? ?// TODO Auto-generated catch block ?? ??? ??? ?e.printStackTrace(); ?? ??? ?} ?? ??? ?Graphics g = drawframe.getGraphics(); ?? ??? ?//設(shè)置畫布 ?? ??? ?draw.setGraphics(g); ?? ??? ? ?? ?} ?? ?public static void main(String[] args) { ?? ??? ?// TODO Auto-generated method stub ?? ??? ?ShowUI a=new ShowUI(); ?? ??? ?a.Draw();//引用對(duì)象 ?? ?} }
package game; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class DrawListener implements MouseListener{ ?? ?Graphics g; ?? ?public int Start_X=50; ?? ?public int Start_Y=50; ?? ?public int Size=40; ?? ?public int number=0; ?? ?public int [][]chessboard=new int[11][11]; ?? ? ?? ?public void setGraphics(Graphics g){ ?? ??? ?this.g=g; ?? ??? ?for(int i=0;i<11;i++){ ?? ??? ??? ?g.drawLine(100+Size*i, 100, 100+Size*i, 500); ?? ??? ??? ?g.drawLine(100, 100+Size*i, 500, 100+Size*i); ?? ??? ?} ?? ??? ?for(int i=0;i<11;i++){ ?? ??? ??? ?for(int j=0;j<11;j++){ ?? ??? ??? ??? ?chessboard[i][j]=0; ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ?/*public void drawOval(Graphics g) { ? ? ? ?? ? ? ? ?// Graphics2D g2d = (Graphics2D) g.create(); ? ? ? ? //g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); ? ? ? ? //g.setColor(Color.RED); ? ? ? ? // 1. 繪制一個(gè)圓: 圓的外切矩形 左上角坐標(biāo)為(0, 0), 寬高為100 ? ? ? ? g.drawOval(0, 0, 100, 100); ? ? ? ? g.setColor(Color.GRAY); ? ? ? ? // 2. 填充一個(gè)橢圓 ? ? ? ? g.fillOval(120, 100, 100, 150); ? ? ? ? g.dispose(); ? ? }*/ ?? ?/** ? ? ?* Invoked when the mouse button has been clicked (pressed ? ? ?* and released) on a component. ? ? ?*/ ? ? public void mouseClicked(MouseEvent e){ ? ? ?? ?int countx=e.getX(); ? ? ?? ?int county=e.getY(); ? ? ?? ?int Size=40; ? ? ?? ?//起始點(diǎn)為(100,100) ? ? ?? ?//終止點(diǎn)為(500,500) ? ? ?? ?//System.out.println(countx); ? ? ?? ?//System.out.println(county); ? ? ?? ?int a=0; ? ? ?? ?int b=0;//這里是修改點(diǎn)擊顯示的位置,讓最后得到的點(diǎn)在角落上 ? ? ?? ?for(int i=0;i<11;i++){ ?? ??? ??? ?if(countx>=(100+Size*i-(Size/2))&&countx<(100+Size*i+(Size/2))){ ?? ??? ??? ??? ?a=100+Size*i; ?? ??? ??? ??? ?//System.out.println(a); ?? ??? ??? ?} ?? ??? ??? ?if(county>=(100+Size*i-(Size/2))&&county<(100+Size*i+(Size/2))){ ?? ??? ??? ??? ?b=100+Size*i; ?? ??? ??? ??? ?//System.out.println(b); ?? ??? ??? ?} ?? ??? ?} ? ? ?? ?if(a!=0&&b!=0){ ? ? ?? ??? ?int flag1=0; ? ? ?? ??? ?int flag2=0; ? ? ?? ??? ?flag1=(a-100)/Size; ? ? ?? ??? ?flag2=(b-100)/Size; ? ? ?? ??? ?if(chessboard[flag1][flag2]==0){//判斷這個(gè)地方是否已經(jīng)放置了一個(gè)點(diǎn) ? ? ?? ??? ??? ?if(number==0){ ? ? ? ? ?? ??? ??? ?// 繪制一個(gè)橢圓 ? ? ? ? ? ? ? ? ?? ?g.drawOval(a-Size/4, b-Size/4, Size/2, Size/2);//修改左上角的坐標(biāo),使畫好的圓恰好在以網(wǎng)格點(diǎn)所在的位置上 ? ? ? ? ? ? ? ? ?? ?// 填充一個(gè)橢圓 ? ? ? ? ? ? ? ? ?? ?g.setColor(Color.BLACK); ? ? ? ? ? ? ? ? ?? ?g.fillOval(a-Size/4, b-Size/4, Size/2, Size/2); ? ? ? ? ? ? ? ? ?? ?number++; ? ? ? ? ?? ??? ?} ? ? ? ? ?? ??? ?else{ ? ? ? ? ?? ??? ??? ?g.drawOval(a-Size/4, b-Size/4, Size/2, Size/2); ? ? ? ? ? ? ? ? ?? ?// 填充一個(gè)橢圓 ? ? ? ? ? ? ? ? ?? ?g.setColor(Color.WHITE); ? ? ? ? ? ? ? ? ?? ?g.fillOval(a-Size/4, b-Size/4, Size/2, Size/2); ? ? ? ? ? ? ? ? ?? ?number--; ? ? ? ? ?? ??? ?} ? ? ?? ??? ??? ?chessboard[flag1][flag2]=1;//沒放置,那么我們需要在放置后 ? ? ?? ??? ?} ? ? ?? ??? ?else{ ? ? ?? ??? ??? ?System.out.println("此處已經(jīng)放置了棋子"); ? ? ?? ??? ?} ? ? ?? ??? ? ? ? ?? ?} ? ? ?? ? ? ? } ? ? /** ? ? ?* Invoked when a mouse button has been pressed on a component. ? ? ?*///點(diǎn)擊鼠標(biāo) ? ? public void mousePressed(MouseEvent e){ ? ? ?? ? ? ? } ? ? /** ? ? ?* Invoked when a mouse button has been released on a component. ? ? ?*///釋放鼠標(biāo) ? ? public void mouseReleased(MouseEvent e){ ? ? ?? ? ? ? } ? ? /** ? ? ?* Invoked when the mouse enters a component. ? ? ?*/ ? ? public void mouseEntered(MouseEvent e){ ? ? ?? ? ? ? } ? ? /** ? ? ?* Invoked when the mouse exits a component. ? ? ?*/ ? ? public void mouseExited(MouseEvent e){ ? ? ?? ? ? ? } }
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot使用@PathVariable進(jìn)行數(shù)據(jù)校驗(yàn)的流程步驟
在SpringBoot項(xiàng)目中,我們經(jīng)常需要從 URL 中獲取參數(shù)并進(jìn)行相關(guān)的數(shù)據(jù)校驗(yàn),而@PathVariable注解就是一種非常方便的方式,可以讓我們?cè)诜椒▍?shù)中直接獲取URL中的參數(shù),并進(jìn)行數(shù)據(jù)校驗(yàn),本文將介紹如何使用@PathVariable注解進(jìn)行數(shù)據(jù)校驗(yàn)2023-06-06Spring數(shù)據(jù)庫多數(shù)據(jù)源路由配置過程圖解
這篇文章主要介紹了Spring數(shù)據(jù)庫多數(shù)據(jù)源路由配置過程圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06SpringCloud?Gateway詳細(xì)分析實(shí)現(xiàn)負(fù)載均衡與熔斷和限流
這篇文章主要介紹了SpringCloud?Gateway實(shí)現(xiàn)路由轉(zhuǎn)發(fā),負(fù)載均衡,熔斷和限流,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07Java和C語言分別實(shí)現(xiàn)水仙花數(shù)及拓展代碼
這篇文章主要介紹了分別用Java和C語言實(shí)現(xiàn)水仙花數(shù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-11-11Java如何使用itext向PDF插入數(shù)據(jù)和圖片
最近項(xiàng)目中使用到Java實(shí)現(xiàn)寫入PDF文件,這篇文章主要給大家介紹了關(guān)于Java如何使用itext向PDF插入數(shù)據(jù)和圖片的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01Java char[]數(shù)組轉(zhuǎn)成String類型詳細(xì)介紹
這篇文章詳細(xì)介紹了Java char[]數(shù)組轉(zhuǎn)成String類型(char to String)的方法,文章中有詳細(xì)的代碼示例,需要的朋友可以參考閱讀2023-04-04Java基礎(chǔ)知識(shí)之成員變量和局部變量淺顯易懂總結(jié)
從語法形式上,看成員變量是屬于類的,而局部變量是在方法中定義的變量或是方法的參數(shù);成員變量可以被public,private,static等修飾符所修飾,而局部變量不能被訪問控制修飾符及static所修飾2021-09-09