五子棋AI與人對(duì)決是什么水平
現(xiàn)在目前缺少一場(chǎng)真正的頂級(jí)ai和頂級(jí)人類(lèi)的對(duì)戰(zhàn),但后來(lái)詢(xún)問(wèn)多位 五子棋 資深人士所講,人類(lèi)還是占上風(fēng)的。下面我給你介紹五子棋AI與人對(duì)決是什么水平,歡迎閱讀。
五子棋AI現(xiàn)存的技術(shù)已經(jīng)可做到了,但是現(xiàn)存的五子棋AI程序顯然是不行的,swap2有一萬(wàn)種 方法 可以騙死YIXIN和TITO,所以這里對(duì)計(jì)算機(jī)的AI做個(gè)定義
什么是五子棋AI
1.擁有正常數(shù)量的開(kāi)局存儲(chǔ),不用特別細(xì),幾千手就足夠,幾千手不是很多吧,隨便一個(gè)地毯就上萬(wàn)的.
2.五子棋AI正規(guī)比賽還是有很多規(guī)則的,它必須提前知道對(duì)面要拿什么規(guī)則和他玩,然后對(duì)此做過(guò)準(zhǔn)備,不用特別多,改不超過(guò)50行代碼吧,這個(gè)數(shù)量不到y(tǒng)ixin的1%
3.它必須要有正常的計(jì)算資源,E5這種犯規(guī)的就不提了,4核I7還是挺常見(jiàn)的吧
4.它必須和人類(lèi)有同樣的時(shí)限,而且人類(lèi)在比賽之前不能和它已經(jīng)大戰(zhàn)三百回合
那么人類(lèi)已經(jīng)不能和五子棋AI好好游戲了.
五子棋AI與人對(duì)決是什么水平
現(xiàn)在看起來(lái)可以玩是因?yàn)檫@AI不是為了和你下棋而設(shè)計(jì)的,它是為了和其他五子棋AI玩gomocup才弄出來(lái)的,和人玩五子棋與和電腦玩的策略是完全不一樣的,你不能說(shuō)對(duì)它贏比輸多就證明人能贏AI,因?yàn)槿绻麑?xiě)五子棋AI的目的是和人玩,那作者很多地方根本就不會(huì)這么寫(xiě),更不會(huì)放著巨大的漏洞給你出騙招,真要和人比一比,比就比隨怕隨,核心的計(jì)算部分一點(diǎn)都不用動(dòng),就改點(diǎn)評(píng)價(jià)參數(shù),再弄出一兩個(gè)策略就行,比如故意走譜上不常見(jiàn)的分支,比如故意把局面引向?qū)?引向大規(guī)模計(jì)算,就算人能算得清楚,AI最后拍表也能把人拍死.
而做這種改動(dòng)在代碼里就是改幾個(gè)數(shù)字的問(wèn)題而已
山口RIF和某種叫一手交換的村規(guī),人都沒(méi)戲.因?yàn)楦鶕?jù)定義1,前幾步它全知道,走到一半它覺(jué)得差不多就可以脫譜,下誰(shuí)也沒(méi)見(jiàn)過(guò)的棋,溪月7打打出幾個(gè)你下都沒(méi)下過(guò)的地方,就算是它劣勢(shì),世界第一也不見(jiàn)得每步都能下對(duì),請(qǐng)問(wèn)你如何是好.哦聽(tīng)說(shuō)現(xiàn)在世界第一是汪清清了,那就更不可能了.
SWAP2,計(jì)算機(jī)先手人沒(méi)戲,人先手可能可以騙贏(畢竟3子開(kāi)局太多不可能提前存),以前歪果仁構(gòu)造出過(guò)一個(gè)輕松騙贏軟件的例子,不過(guò)那還是因?yàn)闆](méi)做過(guò)特化,如果讓AI對(duì)所有沒(méi)見(jiàn)過(guò)的局面都后手連下2步,那估計(jì)就變成人不能玩了.
另外說(shuō)一句,五子棋AI的發(fā)展正處于并將長(zhǎng)期處于社會(huì)主義初級(jí)階段,很多東西其實(shí)是金玉其外敗絮其中的,花點(diǎn)時(shí)間改改,提升200個(gè)elo根本不成問(wèn)題.
gomocup的比賽結(jié)果
2006年,第一屆人機(jī)大戰(zhàn),捷克頂級(jí)選手跟當(dāng)時(shí)頂級(jí)的ai下的結(jié)果是一勝一平一負(fù)(下得都是平衡開(kāi)局)。
2011年,第二屆人機(jī)大戰(zhàn)捷克頂級(jí)選手跟當(dāng)時(shí)頂級(jí)的ai下的結(jié)果是5:3,AI贏(下得都是平衡開(kāi)局)。
而2012年中國(guó)的弈心才出現(xiàn)在Gomocup里,把其余的AI都給虐了(也就是當(dāng)年打敗人類(lèi)的那些軟件),連續(xù)三年遙遙領(lǐng)先。2014年更是以153:9的懸殊比分贏了其余的ai。照這么說(shuō),AI應(yīng)該能夠贏得過(guò)頂級(jí)的人類(lèi)棋手。
但弈心的官網(wǎng)里,作者孫鍇稱(chēng):
相比電腦象棋,電腦五子棋的發(fā)展是緩慢的。頂級(jí)五子棋程序依舊無(wú)法超越最強(qiáng)的人類(lèi)的棋手。
這話(huà)就讓人糊涂了。后來(lái)我猜測(cè)理解這可能背后有其他的隱含含義:
相比電腦象棋,電腦五子棋的發(fā)展是緩慢的。(在弈心出來(lái)之前,)頂級(jí)五子棋程序依舊無(wú)法超越最強(qiáng)的人類(lèi)的棋手。
但其實(shí)考證后,真實(shí)的含義是
相比電腦象棋,電腦五子棋的發(fā)展是緩慢的。頂級(jí)五子棋程序依舊無(wú)法超越最強(qiáng)的人類(lèi)的棋手(捷克那批棋手太菜了)。
五子棋游戲程序設(shè)計(jì)(VB)
一個(gè)五子棋(Renju;Five-in-a-row;Gobang;Gomoku)游戲程序大概需要以下要素:
圖形界面:繪制窗體(Form)、棋盤(pán)(Board)、棋子(Piece)、贏棋(Win)輸棋(Lose)和棋(Draw)提示,以及各種功能按鈕(Function Button)。
走棋方式規(guī)定:黑方(Black)先走。單擊棋盤(pán)上某一個(gè)十字交叉點(diǎn)落黑子或白子,如果某一方已成五,則不能再落子。如果該游戲支持禁手(Forbidden Move),即黑方不可以下“三三”、“四四”、“長(zhǎng)連”,白方(White)無(wú)禁手。
(單人游戲(Single Game))電腦走棋策略:電腦計(jì)算哪種走棋方法最優(yōu)。
(可選)游戲設(shè)置(Game Settings)、悔棋(Retract)、導(dǎo)出(Export;Output)棋譜(Manual)、與網(wǎng)友下棋等。
如果能做一個(gè)像五子棋終結(jié)者那樣的無(wú)敵軟件,算你厲害。
求五子棋C語(yǔ)言AI算法(原創(chuàng)思路)
我有個(gè)簡(jiǎn)單的思路: 先定義一條線(xiàn)上棋子的各種布局,比如初步定義長(zhǎng)度為五個(gè)子 ◎◎◎◎● ◎◎●◎× ◎●◎×× ◎×◎×◎ 等等。白圈是自己的子,黑圈是對(duì)方的子,叉子是未走的格子。 程序里有個(gè)布局表,再定義各個(gè)布局的分?jǐn)?shù),比如連五最99分,連三30分等等。 ...
經(jīng)典五子棋的C++程序設(shè)計(jì)
#include?<iostream>
#include?<stdlib.h>
using?namespace?std;
class?fivegame
{?char?m,n;
int?h,l;
char?z;
char?list[20][20];
public:
int?kk;
int?init();
int?enterchar(char?q);
int?print();
int?pk();
int?ifwin();
bool?ison;
bool?test();
char?list1[5];
int?puout();
};
int?fivegame::puout()
{?cout<<"?這?是?個(gè)?五?字?棋?游?戲?"<<endl;
cout<<"?制作--elva6401--?"<<endl;
cout<<"?(注:行列都要用大寫(xiě)字母)"<<endl;
return?0;
}
bool?fivegame::test()
{
int?i;
for?(i=0;i<=4;i++)
{if?(list1[i]!=z)
return?false;}
return?true;
}
int?fivegame::init()
{?int?i,j,m=0;
for?(i=0;i<=9;i++)?cout<<i<<"?";
for?(i=65;i<=75;i++)?cout<<static_cast<char>(i)<<"?";
cout<<0<<endl;
for?(j=0;j<=8;j++)
{?m=m+1;?cout<<m<<"?";
for?(i=0;i<=19;i++)
{?list[j][i]='?';?cout<<list[j][i]<<"?";}
cout<<m<<endl;}
m=64;
for?(j=9;j<=19;j++)
{?m=m+1;?cout<<static_cast<char>(m)<<"?";
for?(i=0;i<=19;i++)
{?list[j][i]='?';?cout<<list[j][i]<<"?";}
cout<<static_cast<char>(m)<<endl;}
for?(i=0;i<=9;i++)?cout<<i<<"?";
for?(i=65;i<=75;i++)?cout<<static_cast<char>(i)<<"?";
cout<<0<<endl;
return?0;
}
int?fivegame::enterchar(char?q)
{?char?a,b;
cout<<"現(xiàn)在輪到?"<<q<<"?下."<<endl;
cout<<"請(qǐng)輸入要下的行號(hào)和列號(hào)."<<endl;
cin>>a>>b;
z=q;m=a;n=b;
return?0;
}
int?fivegame::print()
{?if?(static_cast<int>(m)>60)?h=static_cast<int>(m)-56;
else?h=static_cast<int>(m)-49;
if?(static_cast<int>(n)>60)?l=static_cast<int>(n)-56;
else?l=static_cast<int>(n)-49;
int?i,j,m=0;
if?(list[h][l]!='?')
{?kk=0;
for?(i=0;i<=9;i++)?cout<<i<<"?";
for?(i=65;i<=75;i++)?cout<<static_cast<char>(i)<<"?";
cout<<0<<endl;
for?(j=0;j<=8;j++)
{?m=m+1;?cout<<m<<"?";
for?(i=0;i<=19;i++)
cout<<list[j][i]<<"?";
cout<<m<<endl;}
m=64;
for?(j=9;j<=19;j++)
{?m=m+1;?cout<<static_cast<char>(m)<<"?";
for?(i=0;i<=19;i++)
cout<<list[j][i]<<"?";
cout<<static_cast<char>(m)<<endl;}
for?(i=0;i<=9;i++)?cout<<i<<"?";
for?(i=65;i<=75;i++)?cout<<static_cast<char>(i)<<"?";
cout<<0<<endl;
return?0;}
else
list[h][l]=z;
for?(i=0;i<=9;i++)?cout<<i<<"?";
for?(i=65;i<=75;i++)?cout<<static_cast<char>(i)<<"?";
cout<<0<<endl;
for?(j=0;j<=8;j++)
{?m=m+1;?cout<<m<<"?";
for?(i=0;i<=19;i++)
cout<<list[j][i]<<"?";
cout<<m<<endl;}
m=64;
for?(j=9;j<=19;j++)
{?m=m+1;?cout<<static_cast<char>(m)<<"?";
for?(i=0;i<=19;i++)
cout<<list[j][i]<<"?";
cout<<static_cast<char>(m)<<endl;}
for?(i=0;i<=9;i++)?cout<<i<<"?";
for?(i=65;i<=75;i++)?cout<<static_cast<char>(i)<<"?";
cout<<0<<endl;
return?0;
}
int?fivegame::ifwin()
{?int?i,j,q=0,k=0;
for(i=0;i<=19;i++)
{?q=0,k=0;
while?(q<=15)
{?for?(j=q;j<=q+4;j++)
list1[j-k]=list[i][j];
if?(fivegame::test())
{ison=true;return?true;}
else
q++;k++;}
}
for(i=0;i<=19;i++)
{?q=0,k=0;
while?(q<=15)
{?for?(j=q;j<=q+4;j++)
list1[j-k]=list[j][i];
if?(fivegame::test())
{ison=true;return?true;}
else
q++;k++;}
}
for?(i=0;i<=15;i++)
{?q=0,k=0;
while?(q<=15)
{
for?(j=q;j<=q+4;j++)
list1[j-k]=list[i+j-k][j];
if?(fivegame::test())
{ison=true;return?true;}
else
q++;k++;}
}
for(i=18;i>=4;i--)
{?q=0,k=0;
while?(q<=15)
{
for?(j=q;j<=q+4;j++)
list1[j-k]=list[i-j+k][19-j];
if?(fivegame::test())
{ison=true;return?true;}
else
q++;k++;}
}
for?(i=0;i<=15;i++)
{?q=0,k=0;
while?(q<=15)
{
for?(j=q;j<=q+4;j++)
list1[j-k]=list[i+j-k][19-j];
if?(fivegame::test())
{ison=true;return?true;}
else
q++;k++;}
}
for(i=18;i>=4;i--)
{?q=0,k=0;
while?(q<=15)
{
for?(j=q;j<=q+4;j++)
list1[j-k]=list[i-j+k][19-j];
if?(fivegame::test())
{ison=true;return?true;}
else
q++;k++;}
}
for(i=18;i>=4;i--)
{?q=0,k=0;
while?(q<=15)
{
for?(j=q;j<=q+4;j++)
list1[j-k]=list[i-j+k][j];
if?(fivegame::test())
{ison=true;return?true;}
else
q++;k++;}
}
return?0;
}
int?fivegame::pk()
{?cout<<m<<"?"<<n<<"?"<<z?<<endl;
cout<<static_cast<int>(m)<<static_cast<int>(n)<<endl;
return?0;?}
int?main()
{
int?abc;
char?y='a';
fivegame?game;
game.puout();
game.ison=false;
game.init();
while(game.ison==false)
{
game.kk=1;
game.enterchar(y);
system("cls");
game.puout();
game.print();
game.ifwin();
if?(game.kk==1)
{
if?(y=='a')?y='b';
else?y='a';
}
}
if?(y=='a')?y='b';
else?y='a';
cout<<y<<"?贏了?!"<<endl;
cin>>abc;
return?0;
}
用JAVA設(shè)計(jì)游戲:五子棋游戲
下面的源代碼分為4個(gè)文件;
.java:客戶(hù)端主程序。
.java:客戶(hù)端的界面。
chessPad.java:棋盤(pán)的繪制。
.java:服務(wù)器端。
可同時(shí)容納50個(gè)人同時(shí)在線(xiàn)下棋,聊天。
沒(méi)有加上詳細(xì)注釋?zhuān)贿^(guò)絕對(duì)可以運(yùn)行,j2sdk1.4下通過(guò)。
/*********************************************************************************************
1..java
**********************************************************************************************/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.*;
class extends Thread
{
;
( )
{
this.=;
}
public void (String )
{
if(.("/userlist "))
{
userToken=new (," ");
int =0;
.userpad.userList.removeAll();
.inputpad..removeAll();
.inputpad..addItem("所有人");
while(userToken.())
{
String user=(String)userToken.nextToken(" ");
if(>0 && !user.("[inchess]"))
{
.userpad.userList.add(user);
.inputpad..addItem(user);
}
++;
}
.inputpad..select("所有人");
}
else if(.("/yourname "))
{
.=.substring(10);
.setTitle("Java五子棋客戶(hù)端 "+"用戶(hù)名:"+.);
}
else if(.equals("/reject"))
{
try
{
.chesspad..setText("不能加入游戲");
...(false);
...(true);
...(true);
}
catch(Exception ef)
{
.chatpad..setText(".chesspad..close無(wú)法關(guān)閉");
}
...(true);
}
else if(.("/peer "))
{
.chesspad.=.substring(6);
if(.isServer)
{
.chesspad.=1;
.chesspad.=true;
.chesspad..setText("請(qǐng)黑棋下子");
}
else if(.isClient)
{
.chesspad.=-1;
.chesspad..setText("已加入游戲,等待對(duì)方下子...");
}
}
else if(.equals("/youwin"))
{
.isOnChess=false;
.chesspad.(.chesspad.);
.chesspad..setText("對(duì)方退出,請(qǐng)點(diǎn)放棄游戲退出連接");
.chesspad.=false;
}
else if(.equals("/OK"))
{
.chesspad..setText("創(chuàng)建游戲成功,等待別人加入...");
}
else if(.equals("/error"))
{
.chatpad..append("傳輸錯(cuò)誤:請(qǐng)退出程序,重新加入 \n");
}
else
{
.chatpad..append(+"\n");
.chatpad..(
.chatpad..getText().length());
}
}
public void run()
{
String message="";
try
{
while(true)
{
message=.in.readUTF();
(message);
}
}
catch( es)
{
}
}
}
public class extends Frame ,
{
userPad userpad=new userPad();
chatPad chatpad=new chatPad();
=new ();
chessPad chesspad=new chessPad();
inputPad inputpad=new inputPad();
Socket ;
in;
out;
String =null;
String host=null;
int port=4331;
boolean isOnChat=false; //在聊天?
boolean isOnChess=false; //在下棋?
boolean =false; //下棋的客戶(hù)端連接?
boolean isServer=false; //如果是下棋的主機(jī)
boolean isClient=false; //如果是下棋的客戶(hù)端
Panel =new Panel();
Panel =new Panel();
Panel =new Panel();
Panel westPanel=new Panel();
Panel eastPanel=new Panel();
()
{
super("Java五子棋客戶(hù)端");
setLayout(new ());
host=.inputIP.getText();
westPanel.setLayout(new ());
westPanel.add(userpad,.NORTH);
westPanel.add(chatpad,.CENTER);
westPanel.(Color.pink);
inputpad..(this);
chesspad.host=.inputIP.getText();
.add(chesspad,.CENTER);
.add(inputpad,.SOUTH);
.(Color.pink);
..(this);
..(this);
..(this);
..(this);
..(this);
..(false);
..(false);
..(false);
.add(,.CENTER);
.(Color.pink);
(new ()
{
public void ( e)
{
if(isOnChat)
{
try
{
.close();
}
catch(Exception ed)
{
}
}
if(isOnChess || )
{
try
{
chesspad..close();
}
catch(Exception ee)
{
}
}
System.exit(0);
}
public void ( ea)
{
}
});
add(westPanel,.WEST);
add(,.CENTER);
add(,.SOUTH);
pack();
setSize(670,548);
(true);
(false);
validate();
}
public boolean (String serverIP,int ) throws Exception
{
try
{
=new Socket(serverIP,);
in=new (.());
out=new (.());
=new (this);
.start();
isOnChat=true;
return true;
}
catch( ex)
{
chatpad..setText("::無(wú)法連接,建議重新啟動(dòng)程序 \n");
}
return false;
}
public void ( e)
{
if(e.getSource()==.)
{
host=chesspad.host=.inputIP.getText();
try
{
if((host,port))
{
chatpad..setText("");
..(false);
..(true);
..(true);
chesspad..setText("連接成功,請(qǐng)創(chuàng)建游戲或加入游戲");
}
}
catch(Exception ei)
{
chatpad..setText(".:無(wú)法連接,建議重新啟動(dòng)程序 \n");
}
}
if(e.getSource()==.)
{
if(isOnChat)
{
try
{
.close();
}
catch(Exception ed)
{
}
}
if(isOnChess || )
{
try
{
chesspad..close();
}
catch(Exception ee)
{
}
}
System.exit(0);
}
if(e.getSource()==.)
{
String =userpad.userList.();
if(==null || .("[inchess]") ||
.equals())
{
chesspad..setText("必須先選定一個(gè)有效用戶(hù)");
}
else
{
try
{
if(!)
{
if(chesspad.(chesspad.host,chesspad.port))
{
=true;
isOnChess=true;
isClient=true;
..(false);
..(false);
..(true);
chesspad..("/joingame "+userpad.userList.()+" "+);
}
}
else
{
isOnChess=true;
isClient=true;
..(false);
..(false);
..(true);
chesspad..("/joingame "+userpad.userList.()+" "+);
}
}
catch(Exception ee)
{
=false;
isOnChess=false;
isClient=false;
..(true);
..(true);
..(false);
chatpad..setText("chesspad.無(wú)法連接 \n"+ee);
}
}
}
if(e.getSource()==.)
{
try
{
if(!)
{
if(chesspad.(chesspad.host,chesspad.port))
{
=true;
isOnChess=true;
isServer=true;
..(false);
..(false);
..(true);
chesspad..("/creatgame "+"[inchess]"+);
}
}
else
{
isOnChess=true;
isServer=true;
..(false);
..(false);
..(true);
chesspad..("/creatgame "+"[inchess]"+);
}
}
catch(Exception ec)
{
=false;
isOnChess=false;
isServer=false;
..(true);
..(true);
..(false);
ec.();
chatpad..setText("chesspad.無(wú)法連接 \n"+ec);
}
}
if(e.getSource()==.)
{
if(isOnChess)
{
chesspad..("/giveup "+);
chesspad.(-1*chesspad.);
..(true);
..(true);
..(false);
chesspad..setText("請(qǐng)建立游戲或者加入游戲");
}
if(!isOnChess)
{
..(true);
..(true);
..(false);
chesspad..setText("請(qǐng)建立游戲或者加入游戲");
}
isClient=isServer=false;
}
}
public void (KeyEvent e)
{
TextField =(TextField)e.getSource();
if(e.()==KeyEvent.VK_ENTER)
{
if(inputpad..().equals("所有人"))
{
try
{
out.writeUTF(.getText());
.setText("");
}
catch(Exception ea)
{
chatpad..setText(":無(wú)法連接,建議重新連接 \n");
userpad.userList.removeAll();
inputpad..removeAll();
.setText("");
..(true);
}
}
else
{
try
{
out.writeUTF("/"+inputpad..()+" "+.getText());
.setText("");
}
catch(Exception ea)
{
chatpad..setText(":無(wú)法連接,建議重新連接 \n");
userpad.userList.removeAll();
inputpad..removeAll();
.setText("");
..(true);
}
}
}
}
public void keyTyped(KeyEvent e)
{
}
public void (KeyEvent e)
{
}
public static void main(String args[])
{
=new ();
}
}
/******************************************************************************************
下面是:.java
******************************************************************************************/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
class userPad extends Panel
{
List userList=new List(10);
userPad()
{
setLayout(new ());
for(int i=0;i<50;i++)
{
userList.add(i+"."+"沒(méi)有用戶(hù)");
}
add(userList,.CENTER);
}
}
class chatPad extends Panel
{
TextArea =new TextArea("",18,30,TextArea._VERTICAL_ONLY);
chatPad()
{
setLayout(new ());
add(,.CENTER);
}
}
class extends Panel
{
Label IPlabel=new Label("IP",Label.LEFT);
TextField inputIP=new TextField("localhost",10);
Button =new Button("連接主機(jī)");
Button =new Button("建立游戲");
Button =new Button("加入游戲");
Button =new Button("放棄游戲");
Button =new Button("關(guān)閉程序");
()
{
setLayout(new (.LEFT));
(Color.pink);
add(IPlabel);
add(inputIP);
add();
add();
add();
add();
add();
}
}
class inputPad extends Panel
{
TextField =new TextField("",40);
Choice =new Choice();
inputPad()
{
setLayout(new (.LEFT));
for(int i=0;i<50;i++)
{
.addItem(i+"."+"沒(méi)有用戶(hù)");
}
.setSize(60,24);
add();
add();
}
}
/**********************************************************************************************
下面是:chessPad.java
**********************************************************************************************/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.*;
class extends Thread
{
chessPad chesspad;
(chessPad chesspad)
{
this.chesspad=chesspad;
}
public void (String )
{
try
{
chesspad.outData.writeUTF();
}
catch(Exception ea)
{
System.out.println(".:"+ea);
}
}
public void (String )
{
if(.("/chess "))
{
userToken=new (," ");
String ;
String[] chessOpt={"-1","-1","0"};
int =0;
while(userToken.())
{
=(String)userToken.nextToken(" ");
if(>=1 && <=3)
{
chessOpt[-1]=;
}
++;
}
chesspad.(Integer.parseInt(chessOpt[0]),Integer.parseInt(chessOpt[1]),Integer.parseInt(chessOpt[2]));
}
else if(.("/yourname "))
{
chesspad.=.substring(10);
}
else if(.equals("/error"))
{
chesspad..setText("錯(cuò)誤:沒(méi)有這個(gè)用戶(hù),請(qǐng)退出程序,重新加入");
}
else
{
//System.out.println();
}
}
public void run()
{
String message="";
try
{
while(true)
{
message=chesspad.inData.readUTF();
(message);
}
}
catch( es)
{
}
}
}
class chessPad extends Panel ,
{
int _x=-1,_y=-1,=1;
int _x[]=new int[200];
int _y[]=new int[200];
int _x[]=new int[200];
int _y[]=new int[200];
int =0,=0;
int =0,=0;
boolean =false,isWin=false,isInGame=false;
TextField =new TextField("請(qǐng)先連接服務(wù)器");
Socket ;
inData;
outData;
String =null;
String =null;
String host=null;
int port=4331;
=new (this);
chessPad()
{
setSize(440,440);
setLayout(null);
(Color.pink);
(this);
add();
.setBounds(40,5,360,24);
.(false);
}
public boolean (String ServerIP,int ) throws Exception
{
try
{
=new Socket(ServerIP,);
inData=new (.());
outData=new (.());
.start();
return true;
}
catch( ex)
{
.setText("chessPad::無(wú)法連接 \n");
}
return false;
}
public void (int )
{
this.removeAll();
for(int i=0;i<=;i++)
{
_x[i]=0;
_y[i]=0;
}
for(int i=0;i<=;i++)
{
_x[i]=0;
_y[i]=0;
}
=0;
=0;
add();
.setBounds(40,5,360,24);
if(==1)
{ ++;
.setText("黑棋勝,黑:白為"++":"++",重新開(kāi)局,等待白棋下子...");
}
else if(==-1)
{
++;
.setText("白棋勝,黑:白為"++":"++",重新開(kāi)局,等待黑棋下子...");
}
}
public void (int a,int b,int color)
{
if(color==1)
{
_x[]=a*20;
_y[]=b*20;
++;
}
else if(color==-1)
{
_x[]=a*20;
_y[]=b*20;
++;
}
}
public boolean checkWin(int a,int b,int )
{
int step=1,chessLink=1,=1,=0;
if(==1)
{
chessLink=1;
for(step=1;step<=4;step++)
{
for(=0;<=;++)
{
if(((a+step)*20==_x[]) && ((b*20)==_y[]))
{
chessLink=chessLink+1;
if(chessLink==5)
{
return(true);
}
}
}
if(chessLink==(+1))
++;
else
break;
}
for(step=1;step<=4;step++)
{
for(=0;<=;++)
{
if(((a-step)*20==_x[]) && (b*20==_y[]))
{
chessLink++;
if(chessLink==5)
{
return(true);
}
}
}
if(chessLink==(+1))
++;
else
break;
}
chessLink=1;
=1;
for(step=1;step<=4;step++)
{
for(=0;<=;++)
{
if((a*20==_x[]) && ((b+step)*20==_y[]))
{
游戲軟件設(shè)計(jì) 高手進(jìn)
書(shū)名:大型多人在線(xiàn)游戲開(kāi)發(fā)MASSIVELY
作者:亞歷山大
譯者:史曉明
說(shuō)明:本書(shū)是一本系統(tǒng)介紹MMP(大型多人,Massively )在線(xiàn)游戲開(kāi)發(fā)知識(shí)的文集,匯集業(yè)內(nèi)最優(yōu)秀的游戲開(kāi)發(fā)人員智慧的精華。本書(shū)不僅從MMP游戲的角度對(duì)客戶(hù)端技術(shù)進(jìn)行了討論,還深入剖析了MMP游戲設(shè)計(jì)、架構(gòu)、服務(wù)端開(kāi)發(fā)、數(shù)據(jù)庫(kù)技術(shù)以及MMP游戲核心系統(tǒng)等特定于MMP游戲的知識(shí)。對(duì)于廣大MMP游戲開(kāi)發(fā)人員來(lái)說(shuō),本書(shū)是不可多得的參考資料。
書(shū)名:C++游戲編程
作者:(美)羅比斯 李鵬 賈傳俊
說(shuō)明:本書(shū)從游戲開(kāi)發(fā)的角度出發(fā),把C++應(yīng)用到游戲軟件領(lǐng)域。介紹一些C++的實(shí)戰(zhàn)經(jīng)驗(yàn),用常規(guī)的C++技術(shù)解決游戲開(kāi)發(fā)者經(jīng)常遇到的問(wèn)題。重點(diǎn)講述已經(jīng)在實(shí)際的項(xiàng)目中應(yīng)用的技術(shù),而不是大段地羅列代碼。本書(shū)是游戲開(kāi)發(fā)經(jīng)典叢書(shū)系列之一,適合游戲開(kāi)發(fā)人員、業(yè)余游戲軟件開(kāi)發(fā)愛(ài)好者和有關(guān)游戲軟件開(kāi)發(fā)培訓(xùn)班使用,也可以人秋大專(zhuān)院校相關(guān)專(zhuān)業(yè)的參考書(shū)。
書(shū)名:Visual Basic 6.0/.NET游戲開(kāi)發(fā)實(shí)例
作者:姜波 寧峰
說(shuō)明:本書(shū)是一本面向廣大編程愛(ài)好者的游戲設(shè)計(jì)類(lèi)圖書(shū)。本書(shū)最大的特色在于以游戲開(kāi)發(fā)案例為主要的內(nèi)容。書(shū)中涉及到的游戲都是大家耳熟能詳?shù)?。比如推箱子,俄羅斯方塊,五子棋,坦克大戰(zhàn)等。為了使您緊跟技術(shù)進(jìn)步的潮流,我們還為您介紹了目前非常流行的智能設(shè)備編輯。我們不僅做到了通俗易懂,圖文并茂。
本書(shū)適用于游戲編程愛(ài)好者,程序設(shè)計(jì)人員和Visual Basic的初學(xué)者。也可作為培訓(xùn)機(jī)構(gòu)的培訓(xùn)教材。
書(shū)名:盛大游戲原畫(huà)設(shè)計(jì)精選
作者:上海盛大新華網(wǎng)絡(luò)發(fā)展有限公司 南京藝術(shù)
說(shuō)明:本書(shū)介紹如何品味游戲的角色設(shè)計(jì)和原畫(huà)創(chuàng)作,從游戲腳本到初級(jí)造型——體會(huì)《神跡》,充分理解腳本意圖,提煉與夸張《神跡》的場(chǎng)景,塑造個(gè)性(上)——走進(jìn)《夢(mèng)幻國(guó)度》,自身比例關(guān)系之Q版造型,《夢(mèng)幻國(guó)度》的場(chǎng)景,塑造個(gè)性(下)——走進(jìn)《英雄年代》,自身比例關(guān)系之傳統(tǒng)造型,《英雄年代》的場(chǎng)景,關(guān)于道具——解析《三國(guó)豪俠傳》,營(yíng)造視覺(jué)效果——感受《傳奇世界》……
書(shū)名:3D游戲卷1:實(shí)時(shí)渲染與軟件技術(shù)
作者:Alan Watt,Fabio Policarpo
譯者:沈一帆 陳文斌 朱怡波
說(shuō)明:綜合介紹當(dāng)前流行的三維游戲開(kāi)發(fā)技術(shù),主要內(nèi)容包括:建模及基礎(chǔ)數(shù)學(xué),經(jīng)典的三維圖形學(xué),實(shí)時(shí)渲染,對(duì)象的控制,二維技術(shù),軟件技術(shù)等。書(shū)中的所有內(nèi)容都是圍繞一個(gè)功能強(qiáng)大的游戲開(kāi)發(fā)引擎,即Fly3D來(lái)寫(xiě)的。其目的是使你可以編寫(xiě)源代碼來(lái)實(shí)現(xiàn)自己的想法,或是通過(guò)編寫(xiě)或修改插件來(lái)對(duì)現(xiàn)有的實(shí)例進(jìn)行試驗(yàn),甚至可以開(kāi)發(fā)屬于自己的游戲。隨書(shū)光盤(pán)給出了完整的Fly 3D SDK及一些演示片段和圖片。
書(shū)名:3D游戲:卷2 動(dòng)畫(huà)與高級(jí)實(shí)時(shí)渲染技術(shù)
作者:Alan Watt,Fabio Policarpo
譯者:沈一帆 陳文斌 朱怡波
說(shuō)明:本書(shū)從實(shí)踐的角度出發(fā),詳細(xì)介紹3D游戲開(kāi)發(fā)的高級(jí)技術(shù),并具體描述了一個(gè)游戲引擎的構(gòu)建過(guò)程。全書(shū)著重討論三個(gè)主題:游戲開(kāi)發(fā)的一般過(guò)程(構(gòu)造過(guò)程、實(shí)時(shí)處理過(guò)程和軟件設(shè)計(jì));實(shí)時(shí)渲染過(guò)程;角色動(dòng)畫(huà)。所有主題均圍繞一個(gè)具體的游戲開(kāi)發(fā)系統(tǒng)Fly3D SDK 2.0(包含在光盤(pán)中)加以介紹。本書(shū)旨在為當(dāng)今的三維游戲引擎技術(shù)提供一個(gè)綜合的解決方案,將游戲理論技術(shù)與具體引擎代碼分析相結(jié)合,使讀者盡快地進(jìn)入開(kāi)發(fā)者角色,了解整個(gè)游戲開(kāi)發(fā)過(guò)程和客戶(hù)(游戲設(shè)計(jì)者)的需求,并初步具備游戲引擎開(kāi)發(fā)能力。本書(shū)適合作為高等院校相關(guān)專(zhuān)業(yè)的教學(xué)參考書(shū),同時(shí)可供相關(guān)技術(shù)人員和游戲開(kāi)發(fā)人員閱讀。
書(shū)名:Visual C++角色扮演游戲程序設(shè)計(jì)
作者:坂本千尋
譯者:博碩文化
說(shuō)明:本書(shū)適合已有VC++使用經(jīng)驗(yàn)的讀者,書(shū)中共分十個(gè)章節(jié),從最基本的RPG的角色扮演游戲設(shè)計(jì)要素開(kāi)始介紹,再來(lái)教您Windows窗口程序設(shè)計(jì)與RPG游戲配合的基本知識(shí)、圖形文件的顯示與全盛地圖與人物相關(guān)的坐標(biāo)處理、人物角色移動(dòng)的思維與邏輯、戰(zhàn)斗的設(shè)計(jì)與程序判斷、RPG里所產(chǎn)生的事件的處理、角色參數(shù)的編輯設(shè)定和程序設(shè)計(jì)重點(diǎn)、音效加入與故事的整合等,每一章節(jié)都有完整高水準(zhǔn)的程序?qū)嵗浜辖庹f(shuō),對(duì)想要學(xué)習(xí)游戲制作的讀者提供了極佳的參考。
書(shū)名:Visual C++冒險(xiǎn)游戲程序設(shè)計(jì)
作者:坂本千尋
譯者:博碩文化
說(shuō)明:本書(shū)針對(duì)冒險(xiǎn)型游戲(AVG),從游戲策劃與設(shè)計(jì)開(kāi)始介紹,然后再以VC++為實(shí)際開(kāi)發(fā)工具,完整詳細(xì)地指導(dǎo)讀者開(kāi)發(fā)一套高水準(zhǔn)的冒險(xiǎn)型游戲。
書(shū)中著重的不是華麗的演出或新技術(shù)的說(shuō)明,而是務(wù)實(shí)且仔細(xì)地審視冒險(xiǎn)游戲最基本的本質(zhì)思維與邏輯部分。再者,書(shū)中許多程序的觀念與技巧內(nèi)容也適用于游戲以外的程序設(shè)計(jì),這些技術(shù)都是作者經(jīng)驗(yàn)累積的成果,不是一般入門(mén)書(shū)會(huì)提供的,書(shū)中許多內(nèi)容與觀念都是想要進(jìn)階與提升技術(shù)的讀者所需要的,不僅適用于想要開(kāi)發(fā)冒險(xiǎn)型游戲的讀者,也適合想要以“游戲”為題材來(lái)學(xué)習(xí)程序設(shè)計(jì)的讀者。
書(shū)名:C++游戲編程
作者:(美)Noel Llopis
譯者:李鵬/ 賈傳俊
說(shuō)明:本書(shū)從游戲開(kāi)發(fā)的角度出發(fā),把C++應(yīng)用到游戲軟件領(lǐng)域。介紹一些C++的實(shí)戰(zhàn)經(jīng)驗(yàn),用常規(guī)的C++技術(shù)解決游戲開(kāi)發(fā)者經(jīng)常遇到的問(wèn)題。重點(diǎn)講述已經(jīng)在實(shí)際的項(xiàng)目中應(yīng)用的技術(shù),而不是大段地羅列代碼。
本書(shū)是游戲開(kāi)發(fā)經(jīng)典叢書(shū)系列之一,適合游戲開(kāi)發(fā)人員、業(yè)余游戲軟件開(kāi)發(fā)愛(ài)好者和有關(guān)游戲軟件開(kāi)發(fā)培訓(xùn)班使用,也可以人秋大專(zhuān)院校相關(guān)專(zhuān)業(yè)的參考書(shū)。
名:Cg教程:可編程實(shí)時(shí)圖形權(quán)威指南
譯者:洪偉 劉亞妮 李騎 丁蓮珍
說(shuō)明:Cg是最早的為可編程圖形硬件設(shè)計(jì)的高級(jí)編程語(yǔ)言,本書(shū)教你如何編寫(xiě)Cg程序。
本書(shū)共10章,第1章簡(jiǎn)要介紹Cg語(yǔ)言。隨后的每一章分別介紹Cg中的一個(gè)概念和技術(shù)的說(shuō)明,包括最簡(jiǎn)單的Cg程序,參數(shù)、紋理和表達(dá)式,如何進(jìn)行頂點(diǎn)變換,如何用Cg實(shí)現(xiàn)光照模型,如何用Cg頂點(diǎn)程序?qū)崿F(xiàn)模型的動(dòng)畫(huà)和變換,如何實(shí)現(xiàn)環(huán)境貼圖,如何實(shí)現(xiàn)凹凸貼圖,霧、卡通光照、投影聚光、陰影貼圖和復(fù)合技術(shù),目前可用的Cg的頂點(diǎn)和片斷的簡(jiǎn)要描述(Profile)等內(nèi)容。
書(shū)名:網(wǎng)絡(luò)游戲開(kāi)發(fā)
譯者:姚曉光 惲爽 王鑫
說(shuō)明:本書(shū)出自?xún)晌皇澜缂?jí)資深網(wǎng)絡(luò)游戲?qū)<抑?,全面介紹了如何構(gòu)架、發(fā)行和維護(hù)網(wǎng)絡(luò)游戲,專(zhuān)業(yè)而又詳盡地講述了網(wǎng)絡(luò)游戲制作、發(fā)行及運(yùn)營(yíng)中的一些實(shí)際細(xì)節(jié)。書(shū)中匯集了網(wǎng)絡(luò)游戲開(kāi)發(fā)歷程中的經(jīng)驗(yàn)與教訓(xùn)。
對(duì)于從事網(wǎng)絡(luò)游戲開(kāi)發(fā)的業(yè)內(nèi)人土,特別是管理人員,本書(shū)是不可多得的佳作。本書(shū)同樣適合于對(duì)網(wǎng)絡(luò)游戲開(kāi)發(fā)有興趣的玩家和讀者。
網(wǎng)絡(luò)游戲已經(jīng)出現(xiàn)———不再是未來(lái)的夢(mèng)想!如果你是網(wǎng)絡(luò)游戲從業(yè)人士。就絕對(duì)不能錯(cuò)過(guò)本書(shū)!
“本書(shū)匯集了許多大型網(wǎng)絡(luò)游戲開(kāi)發(fā)的優(yōu)秀經(jīng)驗(yàn),采用書(shū)中的這些建議可以為公司節(jié)省數(shù)百萬(wàn)美元的成本 ” Gordon Walton,Maxis公司副總裁,《模擬人生在線(xiàn)》執(zhí)行制作人。
書(shū)名:Windows游戲編程大師技巧(第二版)
原名:Tricks of the Windows Game Gurus,2nd
說(shuō)明:本書(shū)是著名游戲程序設(shè)計(jì)類(lèi)書(shū)籍作者André LaMothe的兩卷本《Windows游戲編程大師技巧》中的第一卷的第二版。和作者撰寫(xiě)的其他暢銷(xiāo)書(shū)一樣,在書(shū)中隨處可見(jiàn)許多有趣但又有一定難度的源程序。作者循循善誘地從程序設(shè)計(jì)的角度介紹了在Windows環(huán)境下進(jìn)行游戲開(kāi)發(fā)所需的全部知識(shí),包括Win32編程以及DirectX中所有主要組件(包括、、和)。書(shū)中還用單獨(dú)的章節(jié)詳細(xì)講授了2D圖形學(xué)和光柵化技術(shù)、游戲算法、多線(xiàn)程編程、文本游戲和解析、人工智能(包括模糊邏輯、神經(jīng)網(wǎng)絡(luò)和遺傳算法)、物理建模(完全碰撞反應(yīng)、動(dòng)量傳遞和正反向運(yùn)動(dòng)學(xué))及實(shí)時(shí)模擬等游戲程序開(kāi)發(fā)中的關(guān)鍵技術(shù)。
書(shū)名:Visual C++網(wǎng)絡(luò)游戲建模與實(shí)現(xiàn)
作者:蘇羽 王媛媛
說(shuō)明:本書(shū)講述如何使用UML進(jìn)行棋牌類(lèi)網(wǎng)絡(luò)游戲建模、如何用Visual C++編程實(shí)現(xiàn)該游戲,書(shū)中集作者近年來(lái)從事網(wǎng)絡(luò)游戲開(kāi)發(fā)之經(jīng)驗(yàn)。全書(shū)共分14章,1~6章介紹網(wǎng)絡(luò)通信編程,是網(wǎng)絡(luò)游戲設(shè)計(jì)的基礎(chǔ);7~12章介紹如何用UML對(duì)網(wǎng)絡(luò)游戲進(jìn)行可視化建模;第13章介紹如何用Visual C++編寫(xiě)有一定難度的客戶(hù)端程序;第14章介紹如何使用數(shù)據(jù)庫(kù)管理游戲數(shù)據(jù)。由于本書(shū)重點(diǎn)在于介紹網(wǎng)絡(luò)游戲整體框架的建模和編程,所以在講解時(shí)只給出了編程思想和實(shí)現(xiàn)的過(guò)程,并沒(méi)有提供全部實(shí)現(xiàn)過(guò)程的源程序,但提供了關(guān)鍵的實(shí)現(xiàn)代碼和設(shè)計(jì)類(lèi)框圖。使你對(duì)網(wǎng)絡(luò)游戲編程有較深入的理解。本書(shū)適用于軟件工程師、網(wǎng)絡(luò)程序員、計(jì)算機(jī)軟件專(zhuān)業(yè)和網(wǎng)絡(luò)專(zhuān)業(yè)的學(xué)生,以及從事網(wǎng)絡(luò)游戲開(kāi)發(fā)的程序設(shè)計(jì)人員。
書(shū)名:Visual C++游戲設(shè)計(jì)(第二版)
作者:榮欽科技
說(shuō)明:本書(shū)用淺顯生動(dòng)的語(yǔ)言、經(jīng)典的案例帶領(lǐng)您進(jìn)入游戲設(shè)計(jì)的美妙世界,幫助您實(shí)現(xiàn)開(kāi)發(fā)游戲的夢(mèng)想。書(shū)中參照開(kāi)發(fā)大型游戲《仙劍奇?zhèn)b傳》所需要的技術(shù),如:鏤空動(dòng)畫(huà)、半透明動(dòng)畫(huà)、碰撞檢測(cè)、斜角卷動(dòng)的地圖、人工智能、3D動(dòng)畫(huà)、3D音效等,對(duì)游戲的設(shè)計(jì)和開(kāi)發(fā)過(guò)程進(jìn)行了系統(tǒng)而又詳細(xì)的介紹。使您能清楚地了解游戲設(shè)計(jì)過(guò)程中的各種知識(shí),包括Visual C++的基本操作、游戲畫(huà)面的坐標(biāo)系統(tǒng)、規(guī)劃游戲的主要架構(gòu),以及使用DirectX來(lái)設(shè)計(jì)3D游戲等。本書(shū)理論與實(shí)例并重,講述了多種游戲設(shè)計(jì)的思想和技巧,適合作為游戲程序設(shè)計(jì)愛(ài)好者和新鮮人士閱讀,也可供多媒體開(kāi)發(fā)人員參考使用。
書(shū)名:PC游戲編程(網(wǎng)絡(luò)游戲篇)
譯者:CG實(shí)驗(yàn)室/王鑫/羅金海/趙千里
說(shuō)明:本書(shū)的作者都是第一線(xiàn)的網(wǎng)絡(luò)游戲開(kāi)發(fā)人員,書(shū)中的所有內(nèi)容都整理自完整的網(wǎng)絡(luò)游戲項(xiàng)目,是實(shí)踐經(jīng)驗(yàn)的總結(jié)。第二章到第十四章的內(nèi)容,基本是從一個(gè)多人在線(xiàn)冒險(xiǎn)型網(wǎng)絡(luò)游戲項(xiàng)目中整理而來(lái),第十五章則整理于一個(gè)即時(shí)戰(zhàn)略游戲項(xiàng)目。在內(nèi)容的講述中盡量避免了和具體游戲內(nèi)容的關(guān)聯(lián),以便更具有通用性。本書(shū)的目標(biāo)是幫助讀者掌握常見(jiàn)類(lèi)型的網(wǎng)絡(luò)游戲的開(kāi)發(fā)環(huán)境、流程、關(guān)鍵制作技術(shù)、方法和技巧,讀者通過(guò)學(xué)習(xí)和實(shí)踐甚至可以成為專(zhuān)業(yè)的網(wǎng)絡(luò)游戲程序設(shè)計(jì)師。本書(shū)面向的讀者對(duì)象主要是有一定編程經(jīng)驗(yàn),并對(duì)制作網(wǎng)絡(luò)游戲很有興趣的愛(ài)好者或者是有單機(jī)游戲設(shè)計(jì)經(jīng)驗(yàn),正在向網(wǎng)絡(luò)游戲轉(zhuǎn)達(dá)型的程序設(shè)計(jì)師。同時(shí)對(duì)于非程序開(kāi)發(fā),但對(duì)網(wǎng)絡(luò)游戲項(xiàng)目很有興趣的朋友也是很好的參考書(shū)。
書(shū)名:Visual C++ 游戲設(shè)計(jì)入門(mén)
作者:普悠久瑪數(shù)位科技
說(shuō)明:Visual C++ 6.0是目前電腦游戲界開(kāi)發(fā)游戲程序的最佳工具,它用傳統(tǒng)優(yōu)良的C++語(yǔ)言配合Visual C++6.0集成開(kāi)發(fā)環(huán)境來(lái)設(shè)計(jì)游戲程序,不論在開(kāi)發(fā)的速度還是在運(yùn)行的性能上,都有最優(yōu)異的表現(xiàn)! 本書(shū)由淺入深地以MFC的程序架構(gòu)來(lái)說(shuō)明各種與游戲設(shè)計(jì)相關(guān)的技巧,使初學(xué)者能夠輕松地掌握游戲設(shè)計(jì)的基本理論和實(shí)現(xiàn)技巧。通過(guò)難度適中的實(shí)例,引領(lǐng)讀者逐步進(jìn)入游戲設(shè)計(jì)的殿堂,從而分享筆者在游戲設(shè)計(jì)過(guò)程中的心得,即使是游戲程序設(shè)計(jì)生手的您,也能夠探尋設(shè)計(jì)的奧妙! 本書(shū)適用于電腦游戲編程的初學(xué)者。
名:進(jìn)階實(shí)戰(zhàn)3DS MAX角色設(shè)計(jì)及游戲開(kāi)發(fā)
作者:傅富垣
說(shuō)明:本書(shū)屬于《技勝e籌》系列叢書(shū),是以我國(guó)臺(tái)灣版的相應(yīng)圖書(shū)為藍(lán)本改編而成。在隨書(shū)附贈(zèng)的光盤(pán)中,包含了本書(shū)學(xué)習(xí)時(shí)所需的文件:模型(場(chǎng)景)文件、材質(zhì)、紋理貼圖、免費(fèi)Plug-In程序和游戲引擎等。本書(shū)共分兩篇,分別介紹了一些相關(guān)的高級(jí)概念;使用3DS MAX時(shí)的應(yīng)用技巧,制作人物模型;如何利用免費(fèi)的Plug-In(插件)程序,制作人物臉部的紋理貼圖;如何使用3DS MAX內(nèi)置的骨骼系統(tǒng)(Bones),制作角色動(dòng)畫(huà);如何使用3DS MAX及Character Studio,以及如何將動(dòng)態(tài)人物導(dǎo)入到游戲引擎中等內(nèi)容。本書(shū)非常適合3DS MAX 的入門(mén)用戶(hù)以及培訓(xùn)班的學(xué)員,同時(shí)也是進(jìn)階用戶(hù)不可缺少的參考書(shū)。
書(shū)名:3DS MAX角色動(dòng)畫(huà)和游戲制作教程
作者:天一工作室
說(shuō)明:本教程本著理論結(jié)合實(shí)際的原則,使用生動(dòng)的實(shí)例教學(xué)法,詳述如何使用3ds max 4制作角色動(dòng)畫(huà)和游戲的方法和技巧。本教程共分為18章,每章都包含一個(gè)完整的實(shí)例,從不同角度針對(duì)不同的應(yīng)用講述3ds max 4不同的功能和應(yīng)用技巧。主要內(nèi)容包括:低多邊形角色建模,面片角色建模,角色的材質(zhì)和貼圖創(chuàng)建骨骼,反向動(dòng)力學(xué),皮膚和彈性修改器,角色的行走姿勢(shì),口形同步和面部表情,制作游戲中的建筑物、太空船動(dòng)畫(huà)和爆炸效果,創(chuàng)建煙霧、噴水、太陽(yáng),使用特殊建模工具、約束與控制器、新的渲染功能和“經(jīng)典實(shí)例——風(fēng)云”。對(duì)初學(xué)者來(lái)說(shuō),本教程圖文并茂、循序漸進(jìn)、范例精美,易于理解。對(duì)于3ds max的老用戶(hù)來(lái)說(shuō),通過(guò)學(xué)習(xí)本版作品能掌握許多功能應(yīng)用過(guò)程中的技巧。本教程自始至終都注重理論講解和實(shí)際操作相結(jié)合,把3ds max 4.O的功能融匯貫通到實(shí)際操作之中,同時(shí)注重對(duì)關(guān)鍵步驟的操作技巧作及時(shí)、精辟的講解。本教程適合于各種層次的3D設(shè)計(jì)人員及3ds max愛(ài)好者學(xué)習(xí),也可以作為3ds max 4. 0的培訓(xùn)教材。 本版CD內(nèi)容為本教程文件。
書(shū)名:Visual Basic 游戲編程21天自學(xué)通
原名:Sams Teach Yourself Game with Visual Basic
說(shuō)明:本書(shū)以三周的學(xué)習(xí)計(jì)劃,21天的課時(shí)按排,教你學(xué)會(huì)使用Visual Basic編寫(xiě)自己的游戲程序的方法和技巧。全書(shū)從介紹游戲編程的基本知識(shí)和編制簡(jiǎn)單的游戲程序入手,通過(guò)豐富的示例和作者提供的示例源代碼,學(xué)習(xí)游戲編程的藝術(shù)、調(diào)用,游戲屏幕繪制、文本繪制、編寫(xiě)游戲算法、圖片顯示、播放動(dòng)畫(huà)、聲音效果以及游戲程序檢測(cè)等一系列從設(shè)計(jì)到編制的全部工程;學(xué)習(xí)編制實(shí)時(shí)游戲,為RPG游戲創(chuàng)建編輯器等高級(jí)技術(shù),從專(zhuān)家級(jí)的游戲編制經(jīng)驗(yàn)中學(xué)會(huì)使用VB達(dá)到創(chuàng)建自己富有吸引力的作品。本書(shū)面向有一定VB基礎(chǔ)的用戶(hù),從自學(xué)的特點(diǎn)來(lái)編寫(xiě)。你可以一章一章逐步學(xué)習(xí)也可以選擇你最感興趣的章節(jié)來(lái)學(xué)習(xí)。
書(shū)名:C游戲編程從入門(mén)到精通
作者:浦濱
說(shuō)明:本書(shū)以C語(yǔ)言游戲編程入門(mén),以102個(gè)實(shí)例,近200個(gè)函數(shù)較為系統(tǒng)地介紹了C基于游戲編程與開(kāi)發(fā)的力法與技巧,內(nèi)容豐富并相互包容,相互滲透。以實(shí)際的基于不同平臺(tái)的游戲制作為背景,知識(shí)闡述與實(shí)際案例結(jié)合,深入淺出,具體、直觀、全面,可操作性強(qiáng);是一本難得的集入門(mén)、深入到精通C游線(xiàn)編程的綜合書(shū)籍。該書(shū)將計(jì)算機(jī)及大量相關(guān)專(zhuān)業(yè)課程的知識(shí)運(yùn)用到C語(yǔ)言游戲編程的實(shí)踐中,并從C語(yǔ)言游線(xiàn)編程實(shí)踐角度來(lái)詮釋計(jì)算機(jī)及許多其他專(zhuān)業(yè)課題,內(nèi)容涉及計(jì)算機(jī)硬件、軟件等方面的編程技術(shù)。具體內(nèi)容包括,圖形繪制、中文顯示、動(dòng)畫(huà)實(shí)現(xiàn)、文件調(diào)用、內(nèi)存使用、聲卡調(diào)用、中斷、內(nèi)存駐留技術(shù)、接口技術(shù)、數(shù)據(jù)庫(kù)實(shí)現(xiàn)、簡(jiǎn)單病毒、界面技術(shù)等進(jìn)行了詳盡的介紹,并且配以大量的源程序以及程序分析對(duì)所涉及的理論進(jìn)行充分的講解和支撐。
書(shū)名:PC游戲編程(入門(mén)篇)
作者:林鵬 戴波 袁霜霽
說(shuō)明:第一章 基石 1. 1 BOSS登場(chǎng)--GAF簡(jiǎn)介第二章 2D圖形程式初體驗(yàn) 2.l 飲水思源--第一個(gè)"游戲"程式 2.2 知其所以然一一2D圖形學(xué)基礎(chǔ) 2.3 進(jìn)入圖形世界的鑰匙--GAFDDraw 2.4 2D圖像的本質(zhì)--圖層表面 2.5 場(chǎng)景的秘密--背景卷動(dòng) 2.6 誘惑--來(lái)自"精靈"的問(wèn)候 2.7 餐后甜點(diǎn)--GAFApp/GAFDDraw的其他法寶第三章塞壬的歌聲魔力和第三類(lèi)接觸 3.1 1,2,3--計(jì)算機(jī)音樂(lè)概述 3.2 塞壬的歌聲--音效程式的魔力 3.3 專(zhuān)業(yè)伴奏--掌握MIDI 3.4 第三類(lèi)接觸--和玩家打交道第四章 打造自己的PRG傳奇 4.l 九種武器--RPG游戲程式框架 4.2 魔法書(shū)的封面--標(biāo)題畫(huà)面和其他 4.3 創(chuàng)世界--場(chǎng)景的生死輪回 4.4 永遠(yuǎn)的主角--NPC和大魔王 4.5 魔法咒語(yǔ)--劇情和腳本 4.6 泰斯叔叔的袋子--RPG的道具箱 4.7 英雄的宿命--戰(zhàn)斗 4.8 傳說(shuō)的終結(jié)--人定勝天第五章 好風(fēng)借力 更上層樓 5.l 思維的底層--人工智能入門(mén) 5.2 虛擬的現(xiàn)實(shí)--走進(jìn)3D世界第六章技巧完美篇 6.1 與數(shù)據(jù)共舞--游戲程序優(yōu)化技巧 6.2 站在別人的肩上--常用開(kāi)發(fā)庫(kù)使用介紹附錄一 GAFApp類(lèi)接口簡(jiǎn)明參考附錄二 GAFDDraw類(lèi)接口簡(jiǎn)明參考附錄三 GAFDInput類(lèi)接口簡(jiǎn)明參考附錄四游戲編程/制作
希望對(duì)你有幫助..祝你學(xué)業(yè)有成!
安卓厲害的五子棋?
其實(shí)在電腦出現(xiàn)之前,五子棋的玩家就發(fā)現(xiàn)黑棋采取某些開(kāi)局贏面極大,實(shí)踐中白棋幾種很強(qiáng)的防守都無(wú)法阻擋黑棋最終贏,也懷疑有先手“絕對(duì)”必勝的方法。但這不能保證可能遺漏了某種白棋能贏的方式,所以二十世紀(jì)初五子棋的普遍的觀點(diǎn)是黑棋應(yīng)該是必勝,但近百年年都沒(méi)有人能夠真正“證明”出來(lái)白棋無(wú)論怎么下都是必?cái)〉摹@個(gè)結(jié)論最終還是通過(guò)電腦來(lái)嚴(yán)格證明的。
其中1992年Victor Allis通過(guò)編程證明不帶禁手的五子棋,黑必勝的,文章地址在這里: Wagner第一次證明的帶禁手的五子棋,也是黑必勝的,文章地址在這里: 更新:目前花月、浦月、云月、雨月、峽月、溪月、金星、水月、寒星、明星、嵐月、新月、名月,山月,殘?jiān)露际俏迨謨纱虮貏伲话阍趲装僬鬃笥?,可以用renlib軟件打開(kāi),所謂地毯譜的意思就是黑棋會(huì)指定下法,但白棋每一步都可以選擇棋盤(pán)任意位置,最后黑棋必勝。也就是說(shuō),只要按照此棋譜下棋,五子棋世界冠軍都一定會(huì)輸給你。
五子棋軟件設(shè)計(jì)
/*********************************************************************************
加分才能得到更多的回答呀!
游戲說(shuō)明
1.本五子棋規(guī)則遵循一般五子棋游戲規(guī)則。
2.'W',',S','A','D'分別對(duì)應(yīng)與光標(biāo)的上、下、左、右?!癊nter”為落子鍵.且在
游戲當(dāng)中雙方必須分時(shí)復(fù)用。
3.本代碼在Turboc 2.0 SMALL模式下調(diào)試通過(guò)。
4.如果要單獨(dú)運(yùn)行該代碼生成的EXE文件,請(qǐng)確保Turboc 2.0系統(tǒng)自帶的*.BGI與
該EXE在同一目錄下,以便圖形系統(tǒng)的正常運(yùn)行。
*********************************************************************************/
#include <graphics.h>
#include <stdio.h>
#include <dos.h>
/*******************************全程變量****************************************/
#define HORIZON 150
#define VERTICAL 30
#define MAXX 15
#define MAXY 15
int curx=HORIZON,cury=VERTICAL;
char C='';
int AOrB=0;
int state[MAXY][MAXX]; /*state[][]為紅白方狀態(tài):1為紅方,2為白方.*/
/*******************************************************************************/
struct Offset
{
int abs;
int array;
int offset;
int state;
};
struct XYPoint
{
int x;
int y;
};
struct WinPoint
{
struct XYPoint pointXY[5];
char win;
};
char getkey()
{
union REGS regs;
regs.h.ah=0;
return int86(0x16,?s,?s);
}
void (int color)
{
int tmpcolor=0,i=0;
tmpcolor=getcolor();
setcolor(color);
for(i=0;i<16;i++)
line(20,190+i,100,190+i);
setcolor(tmpcolor);
}
void (char ch)
{
setcolor(WHITE);
outtextxy(20,50,"W");
outtextxy(20,80,"S");
outtextxy(20,110,"A");
outtextxy(20,140,"D");
setcolor(LIGHTBLUE);
switch(ch)
{
case 'A':
case 'a':
outtextxy(20,110,"A");
break;
case 'D':
case 'd':
outtextxy(20,140,"D");
break;
case 'S':
case 's':
outtextxy(20,80,"S");
break;
case 'W':
case 'w':
outtextxy(20,50,"W");
break;
}
}
void InterFace(void)
{
int i;
char *tp=NULL;
tp="W: up";
outtextxy(20,50,tp);
tp="S: down";
outtextxy(20,80,tp);
tp="A: left";
outtextxy(20,110,tp);
tp="D: Right";
outtextxy(20,140,tp);
tp="Current:";
outtextxy(20,170,tp);
(WHITE);
for(i=0;i<MAXX;i++)
line(HORIZON,i*30+VERTICAL,HORIZON+420,i*30+VERTICAL);
for(i=0;i<MAXY;i++)
line(HORIZON+i*30,VERTICAL,HORIZON+i*30,420+VERTICAL);
}
void (int x,int y,int radius,int colour)
{
int i;
setcolor(colour);
for(i=0;i<radius;i++)
circle(x,y,i);
}
void DrawLine(int x,int y,int xx,int yy,int col)
{
int tmpcolour=0;
tmpcolour=getcolor();
setcolor(col);
line(x,y,xx,yy);
setcolor(tmpcolour);
}
void SetCursor(int x1,int y1,int col)
{
DrawLine(curx-14+x1,cury-14+y1,curx-4+x1,cury-14+y1,col);
DrawLine(curx+4+x1,cury-14+y1,curx+14+x1,cury-14+y1,col);
DrawLine(curx-14+x1,cury-14+y1,curx-14+x1,cury-4+y1,col);
DrawLine(curx+14+x1,cury-14+y1,curx+14+x1,cury-4+y1,col);
DrawLine(curx-14+x1,cury+14+y1,curx-4+x1,cury+14+y1,col);
DrawLine(curx+4+x1,cury+14+y1,curx+14+x1,cury+14+y1,col);
DrawLine(curx-14+x1,cury+4+y1,curx-14+x1,cury+14+y1,col);
DrawLine(curx+14+x1,cury+4+y1,curx+14+x1,cury+14+y1,col);
}
/*struct Offset
{
int abs; curx,cury
int array; x,y
int offset; x1,y1
int state; 0表示:無(wú)空位;1表示:有空位
};*/
/*Test Vertical*/
/*Test x Y Or N Space*/
int (int y)
{
int i=0,sum=1;
for(i=0;i<MAXY;i++)
{
sum&=(1==state[i][y]||2==state[i][y]);
if(!sum)break;
}
return(sum);
/*sum==0表示該行列沒(méi)有空位*/
}
/*Go Left*/
struct Offset * (int y,struct Offset * pointer)
{
int i=0,sum=1;
for(i=y-1;i>=0;i--)
{
sum=(i);
if(!sum)break;
}
if(sum)
{/*表示該點(diǎn)左邊已沒(méi)有空位*/
pointer->abs=0;
pointer->array=0;
pointer->offset=0;
pointer->state=0;/*若為0,表示無(wú)空位*/
}
else
{
pointer->abs=(30)*(y-i);
pointer->array=y-i;
pointer->offset=(30)*(y-i);
pointer->state=1;/*若為1,表示有空位*/
}
return(pointer);
}
/*Go Right*/
struct Offset * (int y,struct Offset * pointer)
{
int i=0,sum=1;
for(i=y+1;i<MAXX;i++)
{
sum=(i);
if(!sum)break;
}
if(sum)
{
pointer->abs=0;
pointer->array=0;
pointer->offset=0;
pointer->state=0;/*若為0,表示無(wú)空位*/
}
else
{
pointer->abs=(30)*(i-y);
pointer->array=i-y;
pointer->offset=(30)*(i-y);
pointer->state=1;/*若為1,表示有空位*/
}
return(pointer);
}
/*Test y Y Or N Space*/
int (int x)
{
int i=0,sum=1;
for(i=0;i<MAXX;i++)
{
sum&=(1==state[x][i]||2==state[x][i]);
if(!sum)break;
}
return(sum);
}
/*Go Up*/
struct Offset * (int x,struct Offset * pointer)
{
int i=0,sum=1;
for(i=x-1;i>=0;i--)
{
sum=(i);
if(!sum)break;
}
if(sum)
{
pointer->abs=0;
pointer->array=0;
pointer->offset=0;
pointer->state=0;/*若為0,表示無(wú)空位*/
}
else
{
pointer->abs=(30)*(x-i);
pointer->array=x-i;
pointer->offset=(30)*(x-i);
pointer->state=1;/*若為1,表示有空位*/
}
return(pointer);
}
/*Go Down*/
struct Offset * (int x,struct Offset * pointer)
{
int i=0,sum=1;
for(i=x+1;i<MAXY;i++)
{
sum=(i);
if(!sum)break;
}
if(sum)
{
pointer->abs=0;
pointer->array=0;
pointer->offset=0;
pointer->state=0;/*若為0,表示無(wú)空位*/
}
else
{
pointer->abs=(30)*(i-x);
pointer->array=i-x;
pointer->offset=(30)*(i-x);
pointer->state=1;/*若為1,表示有空位*/
}
return(pointer);
}
void (struct Offset * pointer)
{
pointer->abs=0;
pointer->array=0;
pointer->offset=0;
pointer->state=0;
}
void Delay(int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<32767;j++);
}
/*Move Cursor*/
void (struct XYPoint *PointXY)
{
int x1=0,y1=0,lop=1,x=0,y=0; /*x1,y1為光標(biāo)在各方向的偏移量*/
struct Offset ,*point=NULL;
point=&;
(point);
x=(curx-HORIZON)/30; /*(x,y)為STATE[][]數(shù)組坐標(biāo)*/
y=(cury-VERTICAL)/30;
while(lop)
{
C=getkey();
switch(C)
{
case 'A':
case 'a':
(C);
if(curx>HORIZON)
{
point=(x,point);
if(point->state)
{
curx-=point->abs;
x-=point->array;
x1+=point->offset;
(point);
}
}
break;
case 'D':
case 'd':
(C);
if(curx<420+HORIZON)
{
point=(x,point);
if(point->state)
{
curx+=point->abs;
x+=point->array;
x1-=point->offset;
(point);
}
}
break;
case 'W':
case 'w':
(C);
if(cury>VERTICAL)
{
point=(y,point);
if(point->state)
{
cury-=point->abs;
y-=point->array;
y1+=point->offset;
(point);
}
}
break;
case 'S':
case 's':
(C);
if(cury<VERTICAL+420)
{
point=(y,point);
if(point->state)
{
cury+=point->abs;
y+=point->array;
y1-=point->offset;
(point);
}
}
break;
case 13 : /*落子:AOrB==0 RED;AOrB==1 WHITE*/
if(!(state[y][x]&0x3))
{
if(1==AOrB)
{
state[y][x]|=0x1;
(curx,cury,15,RED);
AOrB=0;
(WHITE);
}
else
{
state[y][x]|=0x2;
(curx,cury,15,WHITE);
AOrB=1;
(RED);
}
lop=0;
PointXY->x=x;
PointXY->y=y;
}
break;
}
SetCursor(x1,y1,()); /*clear old*/
x1=0;
y1=0;
SetCursor(0,0,BLUE);
}
}
/*Example: (60+cou*30,20,'H',30,WHITE);*/
void (int x,int y,char way,int offset,int colour)
{
int tmp=0;
for(tmp=0;tmp<15;tmp++)
(x,y,15,());
DrawLine(x-15,y,x+15,y,WHITE);
DrawLine(x,y,x,y+15,WHITE);
switch(way)
{
case 'h':
case 'H':
(x+offset,y,15,colour);
break;
case 'v':
case 'V':
(x,y+offset,15,colour);
}
}
void DrawRLine(int x,int y)
{
if(x> HORIZON)
DrawLine(x-15,y,x,y,WHITE); /*Left*/
if(x<30*14+HORIZON)
DrawLine(x,y,x+15,y,WHITE); /*Right*/
if(y>VERTICAL)
DrawLine(x,y-15,x,y,WHITE); /*Up*/
if(y<30*14+VERTICAL)
DrawLine(x,y,x,y+15,WHITE); /*Down*/
}
void (struct WinPoint win)
{
int i=0,color=0,count=0,EXIT=0;
/*(curx,cury,15,RED)*/
switch(AOrB)
{
case 0: /*AOrB==0 RED*/
color=RED;
break;
case 1: /*AOrB==1 WHITE*/
color=WHITE;
break;
}
while(1)
{
if(count)
{
(HORIZON+30*win.pointXY[0].x,VERTICAL+30*win.pointXY[0].y,15,());
DrawRLine( HORIZON+30*win.pointXY[0].x,VERTICAL+30*win.pointXY[0].y);
(HORIZON+30*win.pointXY[1].x,VERTICAL+30*win.pointXY[1].y,15,());
DrawRLine( HORIZON+30*win.pointXY[1].x,VERTICAL+30*win.pointXY[1].y);
(HORIZON+30*win.pointXY[2].x,VERTICAL+30*win.pointXY[2].y,15,());
DrawRLine( HORIZON+30*win.pointXY[2].x,VERTICAL+30*win.pointXY[2].y);
(HORIZON+30*win.pointXY[3].x,VERTICAL+30*win.pointXY[3].y,15,());
DrawRLine( HORIZON+30*win.pointXY[3].x,VERTICAL+30*win.pointXY[3].y);
(HORIZON+30*win.pointXY[4].x,VERTICAL+30*win.pointXY[4].y,15,());
DrawRLine( HORIZON+30*win.pointXY[4].x,VERTICAL+30*win.pointXY[4].y);
}
else
{
(HORIZON+30*win.pointXY[0].x,VERTICAL+30*win.pointXY[0].y,15,color);
(HORIZON+30*win.pointXY[1].x,VERTICAL+30*win.pointXY[1].y,15,color);
(HORIZON+30*win.pointXY[2].x,VERTICAL+30*win.pointXY[2].y,15,color);
(HORIZON+30*win.pointXY[3].x,VERTICAL+30*win.pointXY[3].y,15,color);
(HORIZON+30*win.pointXY[4].x,VERTICAL+30*win.pointXY[4].y,15,color);
}
Delay(1000);
if(5==i)
{
i=0;
if(count)
count=0;
else
count=1;
}
i++;
EXIT++;
if(105==EXIT)break;
}
}
void (int pointer[MAXY][MAXX])
{
int i,j;
for(i=0;i<MAXY;i++)
for(j=0;j<MAXX;j++)
{
*(*(pointer+i)+j)=0;
}
}
/*Test WIN*/
struct WinPoint TestWIN(int Tmp,struct WinPoint ,struct XYPoint * PointXY)
{
int i=0,j=0,s=Tmp;
.win=0;
for(i=0;i<5;i++)
{
if(PointXY->x+i>=4 && PointXY->x+i <15)
{
for(Tmp=s,j=4;j>=0;j--)/*0度*/
{
.pointXY[j].x=PointXY->x+i-j;
.pointXY[j].y=PointXY->y;
Tmp&=state[PointXY->y][PointXY->x+i-j];
}
if(Tmp)
{
.win=1;
break;
}
}
if(PointXY->x-i>=0 && PointXY->x-i <11 && PointXY->y+i>=4 && PointXY->y+i <15)
{
for(Tmp=s,j=4;j>=0;j--)/*45度*/
{
.pointXY[j].x=PointXY->x-i+j;
.pointXY[j].y=PointXY->y+i-j;
Tmp&=state[PointXY->y+i-j][PointXY->x-i+j];
/*printf(" %d",state[PointXY->y+i-j][PointXY->x+i+j]);*/
}
if(Tmp)
{
.win=1;
break;
}
}
if(PointXY->y+i>=4 && PointXY->y+i <15)
{
for(Tmp=s,j=4;j>=0;j--)/*90度*/
{
.pointXY[j].x=PointXY->x;
.pointXY[j].y=PointXY->y+i-j;
Tmp&=state[PointXY->y+i-j][PointXY->x];
}
if(Tmp)
{
.win=1;
break;
}
}
if(PointXY->x+i>=4 && PointXY->x+i <15 && PointXY->y+i>=4 && PointXY->y+i <15)
{
for(Tmp=s,j=4;j>=0;j--)/*135度*/
{
.pointXY[j].x=PointXY->x+i-j;
.pointXY[j].y=PointXY->y+i-j;
Tmp&=state[PointXY->y+i-j][PointXY->x+i-j];
}
if(Tmp)
{
.win=1;
break;
}
}
}
return();
}
/*Test Win Y or N*/
struct WinPoint Test_Win_YorN(struct XYPoint * PointXY)
{
struct WinPoint ;
.win=0;
switch(AOrB)
{
case 0: /*AOrB==0 RED*/
=TestWIN(1,,PointXY);
break;
case 1: /*AOrB==1 WHITE*/
=TestWIN(2,,PointXY);
break;
}
return();
}
main()
{
int driver,mode,NoWiner=1;
struct XYPoint CurrentXY;
struct WinPoint WIN;
START:
driver=DETECT;
mode=0;
(&driver,&mode);
initgraph(&driver,&mode,"");
InterFace();
(state);
CurrentXY.x=0;
CurrentXY.y=0;
SetCursor(0,0,BLUE);
while(NoWiner)
{
(&CurrentXY);
WIN=Test_Win_YorN(&CurrentXY);
if(WIN.win)break;
}
(WIN);
setcolor(WHITE);
outtextxy(280,215,"CONTINUE ?[Y/N]");
C=getkey();
if('Y'==C ||'y'==C)
{
C='';
goto START;
}
}
求經(jīng)典小游戲(五子棋 貪吃蛇 俄羅斯方塊等)c++ 源代碼。最好能有軟件設(shè)計(jì)過(guò)程 我想學(xué)思路
這有一個(gè)最簡(jiǎn)單的貪吃蛇的控制過(guò)程。
一般對(duì)于此類(lèi)的游戲,都分為控制算法,顯示算法,判定算法等幾個(gè)大部分。
供參考:
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <time.h> //使用當(dāng)前時(shí)間做種子;
enum dir{up,down,left,right}; //枚舉類(lèi)型enum dir;
//圍墻;
void InitFence();
void OutputF();
char game[20][20];
//畫(huà)框框;
void InitFence(){
int i,j;
for(i=0; i<20; i++)
for(j=0; j<20; j++){
if(i==0||i==19||j==0||j==19)
game[i][j]= '*';
else game[i][j]= ' ';
}
}
//顯示框框;
void OutputF(){
int i,j;
for(i=0; i<20; i++){
for(j=0; j<20; j++)
printf("%c ",game[i][j]);
printf("\n");
}
}
//蛇結(jié)點(diǎn);
struct SnakeNode{
int x,y;
struct SnakeNode *prior,*next;
}*head=NULL, *tail =NULL;
void add_head(int x,int y);
int get_x(struct SnakeNode *p);
int get_y(struct SnakeNode *p);
void delete_tail();
//插入頭結(jié)點(diǎn);
void add_head(int x,int y){
struct SnakeNode *q= (struct SnakeNode *)malloc(sizeof(struct SnakeNode));
q->x =x; q->y =y;
q->next =head;
q->prior =NULL;
if(head) head->prior =q;
head =q;
if(!tail) tail =head;
game[x][y]= '*'; //f對(duì)象可以在定義Fence類(lèi)時(shí)定義; 且Fence類(lèi)在SnakeNode類(lèi)前定義;
}
int get_x(struct SnakeNode *p){
return p->x;
}
int get_y(struct SnakeNode *p){
return p->y;
}
//刪除尾結(jié)點(diǎn);
void delete_tail(){
struct SnakeNode *p =tail;
game[get_x(tail)][get_y(tail)]= ' ';//把尾結(jié)點(diǎn)的坐標(biāo)表示的'*'置為空格;
if(tail==head)
tail= head= NULL;
else{
tail= tail->prior;
tail->next= NULL;
}
free(p);
}
//move移動(dòng);
struct move{
enum dir point; //枚舉變量point: 控制方向;
int food_x;
int food_y;
};
void moving(struct move *m);
void change_point(char,struct move *m); //改變方向;
void get_food(struct move *m);
void get_food(struct move *m){
srand((unsigned int) time(NULL)); //做種子(程序運(yùn)行時(shí)間);
m->food_x= rand()%18+1;
m->food_y= rand()%18+1;
game[m->food_x][m->food_y]= '*';
}
void moving(struct move *m){
int a,b;
a= get_x(head); //取得頭結(jié)點(diǎn)橫坐標(biāo)
b= get_y(head); //頭結(jié)點(diǎn)縱坐標(biāo)
switch(m->point){
case up: --a; break;
case down: ++a; break;
case left: --b; break;
case right: ++b; break;
}
if(a==19||b==19||a==0||b==0){ //判斷是否撞墻;
printf("game over!!!\n");
exit(0);
}
if(a==m->food_x && b==m->food_y){ //吃food;
add_head(a,b);
get_food(m);
}
else{
add_head(a,b); //插入頭結(jié)點(diǎn);
delete_tail(); //刪除尾結(jié)點(diǎn);
}
}
void change_point(char keydown,struct move *m){
switch(keydown){
// case 'w': m->point= up; break;
// case 's': m->point= down; break;
// case 'a': m->point= left; break;
// case 'd': m->point= right; break;
case 72: m->point= up; break;
case 80: m->point= down; break;
case 75: m->point= left; break;
case 77: m->point= right; break;
}
}
//main();
int main(){
struct move m;
printf("Using 'w,s,a,d'to control direction!!!\n\n\n");
InitFence();
add_head(4,3);
add_head(4,4);
add_head(4,5);
get_food(&m);
OutputF();
while (1){
char keydown= getch(); //getch()返回鍵盤(pán)上讀取的字符;包含頭文件<conio.h>
change_point(keydown,&m);
while(!kbhit()){ //判斷有沒(méi)有按鍵落下;
system("cls"); //清屏函數(shù);
moving(&m);
OutputF();
Sleep(200);
}
}
return 0;
}
五子棋黑石軟件的運(yùn)用
五子棋 是一種兩人對(duì)弈的純策略型棋類(lèi)游戲,通常雙方分別使用黑白兩色的棋子,下面我給你介紹五子棋黑石軟件的運(yùn)用,歡迎閱讀。
熟悉運(yùn)用黑石軟件
分析完了之前的幾個(gè)章節(jié),我們將在此章對(duì)軟件做一個(gè)詳細(xì)的分析。之所以要在第六章才提到軟件,因?yàn)橹挥性诹私饬宋遄悠宓囊恍┫嚓P(guān)知識(shí)并掌握基本技巧后,才能更好的運(yùn)用軟件,在對(duì)使用軟件的過(guò)程中出現(xiàn)的各種問(wèn)題才會(huì)一目了然,這也是一個(gè)循序漸進(jìn)的過(guò)程。倘若順序顛倒,過(guò)早的使用軟件,不僅對(duì)自己沒(méi)有幫助,還會(huì)局限自己的思維。
對(duì)五子棋黑石軟件的看法
一些五子棋 愛(ài)好 者口中所謂的“軟”,其實(shí)就是在網(wǎng)絡(luò)五子棋中,借助第三方來(lái)輔助計(jì)算的軟件?;蛟S一些第一次接觸軟件的朋友會(huì)有些納悶,到底軟件是如何幫助我們計(jì)算的?其實(shí)原理很簡(jiǎn)單,假設(shè)我們?cè)诤蛣e人在網(wǎng)絡(luò)上下棋,我們執(zhí)黑,對(duì)方執(zhí)白。當(dāng)對(duì)方落了某一白子,那么,我們?cè)陂_(kāi)啟與軟件對(duì)弈的時(shí)候,就執(zhí)白也下對(duì)方落的那一子,看看軟件的下一手如何應(yīng)對(duì),軟件下哪手,我們就用那手應(yīng)對(duì)對(duì)方。簡(jiǎn)單講,對(duì)方執(zhí)白,你就執(zhí)白,軟件則執(zhí)黑,反之同理,這是一種 逆向思維 的 方法 。
很多人認(rèn)為,用軟件在網(wǎng)絡(luò)對(duì)弈,是一種作弊行為,持反對(duì)態(tài)度,但也有一部分人認(rèn)為軟件的利用能夠更大的開(kāi)發(fā)五子棋的戰(zhàn)術(shù)、思路,持贊同態(tài)度。為此,各人的看法都不同,我們不能把自己的想法強(qiáng)加于任何一個(gè)人身上。在這,我也只能把自己的觀點(diǎn),也就是寫(xiě)這篇 文章 的始末與大家分享,至于是否贊同,就是仁者見(jiàn)仁、智者見(jiàn)智了。
1、想法浮現(xiàn)
有寫(xiě)這文章的想法是在09年的10月份,那時(shí)候回了趟福建,比較清閑,而且自己的水平也到了自己的極限,或者說(shuō)是瓶頸,就有了不再下五子棋的想法了,而且自己不能再耗費(fèi)更多的時(shí)間了在五子棋上。所以,在閑暇之余,偶想起:自己在09年6月份剛接觸網(wǎng)絡(luò)五子棋時(shí),聽(tīng)人說(shuō)很多高手都在用軟,于是,就在網(wǎng)上搜索關(guān)于五子棋軟件的文章,到處找五子棋軟件的下載地址。待到同年7月知曉了大部分的關(guān)于軟件的知識(shí),也下載了各種軟件,自己慢慢摸索。每每想到這些,當(dāng)初的好奇、欣喜、狂熱、執(zhí)著便歷歷在目,更想到的是,如今還有多少人像我當(dāng)初那樣大海撈針?biāo)频乃阉?、研究,倘若?dāng)時(shí)有一篇系統(tǒng)的教人用五子棋軟件的文章該有多好啊,因此,初步有了寫(xiě)這文章的想法。
2、初步定稿
想法有了,回上海后我就開(kāi)始著手準(zhǔn)備,花了近兩個(gè)月的時(shí)間把關(guān)于軟件部分的文章寫(xiě)好,也就是當(dāng)前文章的第六章和第七章,當(dāng)時(shí)好不得意,很有成就感,甚至給這文章取名叫《揭開(kāi)網(wǎng)絡(luò)五子棋高手的面紗》、《網(wǎng)絡(luò)五子棋高手的騙局》等等,多少帶點(diǎn)諷刺的意味,似乎是在對(duì)自己當(dāng)初摸索坎坷的一種不滿(mǎn)和發(fā)泄。
3、偶知錯(cuò)了
初稿寫(xiě)好后,我就開(kāi)始審查,但看得越多,想得也越多,不禁反復(fù)地問(wèn)自己,為何寫(xiě)這篇文章,不僅得不到答案,還覺(jué)得自己有點(diǎn)狹隘了,這篇初稿帶有太強(qiáng)烈的個(gè)人主義了。而后,自己好好的反省了一番, 總結(jié) 出來(lái):存在即真理。五子棋軟件雖然是一種第三方軟件,對(duì)于沒(méi)有用軟件的人來(lái)說(shuō),我們用軟實(shí)際上是一種非公平的對(duì)弈,但是,不可否認(rèn),他帶給我們的幫助是多么巨大。回想自己當(dāng)初是如何在軟件中學(xué)習(xí)到定式,又是怎樣在軟件的幫助下,培養(yǎng)了棋感的,因此,當(dāng)我換了一種心態(tài)去看待軟件的時(shí)候,忽然發(fā)覺(jué),當(dāng)初那種心境多么無(wú)知。
4、翻稿重作
反省過(guò)后,我決定推翻原稿,只保留部分對(duì) 棋譜 的研究。進(jìn)而再花一個(gè)多月的時(shí)間重新撰寫(xiě)。因此,才有了大家看到的這篇文章,增加了很多非軟件的內(nèi)容。