%@ page contentType="text/html;charset=utf-8"%
做網(wǎng)站、成都做網(wǎng)站的關(guān)注點(diǎn)不是能為您做些什么網(wǎng)站,而是怎么做網(wǎng)站,有沒有做好網(wǎng)站,給創(chuàng)新互聯(lián)一個(gè)展示的機(jī)會(huì)來(lái)證明自己,這并不會(huì)花費(fèi)您太多時(shí)間,或許會(huì)給您帶來(lái)新的靈感和驚喜。面向用戶友好,注重用戶體驗(yàn),一切以用戶為中心。
html
head
title五子棋/title
meta http-equiv="Content-Type" content="text/html; charset=utf-8"
style type="text/css"
body{ word-break:break-word;
}
#aboutstep{
position:absolute;
right:45px;
top:300px;
width:200px;
vertical-align:bottom;
}
/style
script language="javascript"
//五子棋棋子亦稱“棋石”分黑、白兩色,形狀為扁圓形,有一面凸起或兩面凸起等形狀,厚度不超過0.8厘米,直徑為2.0~2.3厘米;
//一副棋子總數(shù)為225枚,其中黑子113枚,白子112枚。
var presentperson=false; //true表示人先下,否則表示機(jī)器先下
//誰(shuí)先只需要改為true或false就可以了,不需要改其它東西
var maxsize=15;
var personstep=0;
var machinestep=0;
var _stack=new Array();//needn't to allocate space
var chese=new Array(maxsize*maxsize);
var chesevalue=new Array(maxsize*maxsize);
for(var i=0;imaxsize*maxsize;i++)//初始化棋盤
{ chese[i]=0;
}
/script
/head
body onload="startup()"
table id="chesetable" border="1px" width="auto" align="center" height="600px" style="background-color:#EED090;text-align:center;"
%
for(int i=0;i15;i++)
{out.print("tr");
for(int j=0;j15;j++)
{out.print("td onclick='putone(this,"+i+","+j+")' style='width:45px;height:45px;cursor:pointer;'??/td");
}
out.print("/tr");
}
%
/table
div id="aboutstep"!-- 加計(jì)時(shí)器會(huì)降低速度,這里就不加了 --
人?img src="images/white_.gif" alt="white" width="50px" height="50px" style="vertical-align:middle;"/span id="aboutsteppeople" style="position:inline;"0/span
span style="display:inline;"input type="text" id="peopleusedtime" size=4 maxlength="8" //span
br /
機(jī)器?img src="images/black_.gif" alt="black" width="50px" height="50px" style="vertical-align:middle;"s/span id="aboutstepmachine" style="position:inline;"0/span
span style="display:inline;"input type="text" id="machineusedtime" size=4 maxlength="8" //span
/div
div align="center"
input type="button" name="restart" value="重新開始" onclick="reload()"/input type="button" name="turnout" value="交換順序" /
input type="button" name="undo" value="悔棋" onclick="popstack()"/
/div
script language="JavaScript"
function startup()
{
if(!presentperson)//機(jī)器先下
{ var obj=document.getElementById("chesetable").rows[7].cells[7];
putone(obj,7,7);
}
}
function putone(obj,i,j)
{ //if(obj.firstChild.nodeValue=="◎"||obj.firstChild.nodeValue=="●")
if(obj.firstChild.nodeType==1) //表示放了棋子
{ return false;}
var node=null;
if(presentperson)
{ //node=document.createTextNode("◎"); //人的棋子顏色
if(document.uniqueID) //IE
node=document.createElement("img src='images/white_.gif' alt='white' width='40px' height='40px' /");
else { //for Firefox,Opera
node=document.createElement("img");
node.setAttribute("src","images/white_.gif");
node.setAttribute("alt","white");
node.setAttribute("width","40px");
node.setAttribute("height","40px");
}
presentperson=!presentperson;
chese[maxsize*i+j]=1;
personstep++;
document.getElementById("aboutsteppeople").innerHTML=personstep;
}
else {//node=document.createTextNode("●"); //機(jī)器的棋子顏色
if(document.uniqueID) //IE
node=document.createElement("img src='images/black_.gif' alt='black' width='40px' height='40px' /");
else { node=document.createElement("img");
node.setAttribute("src","images/black_.gif");
node.setAttribute("alt","black");
node.setAttribute("width","40px");
node.setAttribute("height","40px");
}presentperson=!presentperson;
chese[maxsize*i+j]=2;
machinestep++;
document.getElementById("aboutstepmachine").innerHTML=machinestep;
}
obj.replaceChild(node,obj.firstChild);
_stack.push(i);
_stack.push(j); //避免數(shù)據(jù)冗余,就不存儲(chǔ)presentperson
var result=checkfinish(!presentperson,i,j);
if(result)
{ if(!presentperson) alert("Congratulation!You win.");
else alert("I am sorry that the machine wins,try your best to win next time.");
setTimeout(reload,4000); //刷新頁(yè)面
}
if(!presentperson) {machinedecideposition();} //機(jī)器走。如果選擇全部由人走就去掉這個(gè)
}
function checkfinish(presentperson,i,j)
{ //persentperson為true時(shí)表示剛才人下了一步
var checkword;
var result=false; //nobody wins
if(presentperson) checkword=1;
else checkword=2;
var total=1;
var tempj=j+1;
while(tempjmaxsize) //橫
{ if(chese[maxsize*i+tempj]==checkword)
{total++; tempj++;}
else break;
}
tempj=j-1;
while(tempj=0)
{ if(chese[maxsize*i+tempj]==checkword)
{total++; tempj--;}
else break;
}
if(total4) { return true;}
total=1;
var tempi=i+1; //豎
while(tempimaxsize)
{ if(chese[maxsize*tempi+j]==checkword)
{total++; tempi++;}
else break;
}
tempi=i-1;
while(tempi=0)
{ if(chese[maxsize*tempi+j]==checkword)
{total++; tempi--;}
else break;
}
if(total4) { return true;}
total=1;
tempi=i+1; //一三象限斜
tempj=j+1;
while(tempimaxsizetempjmaxsize)
{ if(chese[maxsize*tempi+tempj]==checkword)
{total++; tempi++; tempj++;}
else break;
}
tempi=i-1;
tempj=j-1;
while(tempi=0tempj=0)
{ if(chese[maxsize*tempi+tempj]==checkword)
{total++; tempi--; tempj--;}
else break;
}
if(total4) { return true;}
total=1;
tempi=i+1; //二四象限斜
tempj=j-1;
while(tempimaxsizetempj=0)
{ if(chese[maxsize*tempi+tempj]==checkword)
{total++; tempi++; tempj--;}
else break;
}
tempi=i-1;
tempj=j+1;
while(tempi=0tempjmaxsize)
{ if(chese[maxsize*tempi+tempj]==checkword)
{total++; tempi--; tempj++;}
else break;
}
if(total4) { return true;}
return false;
}
function pushstack()
{
}
function popstack() //悔棋
{
if(_stack.length/21) return;
//var ispresentperson=(_stack.length/2)%2?true:false;//這個(gè)跟誰(shuí)先下有關(guān)
var ispresentperson=presentperson; //now it has not matter with the length of _stack
var j=_stack.pop();
var i=_stack.pop();
removeone(ispresentperson,i,j);
}
function removeone(ispresentperson,i,j)
{ var obj=document.getElementById("chesetable");
//text,tbody
var tbody=obj.firstChild.nextSibling;
tbody.rows[i].cells[j].innerHTML="?";
chese[maxsize*i+j]=0; //也要初始化那個(gè)棋子所在的位置
presentperson=!presentperson;//也要回滾該誰(shuí)走,who's turn now?
if(!ispresentperson) {personstep--;
document.getElementById("aboutsteppeople").innerHTML=personstep;
}
else {machinestep--;
document.getElementById("aboutstepmachine").innerHTML=machinestep;
}
}
function machinedecideposition() //機(jī)器決定下一步的位置
{ //在第一層節(jié)點(diǎn)選擇的時(shí)候采用貪婪算法,直接找出相對(duì)分?jǐn)?shù)比較高的幾個(gè)形成第一層節(jié)點(diǎn),目的是為了提高搜索速度和防止堆棧溢出。
if(machinestep==0) //機(jī)器走第一步
{ var obj=document.getElementById("chesetable").rows[7].cells[7];
if(putone(obj,7,7)==false)
{ obj=document.getElementById("chesetable").rows[6].cells[6];
putone(obj,6,6);
}
}
else if(machinestep==1) //機(jī)器走第二步
{ var obj=document.getElementById("chesetable").rows[7].cells[7];
if(putone(obj,7,7)==false) //7,7位置被占用
{ obj=document.getElementById("chesetable").rows[6].cells[6];
if(putone(obj,6,6)==false)//6,6位置被占用
{obj=document.getElementById("chesetable").rows[6].cells[7];
putone(obj,6,7);
}
}
}
else { var checkword=2; //先判斷機(jī)器的,在設(shè)置為1判斷這個(gè)位置對(duì)人的貢獻(xiàn)
for(var tttt=0;ttttmaxsize*maxsize;tttt++)
chesevalue[tttt]=-10;//初始化
for(var i=0;imaxsize;i++)
for(var j=0;jmaxsize;j++)
{ if(chese[maxsize*i+j]!=0) //the position is occupied
continue;
var total=1;
var tempj=j+1;
var spacenumber=0; //中間空多少個(gè)
var befive=0; //成5,包括五連和長(zhǎng)連
var livefour=0; //活四,有兩個(gè)點(diǎn)可以成5地四
var befour=0; //沖四,只有一個(gè)點(diǎn)可以成為5的四
var deadfour=0; //死四,不能成為5的四
var livethree=0; //活三,再走一步就可以成為活四的三
//活三包括 連活三和跳活三
var bethree=0;
var livetwo=0;
var betwo=0;
//三三,一子落下同時(shí)形成兩個(gè)活三
//四四,一子落下同時(shí)形成兩個(gè)沖四
//四三,一子落下同時(shí)形成一個(gè)沖四和 活三
for(var tt=0;;tt++)
{ if(tt==0)
checkword=2; //machine
else checkword=1; //people
while(tempjmaxsize) //橫
{ if(chese[maxsize*i+tempj]==checkwordcheckword==2) //是機(jī)器的
{total++; tempj++;}
else if(chese[maxsize*i+tempj]==0checkword==2) //對(duì)于防守不考慮空格
{ //is empty
spacenumber++; break;
if((++tempj)maxsizechese[maxsize*i+tempj]==checkwordspacenumber2)
total++;
else break;
}
else if(chese[maxsize*i+tempj]==checkwordcheckword==1) //防守
{ total++; tempj++;
}
else break;
}
var endj=tempj;
tempj=j-1;
while(tempj=0)
{ if(chese[maxsize*i+tempj]==checkwordcheckword==2)
{total++; tempj--;}
else if(chese[maxsize*i+tempj]==0checkword==2)
{ //is empty
spacenumber++; break;
if((--tempj)=0chese[maxsize*i+tempj]==checkwordspacenumber2)
total++;
else break;
}
else if(chese[maxsize*i+tempj]==checkwordcheckword==1) //防守
{ total++; tempj--;
}
else break;
}
var startj=tempj;
//由于checkword==2先運(yùn)行,所以可以直接用befive=1,也可以用befive++;
if(total4) { //能組成五個(gè)或以上的
if(checkword==2)
{befive+=2
} //堵住成五
else befive++;
}//進(jìn)攻要大于防守
else if(total==4) { //能組成四個(gè)
if(checkword==2) //表示考慮進(jìn)攻
{ if(startj=0endjmaxsizechese[maxsize*i+startj]!=1chese[maxsize*i+endj]!=1) //兩邊為空格
livefour+=2; //放在這里可以形成一個(gè)活四
else if((startj=0chese[maxsize*i+startj]!=1)||(endjmaxsizechese[maxsize*i+endj]!=1))
befour+=2; //形成一個(gè)沖四
else deadfour+=2;
}
else //考慮防守
{ if(startj=0endjmaxsizechese[maxsize*i+startj]!=2chese[maxsize*i+endj]!=2)
livefour+=1; //放在這里可以形成一個(gè)活四
else if((startj=0chese[maxsize*i+startj]!=2)||(endjmaxsizechese[maxsize*i+endj]!=2))
befour+=1; //形成一個(gè)沖四
else deadfour+=1;
}
}
else if(total==3){if(checkword==2) //表示考慮進(jìn)攻
{ if(startj=0endjmaxsizechese[maxsize*i+startj]!=1chese[maxsize*i+endj]!=1) //兩邊為空格
livethree+=2; //放在這里可以形成一個(gè)活三(算做連活三)
else if((startj=0chese[maxsize*i+startj]!=1)||(endjmaxsizechese[maxsize*i+endj]!=1))
bethree+=2; //形成一個(gè)眠三,即可以沖四的三
// else deadfour+=2;
//跳三
}
else //考慮防守
{ if(startj=0endjmaxsizechese[maxsize*i+startj]!=2chese[maxsize*i+endj]!=2) //兩邊為空格
livethree+=1; //放在這里可以形成一個(gè)活三(算做連活三)
else if((startj=0chese[maxsize*i+startj]!=2)||(endjmaxsizechese[maxsize*i+endj]!=2))
bethree+=1; //形成一個(gè)眠三,即可以沖四的三
}
}
else if(total==2){ if(checkword==2) //表示考慮進(jìn)攻
{ if(startj=0endjmaxsizechese[maxsize*i+startj]!=1chese[maxsize*i+endj]!=1) //兩邊為空格
livetwo++; //放在這里可以形成一個(gè)活三(算做連活三)
}
else //考慮防守
{ if(startj=0endjmaxsizechese[maxsize*i+startj]!=2chese[maxsize*i+endj]!=2) //兩邊為空格
livetwo++; //放在這里可以形成一個(gè)活三(算做連活三)
}
}
以下是現(xiàn)寫的 實(shí)現(xiàn)了兩人對(duì)戰(zhàn) 自己復(fù)制后運(yùn)行把 沒什么難度 類名 Games
import java.util.Scanner;
public class Games {
private String board[][];
private static int SIZE = 17;
private static String roles = "A玩家";
//初始化數(shù)組
public void initBoard() {
board = new String[SIZE][SIZE];
for (int i = 0; i SIZE; i++) {
for (int j = 0; j SIZE; j++) {
// if(i==0){
// String str = "";
// str += j+" ";
// board[i][j]= str;
// }else if(i!=0j==0){
// String str = "";
// str += i+" ";
// board[i][j]= str;
// }else{
board[i][j] = "╋";
// }
}
}
}
//輸出棋盤
public void printBoard() {
for (int i = 0; i SIZE; i++) {
for (int j = 0; j SIZE; j++) {
System.out.print(board[i][j]);
}
System.out.println();
}
}
//判斷所下棋子位置是否合理
public boolean isOk(int x, int y) {
boolean isRight = true;
if (x = 16 || x 1 || y = 16 | y 1) {
//System.out.println("輸入錯(cuò)誤,請(qǐng)從新輸入");
isRight = false;
}
if (board[x][y].equals("●") || board[x][y].equals("○")) {
isRight = false;
}
return isRight;
}
//判斷誰(shuí)贏了
public void whoWin(Games wz) {
// 從數(shù)組挨個(gè)查找找到某個(gè)類型的棋子就從該棋子位置向右,向下,斜向右下 各查找5連續(xù)的位置看是否為5個(gè)相同的
int xlabel;// 記錄第一次找到某個(gè)棋子的x坐標(biāo)
int ylabel;// 記錄第一次找到某個(gè)棋子的y坐標(biāo)
// ●○╋
// 判斷人是否贏了
for (int i = 0; i SIZE; i++) {
for (int j = 0; j SIZE; j++) {
if (board[i][j].equals("○")) {
xlabel = i;
ylabel = j;
// 橫向找 x坐標(biāo)不變 y坐標(biāo)以此加1連成字符串
String heng = "";
if (i + 5 SIZE j + 5 SIZE) {
for (int k = j; k j + 5; k++) {
heng += board[i][k];
}
if (heng.equals("○○○○○")) {
System.out.println(roles+"贏了!您輸了!");
System.exit(0);
}
// 向下判斷y不變 x逐增5 連成字符串
String xia = "";
for (int l = j; l i + 5; l++) {
xia += board[l][j];
// System.out.println(xia);
}
if (xia.equals("○○○○○")) {
System.out.println(roles+"贏了!您輸了!");
System.exit(0);
}
// 斜向右下判斷
String youxia = "";
for (int a = 1; a = 5; a++) {
youxia += board[xlabel++][ylabel++];
}
if (youxia.equals("○○○○○")) {
System.out.println(roles+"贏了!您輸了!");
System.exit(0);
}
}
}
}
}
// 判斷電腦是否贏了
for (int i = 0; i SIZE; i++) {
for (int j = 0; j SIZE; j++) {
if (board[i][j].equals("●")) {
xlabel = i;
ylabel = j;
// 橫向找 x坐標(biāo)不變 y坐標(biāo)以此加1連成字符串
String heng = "";
if (j + 5 SIZE i + 5 SIZE) {
for (int k = j; k j + 5; k++) {
heng += board[i][k];
}
if (heng.equals("●●●●●")) {
System.out.println(roles+"贏輸了!您輸了!");
System.exit(0);
}
// 向下判斷y不變 x逐增5 連成字符串
String xia = "";
for (int l = i; l i + 5; l++) {
xia += board[l][ylabel];
// System.out.println(xia);
}
if (xia.equals("●●●●●")) {
System.out.println(roles+"贏了!您輸了!");
System.exit(0);
}
// 斜向右下判斷
String youxia = "";
for (int a = 1; a = 5; a++) {
youxia += board[xlabel++][ylabel++];
}
if (youxia.equals("●●●●●")) {
System.out.println(roles+"贏了!您輸了!");
System.exit(0);
}
}
}
}
}
}
public static void main(String[] args) {
Games wz = new Games();
Scanner sc = new Scanner(System.in);
wz.initBoard();
wz.printBoard();
while (true) {
System.out.print("請(qǐng)"+roles+"輸入X,Y坐標(biāo),必須在0-15范圍內(nèi),xy以空格隔開,輸入16 16結(jié)束程序");
int x = sc.nextInt();
int y = sc.nextInt();
if (x == SIZE y == SIZE) {
System.out.println("程序結(jié)束");
System.exit(0);
}
if (x SIZE || x 0 || y SIZE | y 0) {
System.out.println("輸入錯(cuò)誤,請(qǐng)從新輸入");
continue;
}
//如果roles是A玩家 就讓A玩家下棋,否則就讓B玩家下棋。
if (wz.board[x][y].equals("╋")roles.equals("A玩家")) {
wz.board[x][y] = "○";
wz.printBoard();
//判斷輸贏
wz.whoWin(wz);
}else if(wz.board[x][y].equals("╋")roles.equals("B玩家")){
wz.board[x][y] = "●";
wz.printBoard();
//判斷輸贏
wz.whoWin(wz);
} else {
System.out.println("此處已經(jīng)有棋子,從新輸入");
continue;
}
if(roles.equals("A玩家")){
roles = "B玩家";
}else if(roles.equals("B玩家")){
roles = "A玩家";
}
}
}
}
計(jì)算機(jī)畢業(yè)設(shè)計(jì)論文 要比較全的java游戲五子棋可以到七七計(jì)算機(jī)論文的題目列表搜尋一下,應(yīng)該有的
樓主要是覺得看的不舒服可以拷到記事本里看~ import java.applet.*; import java.awt.*; import java.awt.event.*; import java.applet.Applet; import java.awt.Color; //這一段import就不說了,下面要用到的就import進(jìn)來(lái) public class wuziqi extends Applet implements ActionListener,MouseListener,MouseMotionListener,ItemListener //繼承Applet表明是個(gè)applet,后面的接口必須要實(shí)現(xiàn)每個(gè)接口的所有方法 { int color_Qizi=0;//旗子的顏色標(biāo)識(shí) 0:白子 1:黑子 int intGame_Start=0;//游戲開始標(biāo)志 0未開始 1游戲中 int intGame_Body[][]=new int[16][16]; //設(shè)置棋盤棋子狀態(tài) 0 無(wú)子 1 白子 2 黑子 Button b1=new Button("游戲開始"); Button b2=new Button("重置游戲"); //兩個(gè)按鈕 Label lblWin=new Label(" "); //這個(gè)label用來(lái)顯示最后輸贏信息的,先留空 Checkbox ckbHB[]=new Checkbox[2]; //用來(lái)表明選擇黑氣或白棋先走的checkbox CheckboxGroup ckgHB=new CheckboxGroup(); //兩個(gè)checkbox必須放在同一個(gè)checkboxgroup里才能做到單選 public void init() //初始化,堆砌界面 { setLayout(null); //不設(shè)布局管理器 addMouseListener(this); //將本類作為鼠標(biāo)事件的接口響應(yīng)鼠標(biāo)動(dòng)作 add(b1); //將事先定義好的第一個(gè)按鈕添加入界面 b1.setBounds(330,50,80,30); //設(shè)置第一個(gè)按鈕左上角的位置和大小 b1.addActionListener(this); //將本類作為按鈕事件的接口響應(yīng)按鈕動(dòng)作 add(b2); //將事先定義好的第二個(gè)按鈕添加進(jìn)去 b2.setBounds(330,90,80,30); /設(shè)置第二個(gè)按鈕左上角的位置和大小 b2.addActionListener(this); //將本類作為按鈕事件的接口響應(yīng)按鈕動(dòng)作 ckbHB[0]=new Checkbox("白子先",ckgHB,false); //new一個(gè)checkbox ckbHB[0].setBounds(320,20,60,30); //設(shè)置左上角位置和大小 ckbHB[1]=new Checkbox("黑子先",ckgHB,false); //new第二個(gè)checkbox ckbHB[1].setBounds(380,20,60,30); //設(shè)置左上角位置和大小 add(ckbHB[0]); //將第一個(gè)checkbox加入界面 add(ckbHB[1]); //將第二個(gè)checkbox加入界面 ckbHB[0].addItemListener(this); //將本類作為其事件接口來(lái)響應(yīng)選中動(dòng)作 ckbHB[1].addItemListener(this); //將本類作為其事件接口來(lái)響應(yīng)選中動(dòng)作 add(lblWin); //將標(biāo)簽加入界面 lblWin.setBounds(330,130,80,30); //設(shè)置標(biāo)簽的左上角位置和大小 Game_start_csh(); //調(diào)用游戲初始化 } public void itemStateChanged(ItemEvent e) //ItemListener接口中的方法,必須要有 { if (ckbHB[0].getState()) //選擇黑子先還是白子先 { color_Qizi=0; //白棋先 } else { color_Qizi=1; //黑棋先 } } public void actionPerformed(ActionEvent e) //ActionListener接口中的方法,也是必須的 { Graphics g=getGraphics(); //這句話貌似可以去掉,g是用來(lái)畫圖或者畫界面的 if (e.getSource()==b1) //如果動(dòng)作的來(lái)源是第一個(gè)按鈕 { Game_start(); //游戲開始 } else //否則 { Game_re(); //游戲重新開始 } } public void mousePressed(MouseEvent e){} //MouseListener接口中的方法,用不到所以留個(gè)空,但一定要有 public void mouseClicked(MouseEvent e) //鼠標(biāo)單擊時(shí) { Graphics g=getGraphics(); //獲得畫筆 int x1,y1; x1=e.getX(); //單擊處的x坐標(biāo) y1=e.getY(); //單擊處的y坐標(biāo) if (e.getX()20 || e.getX()300 || e.getY()20 || e.getY()300) //在棋盤范圍之外 { return; //則這是不能走棋的,直接返回 } //下面這兩個(gè)if和兩個(gè)賦值的作用是將x和y坐標(biāo)根據(jù)舍入原則修改成棋盤上格子的坐標(biāo) if (x1%2010) { x1+=20; } if(y1%2010) { y1+=20; } x1=x1/20*20; y1=y1/20*20; set_Qizi(x1,y1); //在棋盤上畫上一個(gè)棋子 } public void mouseEntered(MouseEvent e){} //MouseListener接口中的方法,用不到所以留個(gè)空,但一定要有 public void mouseExited(MouseEvent e){} //MouseListener接口中的方法,用不到所以留個(gè)空,但一定要有 public void mouseReleased(MouseEvent e){} //MouseListener接口中的方法,用不到所以留個(gè)空,但一定要有 public void mouseDragged(MouseEvent e){} //MouseListener接口中的方法,用不到所以留個(gè)空,但一定要有 public void mouseMoved(MouseEvent e){} //MouseListener接口中的方法,用不到所以留個(gè)空,但一定要有 public void paint(Graphics g) //重繪和applet程序裝載的時(shí)候會(huì)調(diào)用這個(gè)繪制的過程 { draw_qipan(g); //畫棋盤 }