版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第Java實現(xiàn)簡易五子棋小游戲本文實例為大家分享了Java實現(xiàn)簡易五子棋小游戲的具體代碼,供大家參考,具體內(nèi)容如下
五子棋是一個簡單小游戲,首先我們先想想五子棋都有什么東西,棋子,棋盤;
首先我們可以定義一個棋子類,棋子類里有棋子的坐標,半徑和顏色;還有棋子的構(gòu)造函數(shù);
importjava.awt.Color;
*棋子類
publicclassChess{
privateintx;//棋子的x坐標索引
privateinty;//棋子的y坐標索引
privateColorcolor;//棋子顏色
publicstatic
intDIAMETER=30;//直徑
publicChess(intx,inty,Colorcolor){//棋子構(gòu)造函數(shù)
this.x=x;
this.y=y;
this.color=color;
}
publicintgetX(){
returnx;
}
publicintgetY(){
returny;
}
publicColorgetColor(){
returncolor;
}
}
接下來我們定義一個主框架,在主框架里有面板對象和三個按鈕對象,分別是重新開始游戲按鈕,悔棋按鈕和退出游戲按鈕;還設(shè)置一個按鈕事件類,用來監(jiān)聽三個按鈕,并作出相應的動作;
importjava.awt.*;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjavax.swing.*;
*五子棋主框架
publicclassChessJFrameextendsJFrame{
privateChessBordchessbord;//聲明一個棋盤對象
privatePaneltool;
//聲明一個面板對象
privateButtonStartButton;//聲明開始按鈕
privateButtonBackButton;//聲明悔棋按鈕
privateButtonexitButton;//聲明退出按鈕
publicChessJFrame(){//構(gòu)造函數(shù)
setTitle("單機版五子棋");//設(shè)置標題
MyButtonListermb=newMyButtonLister();//按鈕事件處理對象
tool=newPanel();//面板對象
chessbord=newChessBord();//棋盤對象
StartButton=newButton("重新開始");//設(shè)置開始按鈕
BackButton=newButton("悔棋");//設(shè)置悔棋按鈕
exitButton=newButton("退出游戲");//設(shè)置退出游戲按鈕
tool.setLayout(newFlowLayout(FlowLayout.CENTER));//流式布局
tool.add(StartButton);
tool.add(BackButton);
tool.add(exitButton);//將三個按鈕添加到面板對象
StartButton.addActionListener(mb);
BackButton.addActionListener(mb);
exitButton.addActionListener(mb);//將三個按鈕添加到事件監(jiān)聽
add(tool,BorderLayout.SOUTH);//按鈕所在的位置
add(chessbord);//添加棋盤對象
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設(shè)置關(guān)閉
pack();//自適應
}
privateclassMyButtonListerimplementsActionListener{
//按鈕處理事件類
@Override
publicvoidactionPerformed(ActionEvente){
//TODOAuto-generatedmethodstub
Objectobj=e.getSource();//獲取事件源
if(obj==StartButton){//事件源是重新開始按鈕
System.out.println("重新開始");
chessbord.restartGame();
}
elseif(obj==BackButton){//事件源是悔棋按鈕
System.out.println("悔棋!");
chessbord.goback();
}
elseif(obj==exitButton){//事件源是退出按鈕
System.exit(0);
}
}
}
publicstaticvoidmain(String[]args){
ChessJFramejf=newChessJFrame();//聲明框架對象
jf.setLocationRelativeTo(null);//居中顯示
jf.setVisible(true);//設(shè)置為可見
}
}
最后一個類是棋盤類,我們要對棋盤的邊距,網(wǎng)格的距離進行賦值,設(shè)定棋盤的初始狀態(tài),如默認黑子先下,定義一個棋子類數(shù)組,來保存棋子對象,再定義一個字符串二維數(shù)組函數(shù)來保存的顏色,用來判斷輸贏,用匿名內(nèi)部類來處理當棋子在面板上移動時的一些狀態(tài);
代碼如下:
publicstaticintMARGIN=30;//定義邊距
publicstaticintROWS=15;//定義行數(shù)
publicstaticintCOLS=15;//定義列數(shù)
publicstaticintGRID_SPAN=35;//網(wǎng)格間距
Chess[]chessList=newChess[(ROWS+1)*(COLS+1)];//定義一個棋子數(shù)組
String[][]board=newString[MARGIN*2+GRID_SPAN*COLS][MARGIN*2+GRID_SPAN*COLS];//聲明一個字符串數(shù)組,用來判斷輸贏
intchessCount;//棋子數(shù)目
intxindex,yindex;//棋子的坐標索引
booleanstart=true;//開始默認黑子先下
booleanGameOver=false;//定義是否游戲結(jié)束
publicChessBord(){//棋盤類構(gòu)造函數(shù)
setBackground(Color.LIGHT_GRAY);//設(shè)置背景顏色
addMouseListener(this);//將棋盤類添加到鼠標事件監(jiān)聽器
addMouseMotionListener(newMouseMotionListener(){//匿名內(nèi)部類
@Override
publicvoidmouseMoved(MouseEvente){//根據(jù)鼠標的移動所在的坐標來設(shè)置鼠標光標形狀
intx1=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//對鼠標光標的x坐標進行轉(zhuǎn)換
inty1=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//對鼠標光標的y坐標進行轉(zhuǎn)換
if(x10||x1ROWS||y10||y1COLS||GameOver||findchess(x1,y1)){
setCursor(newCursor(Cursor.DEFAULT_CURSOR));//設(shè)置鼠標光標為默認形狀
}else{
setCursor(newCursor(Cursor.HAND_CURSOR));//設(shè)置鼠標光標為手型
}
}
@Override
publicvoidmouseDragged(MouseEvente){
}
});
for(inti=0;iMARGIN*2+GRID_SPAN*COLS;i++){//對board[][]賦初值
for(intj=0;jMARGIN*2+GRID_SPAN*COLS;j++){
board[i][j]="0";
}
}
}
我們再對下棋時鼠標按下時的動作事件類進行解析,當在網(wǎng)格上下棋時,判斷是否在棋盤內(nèi)和判斷網(wǎng)格上有沒有棋子,當棋子在棋盤內(nèi)并且網(wǎng)格上沒有棋子,我們就開始畫棋子,將棋子對象和顏色保存,接下來判斷是否勝利,判斷棋盤是否下滿,如果沒有繼續(xù)下棋;
代碼如下;
?publicvoidmousePressed(MouseEvente){//鼠標點擊事件
if(GameOver)//游戲結(jié)束,不能按
return;
StringcolorName=start"黑棋":"白棋";//判斷是什么顏色的棋子
xindex=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//得到棋子x坐標
yindex=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//得到棋子y坐標
board[xindex][yindex]=colorName;//以棋子x坐標y坐標做索引將棋子的顏色添加到board中
if(xindex0||xindexROWS||yindex0||yindexCOLS){//棋子在棋盤外不能下,
return;
}elseif(findchess(xindex,yindex)){//所下位置已有棋子,不能下
return;
}
Chesspo=newChess(xindex,yindex,startColor.black:Color.WHITE);//對棋子對象進行初始化
chessList[chessCount++]=po;//將棋子對象添加到棋子數(shù)組中
repaint();//重畫圖型
if(win(xindex,yindex,start)){//判斷是否勝利
Stringmsg=String.format("恭喜%s贏了",colorName);
JOptionPane.showMessageDialog(this,msg);
//gameOver=true;
GameOver=true;
}elseif(chessCount==(COLS+1)*(ROWS+1)){//判斷是否全部下滿
Stringmsg=String.format("恭喜%s贏了",colorName);
JOptionPane.showMessageDialog(this,msg);
GameOver=true;
}
start=!start;//改變棋子先下棋狀態(tài)
}
函數(shù)paintComponent來對棋盤和棋子進行畫圖,對棋子進行繪圖時,將最后一個棋子設(shè)為紅色;
代碼如下;
protectedvoidpaintComponent(Graphicsg){//畫棋盤和棋子
super.paintComponent(g);
for(inti=0;i=ROWS;i++){//畫橫線
g.drawLine(MARGIN,MARGIN+i*GRID_SPAN,MARGIN+COLS*GRID_SPAN,MARGIN+i*GRID_SPAN);
}
for(intj=0;j=COLS;j++){//畫豎線
g.drawLine(MARGIN+j*GRID_SPAN,MARGIN,MARGIN+j*GRID_SPAN,MARGIN+ROWS*GRID_SPAN);
}
for(inti=0;ichessCount;i++){//畫棋子
intxpos=chessList[i].getX()*GRID_SPAN+MARGIN;//得到棋子x坐標
intypos=chessList[i].getY()*GRID_SPAN+MARGIN;//得到棋子y坐標
g.setColor(chessList[i].getColor());//設(shè)置棋子顏色
g.fillOval(xpos-Chess.DIAMETER/2,ypos-Chess.DIAMETER/2,Chess.DIAMETER,Chess.DIAMETER);//畫棋子
if(i==chessCount-1){
g.setColor(Color.red);//標記最后一個棋子為紅色
g.drawRect(xpos-Chess.DIAMETER/2,ypos-Chess.DIAMETER/2,Chess.DIAMETER,Chess.DIAMETER);
}
}
}
最后就是判斷棋子輸贏的函數(shù),用字符串數(shù)組保存的棋子的顏色來進行判斷所在行和列有沒有五個棋子相連,判斷撇和捺行的棋子有沒有五個相連的,如果有則某位棋子勝利;
代碼如下;
private
booleanwin(intx,inty,booleanstart){//對棋子輸贏的判斷
Stringstr=start"黑棋":"白棋";
//棋子所在行和列是否有五子相連的情況
for(inti=0;ii++){
if((board[x][i].equals(str)board[x][i+1].equals(str)board[x][i+2].equals(str)board[x][i+3].equals(str)board[x][i+4].equals(str))||(board[i][y].equals(str)board[i+1][y].equals(str)board[i+2][y].equals(str)board[i+3][y].equals(str)board[i+4][y].equals(str)))
returntrue;
}
//棋子所在撇行是否有五子相連的情況
if(x+y=4x+y=30){
inti=(x+y=19)x+y:x+y-20;
if(x+y=19){
for(intk=0;k=i-4;k++){
if(board[k][i-k].equals(str)board[k+1][i-k-1].equals(str)board[k+2][i-k-2].equals(str)board[k+3][i-k-3].equals(str)board[k+4][i-k-4].equals(str))
returntrue;
}
}else{
for(intk=i;kk++){
if(board[k][20-k].equals(str)board[k+1][20-k-1].equals(str)board[k+2][20-k-2].equals(str)board[k+3][20-k-3].equals(str)board[k+4][20-k-4].equals(str))
returntrue;
}
}
}
//棋子所在捺行是否有五子相連的情況
if(y-x=15x-y=15){
inti=(xy)y-x:x-y;
if(xy){
for(intk=0;k=19-4-i;k++){
if(board[k][i+k].equals(str)board[k+1][i+k+1].equals(str)board[k+2][i+k+2].equals(str)board[k+3][i+k+3].equals(str)board[k+4][i+k+4].equals(str))
returntrue;
}
}else{
for(intk=i;kk++){
if(board[k][i+k].equals(str)board[k+1][i+k+1].equals(str)board[k+2][i+k+2].equals(str)board[k+3][i+k+3].equals(str)board[k+4][i+k+4].equals(str))
returntrue;
}
}
}
returnfalse;
}
最后我就將完整的棋盤類代碼貼出來,寫五子棋代碼時參考了很多其他人的想法,有相同的請不要見怪;
棋盤類完整代碼如下:
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
*五子棋的棋盤類
publicclassChessBordextendsJPanelimplementsMouseListener{//繼承面板類和鼠標事件接口
publicstaticintMARGIN=30;//定義邊距
publicstaticintROWS=15;//定義行數(shù)
publicstaticintCOLS=15;//定義列數(shù)
publicstaticintGRID_SPAN=35;//網(wǎng)格間距
Chess[]chessList=newChess[(ROWS+1)*(COLS+1)];//定義一個棋子數(shù)組
String[][]board=newString[MARGIN*2+GRID_SPAN*COLS][MARGIN*2+GRID_SPAN*COLS];//聲明一個字符串數(shù)組,用來判斷輸贏
intchessCount;//棋子數(shù)目
intxindex,yindex;//棋子的坐標索引
booleanstart=true;//開始默認黑子先下
booleanGameOver=false;//定義是否游戲結(jié)束
publicChessBord(){//棋盤類構(gòu)造函數(shù)
setBackground(Color.LIGHT_GRAY);//設(shè)置背景顏色
addMouseListener(this);//將棋盤類添加到鼠標事件監(jiān)聽器
addMouseMotionListener(newMouseMotionListener(){//匿名內(nèi)部類
@Override
publicvoidmouseMoved(MouseEvente){//根據(jù)鼠標的移動所在的坐標來設(shè)置鼠標光標形狀
intx1=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//對鼠標光標的x坐標進行轉(zhuǎn)換
inty1=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//對鼠標光標的y坐標進行轉(zhuǎn)換
if(x10||x1ROWS||y10||y1COLS||GameOver||findchess(x1,y1)){
setCursor(newCursor(Cursor.DEFAULT_CURSOR));//設(shè)置鼠標光標為默認形狀
}else{
setCursor(newCursor(Cursor.HAND_CURSOR));//設(shè)置鼠標光標為手型
}
}
@Override
publicvoidmouseDragged(MouseEvente){
}
});
for(inti=0;iMARGIN*2+GRID_SPAN*COLS;i++){//對board[][]賦初值
for(intj=0;jMARGIN*2+GRID_SPAN*COLS;j++){
board[i][j]="0";
}
}
}
@Override
publicvoidmouseClicked(MouseEvente){
//TODOAuto-generatedmethodstub
}
@Override
publicvoidmousePressed(MouseEvente){//鼠標點擊事件
if(GameOver)//游戲結(jié)束,不能按
return;
StringcolorName=start"黑棋":"白棋";//判斷是什么顏色的棋子
xindex=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//得到棋子x坐標
yindex=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//得到棋子y坐標
board[xindex][yindex]=colorName;//以棋子x坐標y坐標做索引將棋子的顏色添加到board中
if(xindex0||xindexROWS||yindex0||yindexCOLS){//棋子在棋盤外不能下,
return;
}elseif(findchess(xindex,yindex)){//所下位置已有棋子,不能下
return;
}
Chesspo=newChess(xindex,yindex,startColor.black:Color.WHITE);//對棋子對象進行初始化
chessList[chessCount++]=po;//將棋子對象添加到棋子數(shù)組中
repaint();//重畫圖型
if(win(xindex,yindex,start)){//判斷是否勝利
Stringmsg=String.format("恭喜%s贏了",colorName);
JOptionPane.showMessageDialog(this,msg);
//gameOver=true;
GameOver=true;
}elseif(chessCount==(COLS+1)*(ROWS+1)){//判斷是否全部下滿
Stringmsg=String.format("恭喜%s贏了",colorName);
JOptionPane.showMessageDialog(this,msg);
GameOver=true;
}
start=!start;//改變棋子先下棋狀態(tài)
}
@Override
publicvoidmouseReleased(MouseEvente){
}
@Override
publicvoidmouseEntered(MouseEvente){
}
@Override
publicvoidmouseExited(MouseEvente){
}
@Override
protectedvoidpaintComponent(Graphicsg){//畫棋盤和棋子
super.paintComponent(g);
for(inti=0;i=ROWS;i++){//畫橫線
g.drawLine(MARGIN,MARGIN+i*GRID_SPAN,MARGIN+COLS*GRID_SPAN,MARGIN+i*GRID_SPAN);
}
for(intj=0;j=COLS;j++){//畫豎線
g.drawLine(MARGIN+j*GRID_SPAN,MARGIN,MARGIN+j*GRID_SPAN,MARGIN+ROWS*GRID_SPAN);
}
for(inti=0;ichessCount;i++){//畫棋子
intxpos=chessList[i].getX()*GRID_SPAN+MARGIN;//得到棋子x坐標
intypos=chessList[i].getY()*GRID_SPAN+MARGIN;//得到棋子y坐標
g.setColor(chessList[i].getColor());//設(shè)置棋子顏色
g.fillOval(xpos-Chess.DIAMETER/2,ypos-Chess.DIAMETER/2,Chess.DIAMETER,Chess.DIAMETER);//畫棋子
if(i==chessCount-1){
g.setColor(Color.red);//標記最后一個棋子為紅色
g.drawRect(xpos-Chess.DIAMETER/2,ypos-Chess.DIAMETER/2,Chess.DIAMETER,Chess.DIAMETER);
}
}
}
private
booleanfindchess(intindex,intyindex){//查找所在位置是否有棋子
for(Chessc:chessList){
if(c!=nullc.getX()==xindexc.getY()==yindex)
returntrue;
}
returnfalse;
}
private
booleanwin(intx,inty,booleanstart){//對棋子輸贏的判斷
Stringstr=start"黑棋":"白棋";
//棋子所在行和列是否有五子相連的情況
for(inti=0;ii++){
if((board[x][i].equals(str)board[x][i+1].equals(str)board[x][i+2].equals(str)board[x][i+3].equals(str)board[x][i+4].equals(str))||(board[i][y].equals(str)board[i+1][y].equals(str)board[i+2][y].equals(str)board[i+3][y].equals(str)board[i+4][y].equals(str)))
returntrue;
}
//棋子所在撇行是否有五子相連的情況
if(x+y=4x+y=30){
inti=(x+y=19)x+y:x+y-20;
if(x+y=19){
for(intk=0;k=i-4;k++){
if(board[k][i-k].equals(str)board[k+1][i-k-1].equals(str)board[k+2][i-k-2].equals(str)board[k+3][i-k-3].equals(str)board[k+4][i-k-4].equals(str))
returntrue;
}
}else{
for(intk=i;kk++){
if(board[k][20-k].equals(str)board[k+1][20-k-1].equals(str)board[k+2][20-k-2].equals(str)board[k+3][20-k-3].equals(str)board[k+4][20-k-4].equals(str))
returntrue;
}
}
}
//棋子所在
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年云南省農(nóng)業(yè)科學院農(nóng)產(chǎn)品加工研究所科研助理(第七批)招聘備考題庫完整參考答案詳解
- 2025-2030建筑建材玻璃纖維行業(yè)市場供需分析及投資評估規(guī)劃分析研究報告
- 2025年陽江市婦幼保健院急需人才招聘備考題庫帶答案詳解
- 2026年臨潁縣事業(yè)單位人才引進備考題庫及1套完整答案詳解
- 2026年凌源市礦泉之花開發(fā)有限公司派遣人員招聘備考題庫及答案詳解1套
- 2026年中國檢驗認證集團廣東有限公司湛江分公司招聘備考題庫參考答案詳解
- 2026年行政工作年終總結(jié)范文(2篇)
- 2026年山西大專任教師招聘116人備考題庫及一套答案詳解
- 2026年中山市三角鎮(zhèn)水務事務中心公開招聘水閘、泵站管理人員備考題庫及答案詳解參考
- 2026年中國機械總院集團哈爾濱焊接研究所有限公司招聘備考題庫及答案詳解一套
- 2022年中國工藝美術(shù)館招聘考試真題
- 輔導員工作的職責與使命課件
- 防造假管理程序文件
- ktv股東合作協(xié)議書
- 2023年北京海淀區(qū)高三一?;瘜W試題及答案
- 腫瘤內(nèi)科靜脈給予抗腫瘤藥物評價標準
- 醫(yī)療器械生產(chǎn)質(zhì)量管理規(guī)范無菌醫(yī)療器械實施細則和檢查評定標準
- 吊籃租賃安拆分包合同
- GB/T 20728-2006封閉管道中流體流量的測量科里奧利流量計的選型、安裝和使用指南
- FZ/T 54033-2010錦綸6高取向絲(HOY)
- 六年級英語上冊-Unit-5-What-does-he-do單元整體分析-人教PEP
評論
0/150
提交評論