本文目錄一覽:
c語言基礎,求五子棋詳細代碼
/*一個月就想做五子棋,有點難啊,希望你能看懂,這是代碼*/
#include stdlib.h
#include stdio.h
#include conio.h
#include string.h
#define MAXIMUS 15 //定義棋盤大小
int p[MAXIMUS][MAXIMUS];//存儲對局信息
char buff[MAXIMUS*2+1][MAXIMUS*4+3];//輸出緩衝器
int Cx,Cy;//當前光標位置
int Now;//當前走子的玩家,1代表黑,2代表白
int wl,wp;//當前寫入緩衝器的列數和行數位置
char* showText;//在棋盤中央顯示的文字信息
int count;//回合數
char* Copy(char* strDest,const char* strSrc)//修改過的字符串複製函數,會忽略末端的\0
{
char* strDestCopy = strDest;
while (*strSrc!=’\0′)
{
*strDest++=*strSrc++;
}
return strDestCopy;
}
void Initialize()//初始化一個對局函數
{
int i,j;//循環變量
showText=””;//重置顯示信息
count=0;//回合數歸零
for(i=0;iMAXIMUS;i++)//重置對局數據
{
for(j=0;jMAXIMUS;j++)
{
p[i][j]=0;
}
}
Cx=Cy=MAXIMUS/2;//重置光標到中央
Now=1;//重置當前為黑方
}
char* getStyle(int i,int j)//獲得棋盤中指定坐標交點位置的字符,通過製表符拼成棋盤
{
if(p[i][j]==1)//1為黑子
return “●”;
else if(p[i][j]==2)//2為白子
return “○”;
else if(i==0j==0)//以下為邊緣棋盤樣式
return “┏”;
else if(i==MAXIMUS-1j==0)
return “┓”;
else if(i==MAXIMUS-1j==MAXIMUS-1)
return “┛”;
else if(i==0j==MAXIMUS-1)
return “┗”;
else if(i==0)
return “┠”;
else if(i==MAXIMUS-1)
return “┨”;
else if(j==0)
return “┯”;
else if(j==MAXIMUS-1)
return “┷”;
return “┼”;//中間的空位
}
char* getCurse(int i,int j)//獲得指定坐標交點位置左上格的樣式,通過製表符來模擬光標的顯示
{
if(i==Cx)
{
if(j==Cy)
return “┏”;
else if (j==Cy+1)
return “┗”;
}
else if(i==Cx+1)
{
if(j==Cy)
return “┓”;
else if (j==Cy+1)
return “┛”;
}
return “ ”;//如果不在光標附近則為空
}
void write(char* c)//向緩衝器寫入字符串
{
Copy(buff[wl]+wp,c);
wp+=strlen(c);
}
void ln()//緩衝器寫入位置提行
{
wl+=1;
wp=0;
}
void Display()//將緩衝器內容輸出到屏幕
{
int i,l=strlen(showText);//循環變量,中間文字信息的長度
int Offset=MAXIMUS*2+2-l/2;//算出中間文字信息居中顯示所在的橫坐標位置
if(Offset%2==1)//如果位置為奇數,則移動到偶數,避免混亂
{
Offset–;
}
Copy(buff[MAXIMUS]+Offset,showText);//講中間文字信息複製到緩衝器
if(l%2==1)//如果中間文字長度為半角奇數,則補上空格,避免混亂
{
*(buff[MAXIMUS]+Offset+l)=0x20;
}
system(“cls”);//清理屏幕,準備寫入
for(i=0;iMAXIMUS*2+1;i++)//循環寫入每一行
{
printf(“%s”,buff[i]);
if(iMAXIMUS*2)//寫入完每一行需要換行
printf(“\n”);
}
}
void Print()//將整個棋盤算出並儲存到緩衝器,然後調用Display函數顯示出來
{
int i,j;//循環變量
wl=0;
wp=0;
for(j=0;j=MAXIMUS;j++)//寫入出交點左上角的字符,因為需要打印棋盤右下角,所以很以橫縱各多一次循環
{
for(i=0;i=MAXIMUS;i++)
{
write(getCurse(i,j));//寫入左上角字符
if(j==0||j==MAXIMUS)//如果是棋上下盤邊緣則沒有連接的豎線,用空格填充位置
{
if(i!=MAXIMUS)
write(“ ”);
}
else//如果在棋盤中間則用豎線承接上下
{
if(i==0||i==MAXIMUS-1)//左右邊緣的豎線更粗
write(“┃”);
else if(i!=MAXIMUS)//中間的豎線
write(“│”);
}
}
if(j==MAXIMUS)//如果是最後一次循環,則只需要處理邊側字符,交點要少一排
{
break;
}
ln();//提行開始打印交點內容
write(“ ”);//用空位補齊位置
for(i=0;iMAXIMUS;i++)//按橫坐標循環正常的次數
{
write(getStyle(i,j));//寫入交點字符
if(i!=MAXIMUS-1)//如果不在最右側則補充一個橫線承接左右
{
if(j==0||j==MAXIMUS-1)
{
write(“━”);//上下邊緣的橫線更粗
}
else
{
write(“—”);//中間的橫線
}
}
}
ln();//寫完一行後提行
}
Display();//將緩衝器內容輸出到屏幕
}
int Put()//在當前光標位置走子,如果非空,則返回0表示失敗
{
if(p[Cx][Cy]==0)
{
p[Cx][Cy]=Now;//改變該位置數據
return 1;//返回1表示成功
}
else
{
return 0;
}
}
int Check()//勝負檢查,即判斷當前走子位置有沒有造成五連珠的情況
{
int w=1,x=1,y=1,z=1,i;//累計橫豎正斜反邪四個方向的連續相同棋子數目
for(i=1;i5;i++)//向下檢查
if(Cy+iMAXIMUSp[Cx][Cy+i]==Now)
w++;
else
break;
for(i=1;i5;i++)//向上檢查
if(Cy-i0p[Cx][Cy-i]==Now)
w++;
else
break;
if(w=5)//若果達到5個則判斷當前走子玩家為贏家
return Now;
for(i=1;i5;i++)//向右檢查
if(Cx+iMAXIMUSp[Cx+i][Cy]==Now)
x++;
else
break;
for(i=1;i5;i++)//向左檢查
if(Cx-i0p[Cx-i][Cy]==Now)
x++;
else
break;
if(x=5)//若果達到5個則判斷當前走子玩家為贏家
return Now;
for(i=1;i5;i++)//向右下檢查
if(Cx+iMAXIMUSCy+iMAXIMUSp[Cx+i][Cy+i]==Now)
y++;
else
break;
for(i=1;i5;i++)//向左上檢查
if(Cx-i0Cy-i0p[Cx-i][Cy-i]==Now)
y++;
else
break;
if(y=5)//若果達到5個則判斷當前走子玩家為贏家
return Now;
for(i=1;i5;i++)//向右上檢查
if(Cx+iMAXIMUSCy-i0p[Cx+i][Cy-i]==Now)
z++;
else
break;
for(i=1;i5;i++)//向左下檢查
if(Cx-i0Cy+iMAXIMUSp[Cx-i][Cy+i]==Now)
z++;
else
break;
if(z=5)//若果達到5個則判斷當前走子玩家為贏家
return Now;
return 0;//若沒有檢查到五連珠,則返回0表示還沒有玩家達成勝利
}
int RunGame()//進行整個對局,返回贏家信息(雖然有用上)
{
int input;//輸入變量
int victor;//贏家信息
Initialize();//初始化對局
while(1)//開始無限回合的死循環,直到出現勝利跳出
{
Print();//打印棋盤
input=getch();//等待鍵盤按下一個字符
if(input==27)//如果是ESC則退出程序
{
exit(0);
}
else if(input==0x20)//如果是空格則開始走子
{
if(Put())//如果走子成功則判斷勝負
{
victor=Check();
Now=3-Now;//輪換當前走子玩家
count++;
if(victor==1)//如果黑方達到勝利,顯示提示文字並等待一次按鍵,返回勝利信息
{
showText=”黑方獲得了勝利!”;
Print();
if(getch()==0xE0)
{
getch();
}
return Now;
}
else if(victor==2)//如果白方達到勝利,顯示提示文字並等待一次按鍵,返回勝利信息
{
showText=”白方獲得了勝利!”;
Display();
if(getch()==0xE0)
{
getch();
}
return Now;
}
else if(count==MAXIMUS*MAXIMUS)//如果回合數達到了棋盤總量,即棋盤充滿,即為平局
{
showText=”平局!”;
Display();
if(getch()==0xE0)
{
getch();
}
return 0;
}
}
}
else if(input==0xE0)//如果按下的是方向鍵,會填充兩次輸入,第一次為0xE0表示按下的是控制鍵
{
input=getch();//獲得第二次輸入信息
switch(input)//判斷方向鍵方向並移動光標位置
{
case 0x4B:
Cx–;
break;
case 0x48:
Cy–;
break;
case 0x4D:
Cx++;
break;
case 0x50:
Cy++;
break;
}
if(Cx0)//如果光標位置越界則移動到對側
Cx=MAXIMUS-1;
if(Cy0)
Cy=MAXIMUS-1;
if(CxMAXIMUS-1)
Cx=0;
if(CyMAXIMUS-1)
Cy=0;
}
}
}
int main()//主函數
{
system(“title 簡易五子棋 ——Etsnarl製作”);//設置標題
system(“mode con cols=63 lines=32”);//設置窗口大小
system(“color E0”);//設置顏色
while(1)//循環執行遊戲
{
RunGame();
}
return 0;
}
如何用C++編寫五子棋?
通過C++語言來實現一個以windows控制台為展示平台的簡單版五子棋程序,其中通過鍵盤輸入來控制遊戲中的行為(光標移動、落子、確認)。
規則要求某一方在橫豎斜方向連續存在五個或五個以上本人所執棋子獲得為獲勝。當我們要扒一個已存在的程序時(有的是五子棋的程序,可以在互聯網裡找到很多)。
我們可以從他的UI入手,通過我們所觀察到的,所感受到,所使用到的服務,來對軟件進行分析,從而獲得以上流程,但我們一旦需要將需求變為代碼時,我們的設計就要考慮的更多了。
我們可以使用兩個int類型的值來表示:白子- 1,黑子- 2,那麼我們只要在棋盤中更改光標所在位置元素的值為1或2就可以了。
我們回顧一下光標移動的代碼,我們會發現,中進行落子後,我們光標再次移動有可能會改變已記錄的落子信息,為了使光標與棋子不衝突,我們使用兩個圖層,表示兩個相同的棋盤。
c語言五子棋代碼,
package day17.gobang;
import java.util.Arrays;
public class GoBangGame {
public static final char BLANK=’*’;
public static final char BLACK=’@’;
public static final char WHITE=’O’;
public static final int MAX = 16;
private static final int COUNT = 5;
//棋盤
private char[][] board;
public GoBangGame() {
}
//開始遊戲
public void start() {
board = new char[MAX][MAX];
//把二維數組都填充‘*’
for(char[] ary: board){
Arrays.fill(ary, BLANK);
}
}
public char[][] getChessBoard(){
return board;
}
public void addBlack(int x, int y) throws ChessExistException{
//@
//char blank = ‘*’;
//System.out.println( x +”,” + y + “:” + board[y][x] + “,” + BLANK);
if(board[y][x] == BLANK){// x, y 位置上必須是空的才可以添棋子
board[y][x] = BLACK;
return;
}
throw new ChessExistException(“已經有棋子了!”);
}
public void addWhite(int x, int y)
throws ChessExistException{
if(board[y][x] == BLANK){// x, y 位置上必須是空的才可以添棋子
board[y][x] = WHITE;
return;
}
throw new ChessExistException(“已經有棋子了!”);
}
//chess 棋子:’@’/’O’
public boolean winOnY(char chess, int x, int y){
//先找到y方向第一個不是 blank的棋子
int top = y;
while(true){
if(y==0 || board[y-1][x]!=chess){
//如果y已經是棋盤的邊緣, 或者的前一個不是chess
//就不再繼續查找了
break;
}
y–;
top = y;
}
//向回統計所有chess的個數,如果是COUNT個就贏了
int count = 0;
y = top;
while(true){
if(y==MAX || board[y][x]!=chess){
//如果找到頭 或者 下一個子不是chess 就不再繼續統計了
break;
}
count++;
y++;
}
return count==COUNT;
}
//chess 棋子:’@’/’O’
public boolean winOnX(char chess, int x, int y){
//先找到x方向第一個不是 blank的棋子
int top = x;
while(true){
if(x==0 || board[y][x-1]!=chess){
//如果x已經是棋盤的邊緣, 或者的前一個不是chess
//就不再繼續查找了
break;
}
x–;
top = x;
}
//向回統計所有chess的個數,如果是COUNT個就贏了
int count = 0;
x = top;
while(true){
if(x==MAX || board[y][x]!=chess){
//如果找到頭 或者 下一個子不是chess 就不再繼續統計了
break;
}
count++;
x++;
}
return count==COUNT;
}
//chess 棋子:’@’/’O’
public boolean winOnXY(char chess, int x, int y){
//先找MAX向第一個不是 blank的棋子
int top = y;
int left = x;
while(true){
if(x==0 || y==0 || board[y-1][x-1]!=chess){
//如果x已經是棋盤的邊緣, 或者的前一個不是chess
//就不再繼續查找了
break;
}
x–;
y–;
top = y;
left=x;
}
//向回統計所有chess的個數,如果是COUNT個就贏了
int count = 0;
x = left;
y = top;
while(true){
if(x==MAX || y==MAX || board[y][x]!=chess){
//如果找到頭 或者 下一個子不是chess 就不再繼續統計了
break;
}
count++;
x++;
y++;
}
return count==COUNT;
}
//chess 棋子:’@’/’O’
public boolean winOnYX(char chess, int x, int y){
//先找到x方向第一個不是 blank的棋子
int top = y;
int left = x;
while(true){
if(x==MAX-1 || y==0 || board[y-1][x+1]!=chess){
//如果x已經是棋盤的邊緣, 或者的前一個不是chess
//就不再繼續查找了
break;
}
x++;
y–;
top = y;
left=x;
}
//向回統計所有chess的個數,如果是COUNT個就贏了
int count = 0;
x = left;
y = top;
while(true){
if(x==0 || y==MAX || board[y][x]!=chess){
//如果找到頭 或者 下一個子不是chess 就不再繼續統計了
break;
}
count++;
x–;
y++;
}
return count==COUNT;
}
public boolean whiteIsWin(int x, int y) {
//在任何一個方向上贏了,都算贏
return winOnY(WHITE, x, y) ||
winOnX(WHITE, x, y) ||
winOnXY(WHITE, x, y) ||
winOnYX(WHITE, x, y);
}
public boolean blackIsWin(int x, int y) {
return winOnY(BLACK, x, y) ||
winOnX(BLACK, x, y) ||
winOnXY(BLACK, x, y) ||
winOnYX(BLACK, x, y);
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/153007.html