最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言數(shù)組應(yīng)用實現(xiàn)三子棋游戲

 更新時間:2022年06月07日 16:09:55   作者:橘澤  
這篇文章主要為大家詳細介紹了C語言數(shù)組應(yīng)用實現(xiàn)三子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

三子棋游戲的基本構(gòu)架是數(shù)組的應(yīng)用,但是要實現(xiàn)游戲還得結(jié)合具有相關(guān)功能的函數(shù),接下來就介紹三子棋游戲的基本框架及相關(guān)函數(shù):
下面先介紹一下寫三子棋代碼的過程和思路:

1、游戲開始要先顯示游戲界面 (菜單函數(shù)) 。
2、要有一個棋盤給玩家下棋,所以需要一個二維數(shù)組,最開始顯示給玩家的棋盤應(yīng)該是空棋盤,所以初始化數(shù)組為空格(棋盤初始化函數(shù)) ,全為空格的數(shù)組打印出來是沒有顯示的,所以我們要畫一個棋盤框并把它打印出來(打印棋盤函數(shù)) 。
3、開始游戲后,玩家下棋(玩家下棋函數(shù)) ,數(shù)組更改并打印,電腦下棋(電腦下棋函數(shù)) ,數(shù)組更改并打印。
4、游戲是一個循環(huán)的過程,所以輸贏(判斷輸贏函數(shù))及平局(判斷平局函數(shù))的判斷也是一個循環(huán)的過程,因此判斷輸贏及平局應(yīng)該在下每一顆棋子后就進行判斷。

來看一下游戲效果:

程序運行,顯示游戲菜單,選擇1開始游戲。

玩家落子為x,電腦落子為0。

這里的棋盤行和列用宏定義可以方便更改:

#define ROW 3
#define COL 3?

頭文件game.h:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
void setboard(char arr[ROW][COL], int row, int col);
void displayboard(char arr[ROW][COL], int row, int col);
void playermove(char arr[ROW][COL], int row, int col);
void computermove(char arr[ROW][COL], int row, int col);
int iswin(char arr[ROW][COL], int row, int col);
int isfull(char arr[ROW][COL], int row, int col);
void menu();

源文件main.c:

  • 按照前面的分析及思路寫出框架,完善函數(shù)功能,構(gòu)成體系;
  • 人機對戰(zhàn)中電腦下棋是隨機的;
  • 需要注意在每次落子后都要判斷輸贏平局;
#define _CRT_SECURE_NO_WARNINGS 1
//三子棋主函數(shù)
#include "game.h"
int main()
{
?srand((unsigned int)time(NULL));
? //游戲界面
?int x = 0;
?int ret = 0;
?char n = 0;
?while(1)
?{
? menu();//菜單
? scanf("%d", &x);
? printf("\n");
? if (x == 1)
? {
? ?//設(shè)置棋盤
? ?char arr[ROW][COL] = { 0 };
? ?setboard(arr, ROW, COL);//棋盤初始化為空格
? ?displayboard(arr, ROW, COL);//打印棋盤
? ?while (1)
? ?{
? ? //玩家下棋
? ? playermove(arr, ROW, COL);
? ? //打印棋盤
? ? displayboard(arr, ROW, COL);
? ? //判斷平局
? ? ret = isfull(arr, ROW, COL);
? ? if (ret == 1)
? ? {
? ? ?printf("平局\n");
? ? ?break;
? ? }
? ? //判斷輸贏
? ? n = iswin(arr, ROW, COL);
? ? if (n == 'x')
? ? {
? ? ?printf("玩家贏\n");
? ? ?break;
? ? }
? ? else if (n == '0')
? ? {
? ? ?printf("電腦贏\n");
? ? ?break;
? ? }
? ? //玩家贏--x
? ? //電腦贏--0
? ? //平局--P
? ? //繼續(xù)--C
? ??
? ? //電腦下棋
? ? computermove(arr, ROW, COL);
? ? //打印棋盤
? ? displayboard(arr, ROW, COL);
? ? //判斷平局
? ? ret = isfull(arr, ROW, COL);
? ? if (ret == 1)
? ? {
? ? ?printf("平局\n");
? ? ?break;
? ? }
? ? //判斷輸贏
? ? n = iswin(arr, ROW, COL);
? ? if (n == 'x')
? ? {
? ? ?printf("玩家贏\n");
? ? ?break;
? ? }
? ? else if (n == '0')
? ? {
? ? ?printf("電腦贏\n");
? ? ?break;
? ? }
? ?}
? }?
?else if (x == 0)
? ?break;
?else
?printf("輸入錯誤,請重新輸入!\n");
?
?}
?system("pause");
?return 0;
}

源文件game.c:

主要的函數(shù)有以下幾個:
(菜單函數(shù)沒什么可講的)

  • 初始化棋盤
void setboard(char arr[ROW][COL], int row, int col)
{
?int i = 0;
?int j = 0;
?for (i = 0; i < ROW; i++)//棋盤初始化為空格
?{
? for (j = 0; j < COL; j++)
? {
? ?arr[i][j] = ' ';
? }
??
?}
}
  • 打印棋盤

這里我加了格子的序號,提高使用感,在大于3小于10的棋盤中可以更好的找到想要的坐標,為什么小于10呢,因為在序號由一位數(shù)變?yōu)閮晌粩?shù)時,打印出來的棋盤不規(guī)整了,當然這個地方還可以優(yōu)化,目前就只支持行列小于10的棋盤。

void displayboard(char arr[ROW][COL], int row, int col)
{
?int i = 0;
?int j = 0;
?
?for (i = 1; i <= col; i++)
?{
? printf(" ?%d ?", i);
? if (i < COL )
? ?printf("|");
?}
?printf("\n");
?for (j = 0; j < COL ; j++)
?{
? if (j == 0)
? {
? ?printf(" ----");
? }
? else if (j > 0)
? {
? ?printf("-----");
? }
? if (j < COL - 1)
? ?printf("|");
?}
?printf("\n");
?
?for (i = 0; i < ROW; i++)
?{
? printf("%d ", i + 1);
? for(j = 0; j < COL; j++)
? {?
? ?if (j == 0)
? ?{
? ? printf(" %c ", arr[i][j]);
? ?}
? ?else
? ?{
? ? printf(" ?%c ?", arr[i][j]);
? ?}
? ?
? ?if(j < COL - 1)
? ? ? printf("|");
? }
? printf("\n");
? if(i < ROW-1)
? {?
? ?for (j = 0; j < COL; j++)
? ?{
? ? if (j == 0)
? ? {
? ? ?printf(" ----");
? ? }
? ? else if (j > 0)
? ? {
? ? ?printf("-----");
? ? }
? ? if (j < COL - 1)
? ? ?printf("|");
? ?}
? ?printf("\n");
? }

?}
?
}?
  • 玩家下棋

這里要注意判斷坐標的合法性

void playermove(char arr[ROW][COL], int row, int col)
{
?printf("\n\n玩家走:>\n");
?while (1)
?{
? printf("請輸入坐標:>");
? int x = 0;
? int y = 0;
? scanf("%d%d", &x, &y);
? if (x > 0 && x <= ROW && y > 0 && y <= COL && arr[x-1][y-1] == ' ')
? {
? ?arr[x-1][y-1] = 'x';
? ?break;
? }
? else if (x > ROW || y > COL)
? {
? ?printf("錯誤坐標,請重新輸入!\n");
? }
? else if (arr[x-1][y-1] != ' ')
? {
? ?printf("該坐標下過棋了,請重新輸入!\n");
? }
??
?}
?
}
  • 電腦下棋

電腦下棋是隨機的,利用rand();及srand();產(chǎn)生0-2的隨機數(shù),注意生成隨機數(shù)需要引用time.h這個頭文件,雖然是產(chǎn)生隨機坐標但是要確定電腦找到一個有空位的棋格才可以停下。

void computermove(char arr[ROW][COL], int row, int col)
{
?printf("\n\n電腦走:>\n");
?int x = 0;
?int y = 0;
?while (1)
?{
? x = rand() % ROW;
? y = rand() % COL;
? if (arr[x][y] == ' ')
? {
? ?arr[x][y] = '0';
? ?break;
? }
?}
?
}
  • 判斷平局
int isfull(char arr[ROW][COL], int row, int col)
{
?int x = 0;
?int y = 0;
?for (x = 0; x < row; x++)
?{
? for (y = 0; y < col; y++)
? {
? ?if (arr[x][y] == ' ')
? ? return 0;
? }
?}
?return 1;
}
  • 判斷輸贏

只要棋盤中任意一個坐標的行,列,斜為相同符號,即為勝利,我這里在保證坐標合法的前提下對每一個坐標周圍8個坐標進行判斷,這樣可以做到在非3x3的棋盤中也可以完成三子棋游戲,當然這段代碼只是實現(xiàn)了功能而已,寫的非常繁瑣,我也覺得非3x3里還下三子棋說不過去,之后也可以繼續(xù)擴展到五子棋的判斷輸贏,以后再詳細整改。

int ?iswin(char arr[ROW][COL], int row, int col)
{
?int x = 0;?
?int y = 0;
?int count = 0;
?
?
?for (x = 0; x < row; x++)
?{
? for (y = 0; y < col; y++)
? {
??
? ?if (arr[x][y] == arr[x][y - 1] && arr[x][y - 1] == arr[x][y + 1] && arr[x][y] != ' '&& arr[x][y-1] != ' '&& arr[x][y+1] != ' ')
? ?{
? ? return arr[x][y];
? ?}
? ?else if (arr[x][y] == arr[x - 1][y + 1] && arr[x - 1][y + 1] == arr[x + 1][y - 1] && arr[x][y] != ' '&& arr[x-1][y+1] != ' '&& arr[x+1][y-1] != ' ')
? ?{
? ? return arr[x][y];
? ?}
? ?else if(arr[x][y] == arr[x - 1][y] && arr[x - 1][y] == arr[x + 1][y] && arr[x][y] != ' '&& arr[x-1][y] != ' '&& arr[x+1][y] != ' ')
? ?{
? ? return arr[x][y];
? ?}
? ?else if (arr[x][y] == arr[x - 1][y - 1] && arr[x - 1][y - 1] == arr[x + 1][y + 1] && arr[x][y] != ' '&& arr[x-1][y-1] != ' '&& arr[x+1][y+1] != ' ')
? ?{
? ? return arr[x][y];
? ?}
? }
?}
}

以上就是我的代碼,寫完以后還有些小遺憾,很多地方?jīng)]有處理好,希望各位能幫我優(yōu)化改進。

希望本文對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Qt中Tab與Tree組件實現(xiàn)分頁菜單

    Qt中Tab與Tree組件實現(xiàn)分頁菜單

    本文主要介紹tabWidget選擇夾組件與TreeWidget樹形選擇組件的常用方法及靈活運用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • VSCode插件開發(fā)全攻略之打包、發(fā)布、升級的詳細教程

    VSCode插件開發(fā)全攻略之打包、發(fā)布、升級的詳細教程

    這篇文章主要介紹了VSCode插件開發(fā)全攻略之打包、發(fā)布、升級的教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • C語言實現(xiàn)單鏈表的示例詳解

    C語言實現(xiàn)單鏈表的示例詳解

    給需要考研的同學(xué)一個參考,單鏈表作為常見數(shù)據(jù)結(jié)構(gòu)的一種,這里記錄C語言實現(xiàn)單鏈表,文章通過代碼示例介紹的非常詳細,具有一頂?shù)膮⒖純r值,需要的朋友可以參考下
    2023-09-09
  • C語言雙向鏈表的表示與實現(xiàn)實例詳解

    C語言雙向鏈表的表示與實現(xiàn)實例詳解

    這篇文章主要介紹了C語言雙向鏈表的表示與實現(xiàn),對于研究數(shù)據(jù)結(jié)構(gòu)域算法的朋友有一定的參考借鑒價值,需要的朋友可以參考下
    2014-07-07
  • 一起來了解c語言的str函數(shù)

    一起來了解c語言的str函數(shù)

    這篇文章主要為大家詳細介紹了c語言的str函數(shù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C++ OpenCV實現(xiàn)圖像去水印功能

    C++ OpenCV實現(xiàn)圖像去水印功能

    本文將介紹如何使用OpenCV C++ 進行簡單圖像水印去除。我們在網(wǎng)上download圖片時,經(jīng)常因為版權(quán)問題有水印。本案例通過編寫算法進行簡單水印去除。需要的可以參考一下
    2022-01-01
  • c++連接mysql5.6的出錯問題總結(jié)

    c++連接mysql5.6的出錯問題總結(jié)

    下面小編就為大家?guī)硪黄猚++連接mysql5.6的出錯問題總結(jié)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,祝大家游戲愉快哦
    2016-12-12
  • C++實現(xiàn)拼圖游戲代碼(graphics圖形庫)

    C++實現(xiàn)拼圖游戲代碼(graphics圖形庫)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)拼圖游戲代碼,帶有g(shù)raphics圖形庫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 基于Opencv實現(xiàn)雙目攝像頭拍照程序

    基于Opencv實現(xiàn)雙目攝像頭拍照程序

    這篇文章主要為大家詳細介紹了基于Opencv實現(xiàn)雙目攝像頭拍照程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • C++開發(fā):為什么多線程讀寫shared_ptr要加鎖的詳細介紹

    C++開發(fā):為什么多線程讀寫shared_ptr要加鎖的詳細介紹

    本篇文章介紹了,在C++中為什么多線程讀寫shared_ptr要加鎖的詳細說明。需要的朋友參考下
    2013-04-04

最新評論

泸溪县| 临沂市| 盐山县| 博野县| 万宁市| 岳阳市| 潞西市| 周口市| 华坪县| 利津县| 久治县| 台中县| 明水县| 黎川县| 监利县| 陆丰市| 宣化县| 浦东新区| 新密市| 浦城县| 胶州市| 西藏| 库尔勒市| 秦安县| 正镶白旗| 始兴县| 桃园县| 安徽省| 盘锦市| 潜江市| 宜阳县| 辰溪县| 西充县| 商水县| 常德市| 长武县| 金堂县| 封丘县| 临桂县| 天峻县| 基隆市|