c語言五子棋下棋代碼怎麼改寫,五子棋c++語言最簡單代碼

本文目錄一覽:

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-13 06:08
下一篇 2024-11-13 06:08

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python字符串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字符串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字符串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變量和數…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 倉庫管理系統代碼設計Python

    這篇文章將詳細探討如何設計一個基於Python的倉庫管理系統。 一、基本需求 在着手設計之前,我們首先需要確定倉庫管理系統的基本需求。 我們可以將需求分為以下幾個方面: 1、庫存管…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • 寫代碼新手教程

    本文將從語言選擇、學習方法、編碼規範以及常見問題解答等多個方面,為編程新手提供實用、簡明的教程。 一、語言選擇 作為編程新手,選擇一門編程語言是很關鍵的一步。以下是幾個有代表性的編…

    編程 2025-04-29
  • Python實現簡易心形代碼

    在這個文章中,我們將會介紹如何用Python語言編寫一個非常簡單的代碼來生成一個心形圖案。我們將會從安裝Python開始介紹,逐步深入了解如何實現這一任務。 一、安裝Python …

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29

發表回復

登錄後才能評論