结对项目—五子棋
| ? |
?五子棋Github托管地址:
?https://github.com/sunyuanyuan/test/blob/master/Game
分工:
負(fù)責(zé)寫代碼:趙存存
負(fù)責(zé)調(diào)試程序:孫媛媛
一、實(shí)踐目的
1.掌握J(rèn)ava常用基礎(chǔ)類API。
2.掌握輸入輸出流常用類API。
3.掌握J(rèn)ava異常處理。
二、實(shí)踐要求
利用Java常用基礎(chǔ)類API、輸入輸出流常用類API、Java異常處理等完成所選項(xiàng)目的程序設(shè)計(jì)。
三、項(xiàng)目需求
所選項(xiàng)目名稱:五子棋游戲
現(xiàn)在各大軟件公司都有自己的、各種的程序,但是這些公司都有自己的版權(quán),我們也不可能得到這些源代碼!而且這些公司的程序也相當(dāng)復(fù)雜,僅從日常應(yīng)用方面來(lái)說(shuō),對(duì)于初學(xué)java的我們也無(wú)法理解,就需要我們開發(fā)一個(gè)簡(jiǎn)單易懂的五子棋游戲程序。
四、核心算法詳細(xì)設(shè)計(jì)?????
本程序?qū)崿F(xiàn)的是一單機(jī)雙人對(duì)戰(zhàn)五子棋游戲
本程序由五個(gè)java源程序文件組成,Game.java、GameFrame.java、GamePanel.java、 ChessMan.java、Player.java
Game.java
import javax.swing.*;
public class Game {
public static void main(String[] args) {
GameFrame GFrame=new GameFrame();
GFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GFrame.setVisible(true);
}
}
GameFrame.java
import java.awt.*;
import javax.swing.*;
class GameFrame extends JFrame {
private static final int Width=570;
private static final int Height=470;
GameFrame(){
setTitle("五子棋游戲");
CenteredFrame();
setSize(Width,Height);?
GamePanel Gpanel=new GamePanel();
add(Gpanel);?
}
void CenteredFrame(){
Toolkit kit=Toolkit.getDefaultToolkit();
Dimension screenSize=kit.getScreenSize();
int screenHeight=screenSize.height;
int screenWidth=screenSize.width;
int Xposition=(screenWidth-Width)/2;
int Yposition=(screenHeight-Height)/2;
setLocation(Xposition,Yposition);
}
}
GamePanel.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
?
class GamePanel extends JPanel {
private Point cursor=new Point(40,60);?//棋盤坐標(biāo)
private int[][] ChessState=new int[18][18];//棋盤狀態(tài)?
private int i=0;//橫坐標(biāo)
private int j=0;//縱坐標(biāo)
private final static int testnum=5;//五子棋的規(guī)定棋子數(shù)
private Player Black=new Player(1,Color.BLACK,"黑方");//黑方棋子
private Player White=new Player(2,Color.WHITE,"白方");//白方棋子
private Player Cplayer=null;//當(dāng)前用戶的引用
private JTextField textBlack=new JTextField("",5);//黑方文本提示框?qū)ο蠛臀谋鹃L(zhǎng)度設(shè)置
private JTextField textWhite=new JTextField("",5);//白方文本提示框?qū)ο蠛臀谋鹃L(zhǎng)度設(shè)置
private String Nothing="";
private String textblack="請(qǐng)黑方下子";//黑方提示文本
private String textwhite="請(qǐng)白方下子";//白方提示文本
GamePanel(){
setLayout(null);
Initialization();
setFocusable(true);
JButton Rutton=new JButton("重新開局");
Rutton.setBounds(20,14,100,26);
RestartListener restart=new RestartListener();
Rutton.addActionListener(restart);
add(Rutton);
textBlack.setHorizontalAlignment(JTextField.CENTER);
textBlack.setBounds(150,14,110,26);
textBlack.setEditable(false);
add(textBlack);
textWhite.setHorizontalAlignment(JTextField.CENTER);+ textWhite.setBounds(290,14,110,26);
textWhite.setEditable(false);
add(textWhite);
JTextArea gInstruction=new JTextArea();
gInstruction.setSelectedTextColor(new Color(238,238,238));
String gSInstruction=
"Play1(黑方) Key \nup--------W \ndown----S \nleft--------A \nright------F \n\n"+
"Play2(白方) Key \nup--------up \ndown----down \nleft--------left \nright------right \n\n"+
"Exit game: \nPress Esc";
gInstruction.setText(gSInstruction);
gInstruction.setEditable(false);
gInstruction.setBounds(440,60,100,340);
add(gInstruction);
ChessManPerformListener Perform=new ChessManPerformListener();
addKeyListener(Perform);
}
// 設(shè)置第一個(gè)JTextField輸出"請(qǐng)黑方下棋",坐標(biāo)為(40,60)
void Initialization(){?
for(int i=0,j;i<18;i++)
for(j=0;j<18;j++){
ChessState[i][j]=0;?
}
cursor.setLocation(40,60);
Cplayer=Black;
textBlack.setText(textblack);
textWhite.setText(Nothing);
}
//畫棋盤和初始化棋局狀態(tài)
protected void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2=(Graphics2D) g;
for(int i=60;i<=400;i+=20){
g2.drawLine(40,i,380,i);
}
for(int j=40;j<=380;j+=20){
g2.drawLine(j,60,j,400);
}
g2.drawString("_",cursor.x-6,cursor.y);
g2.drawString("_",cursor.x,cursor.y);
for(i=0;i<18;i++)
for(j=0;j<18;j++){
if(ChessState[i][j]!=0){
if(ChessState[i][j]==1){
g2.setPaint(Black.getplayerChessManColor());?
}
if(ChessState[i][j]==2){
g2.setPaint(White.getplayerChessManColor());
}
g2.fillOval(j*20+40-10, i*20+60-10, ChessMan.getChessManSize(), ChessMan.getChessManSize());
}
}
}
//判斷棋盤的當(dāng)前位置是否已有棋子
boolean isChessState(){?
this.j=(cursor.x-40)/20;
this.i=(cursor.y-60)/20;
if(ChessState[this.i][this.j]!=0)
return true;
else
return false;?
}
//記錄落子后棋盤的當(dāng)前位置的狀態(tài)
void RecordChessState(){
this.j=(cursor.x-40)/20;
this.i=(cursor.y-60)/20;
ChessState[this.i][this.j]=Cplayer.getCurrentIdentify();
}
//判斷當(dāng)前玩家落子后是否贏了
void JudgeWin(){
for(int i=0;i<4;i++)
if(JudgeWinLine(i)){
//提示當(dāng)前玩家已經(jīng)獲得勝利
try{
String Ginformation="GameInformation";
String Message="恭喜玩家"+Cplayer.getsIdentify()+"獲勝!"+"\n"+"繼續(xù)游戲還是退出游戲?";
String[] options = {"繼續(xù)","退出"};
int selection=JOptionPane.showOptionDialog(null,Message,Ginformation,
JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE ,null,options,options[0]);//throws HeadlessException
if(selection==JOptionPane.OK_OPTION){?
Initialization();
repaint();
return;
}
if(selection==JOptionPane.NO_OPTION){
System.exit(0);//退出程序
}
}catch(HeadlessException e){
e.printStackTrace();
}
}
//如果當(dāng)前方?jīng)]有贏棋則雙方輪換
ChangeCurrentPlayer();
}
//在當(dāng)前方向上是否有連續(xù)的五只棋子
boolean JudgeWinLine(int direction){
int i,j,di,dj,count;
i=j=di=dj=count=0;
switch(direction){
case 0:
j=this.j-(testnum-1);
i=this.i;
dj=1;
di=0;
break;
case 1:
j=this.j;
i=this.i-(testnum-1);
dj=0;
di=1;
break;
case 2:
j=this.j-(testnum-1);
i=this.i+(testnum-1);
dj=1;
di=-1;
break;
case 3:
j=this.j-(testnum-1);
i=this.i-(testnum-1);
dj=1;
di=1;
break;
}
for(int k=0;k<testnum*2+1;k++){
if(j>=0&&j<18&&i>=0&&i<18){
if(ChessState[i][j]==Cplayer.getCurrentIdentify()){
count++;
if(count>=testnum)
return true;
}
else
count=0;
}
j+=dj;
i+=di;
}?
return false;
}
//更換當(dāng)前玩家
void ChangeCurrentPlayer(){
if(Cplayer==Black){
Cplayer=White;
textBlack.setText(Nothing);
textWhite.setText(textwhite);
}
else{
Cplayer=Black;
textBlack.setText(textblack);
textWhite.setText(Nothing);
}
}
//重新開局監(jiān)聽器
private class RestartListener implements ActionListener{
public void actionPerformed(ActionEvent arg0) {
Initialization();
repaint();
requestFocus();
}?
}
//棋盤、棋局狀態(tài)監(jiān)聽器
private class ChessManPerformListener implements KeyListener{
//玩家2的按鍵
public void keyPressed(KeyEvent event) {
int keyCode=event.getKeyCode();
if(keyCode==KeyEvent.VK_ESCAPE)
System.exit(0);
if(Cplayer.getCurrentIdentify()==2){//判別當(dāng)前玩家
if(keyCode==KeyEvent.VK_LEFT){
if(cursor.x>40)
cursor.x-=20;
}
else if(keyCode==KeyEvent.VK_RIGHT){
if(cursor.x<380)
cursor.x+=20;
}
else if(keyCode==KeyEvent.VK_UP){
if(cursor.y>60)
cursor.y-=20;
}
else if(keyCode==KeyEvent.VK_DOWN){
if(cursor.y<400)
cursor.y+=20;
}
else if(keyCode==KeyEvent.VK_ENTER){
if(!isChessState()){
Cplayer.PerformChessMan();
RecordChessState();
repaint();
JudgeWin();//判定當(dāng)前落子后是否贏棋
}
}?
repaint();?
}
}
public void keyReleased(KeyEvent event) {}
//玩家1的按鍵
public void keyTyped(KeyEvent event) {
char keyChar=event.getKeyChar();
if(Cplayer.getCurrentIdentify()==1){//判別當(dāng)前玩家
if(keyChar=='a'){
if(cursor.x>40)//對(duì)移動(dòng)光標(biāo)超界現(xiàn)象做判別
cursor.x-=20;
}
else if(keyChar=='d'){
if(cursor.x<380)?
cursor.x+=20;
}
else if(keyChar=='w'){
if(cursor.y>60)
cursor.y-=20;
}
else if(keyChar=='s'){
if(cursor.y<400)
cursor.y+=20;
}?
else if(keyChar==' '){
if(!isChessState()){ //落子前先判斷當(dāng)前位置上是否已有棋子
Cplayer.PerformChessMan();//落子?
RecordChessState();//記錄當(dāng)前落子后棋盤狀態(tài)
repaint();
JudgeWin();//判定當(dāng)前落子后是否贏棋
}?
}
}
repaint();?
}
}
}
ChessMan.java
import java.awt.Color;
class ChessMan {
private static final int ChessManSize=20;
private Color ChessManColor;
ChessMan(Color c){
ChessManColor=c;
}
static int getChessManSize(){
return ChessManSize;
}
Color getChessManColor(){
return ChessManColor;
}
}
Player.java?
import java.awt.Color;
class Player {
private int identify;
private ChessMan pChessMan;
private String PlayerStringIdentify;
Player(int identify,Color c,String sIdentify){
this.identify=identify;
pChessMan=new ChessMan(c);
this.PlayerStringIdentify=sIdentify;
}
int getCurrentIdentify(){
return identify;
}
String getsIdentify(){
return PlayerStringIdentify;
}
void PerformChessMan(){}
Color getplayerChessManColor(){
return pChessMan.getChessManColor();
}
}
五、程序運(yùn)行結(jié)果
六 、心得體會(huì)
過(guò)這次的結(jié)對(duì)實(shí)驗(yàn),我從書本上學(xué)習(xí)到的理論知識(shí)用到了實(shí)踐上,從而進(jìn)一步鞏固和豐富了我所學(xué)過(guò)的知識(shí),讓我更深層次地認(rèn)識(shí)到Java及其強(qiáng)大的功能。同時(shí),做這門課程設(shè)計(jì)也進(jìn)一步加強(qiáng)了我的動(dòng)手能力與合作能力。
趙存存代碼寫的很清楚,我們交流的非常愉快。
附上一張我們一起做代碼的照片
?
轉(zhuǎn)載于:https://www.cnblogs.com/sunyuanyuan/p/4509841.html
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
- 上一篇: [label][JavaScript]七
- 下一篇: iOS block 用法