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

C語言三子棋小游戲的實現(xiàn)

 更新時間:2020年12月17日 10:29:20   作者:驚喜狍子  
這篇文章主要為大家詳細(xì)介紹了C語言三子棋小游戲的實現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

前言

三子棋又叫九宮棋、圈圈叉叉、一條龍、井字棋等。

三子棋游戲規(guī)則:三子連成一片即為贏,如果雙方都沒有連成線,即為平局。

一、如何實現(xiàn)?

1.棋盤大小如何確定?

我們要實現(xiàn)一個3×3的棋盤,就需要定義一個3行3列的數(shù)組,但是數(shù)組的下標(biāo)從0開始,玩家選擇落子坐標(biāo)很不方便,所以要定義一個4×4的數(shù)組,第0行第0列不使用,如下圖紅框內(nèi)的行和列不使用。這樣就方便玩家選擇落子坐標(biāo)。

2.如何判定輸贏?

三子棋的規(guī)則很簡單,只要判斷每一行、每一列、對角線中是否有連成線的,即為贏。

代碼思路:

1、判斷是否有相同的行并且不能為空格(數(shù)組初始化為空格)。
2、判斷是否有相同的列并且不能為空格。
3、判斷主次對角線是否相同并且不能為空格。
4、棋盤下滿后是否為平局。

代碼如下:

//判斷誰贏,'X'表示玩家贏,'0'表示電腦贏,'p'表示平局
char IsWin(char map[ROWS][COLS], int row, int col)
{
 int i = 0;
 int j = 0;
 int ret = IsFull(map, ROWS, COLS);
 //判斷行
 for (i = 1; i < row; i++)
 {
 if (map[i][1] == map[i][2] && map[i][2] == map[i][3] && map[i][1] != ' ')
 {
 return map[i][1];
 }
 }
 //判斷列
 for (j = 1; j < col; j++)
 {
 if (map[1][j] == map[2][j] && map[2][j] == map[3][j] && map[1][j] != ' ')
 {
 return map[1][j];
 }
 }
 //判斷主對角線
 if (map[1][1] == map[2][2] && map[2][2] == map[3][3] && map[1][1] != ' ') 
 {
 return map[1][1];
 }
 //判斷次對角線
 if (map[1][3] == map[2][2] && map[2][2] == map[3][1] && map[1][3] != ' ')
 {
 return map[1][3];
 }
 //判斷是否為平局
 if (ret == 0)
 {
 return 'p';
 }
 else
 {
 return ' ';//防止編譯器報錯
 }
}

注意:

1、三個值比較時不可以使用連等,==是關(guān)系操作符,==是從左到右進(jìn)行運算的,計算表達(dá)式 a == b == c 時,首先會進(jìn)行邏輯運算 a == b得出邏輯值1或0,得到的結(jié)果作為返回值,然后進(jìn)行邏輯運算 “返回值” == c 得出邏輯值1或0,作為整個表達(dá)式的返回值。所以不能這樣用。
2、判斷完是否平局后,要加一個else,返回一個字符,不然編譯器會報錯:

因為編譯器認(rèn)為還有一種情況:當(dāng)所有的if都不滿足時,沒有返回值,所以要加一個else返回一個對結(jié)果沒有影響的字符。

二、具體代碼實現(xiàn)

1.頭文件game.h

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>

#define ROW 3
#define COL 3
#define ROWS ROW+1
#define COLS COL+1

//初始化棋盤
void InitMap(char map[][COLS], int row, int col);

//打印棋盤
void DisplayMap(char map[][COLS], int row, int col);

//玩家落子
void PlayerMove(char map[][COLS], int row, int col);

//電腦落子
void ComputerMove(char map[][COLS], int row, int col);

//判斷棋盤是否滿,0表示滿,1表示未滿
int IsFull(char map[][COLS], int row, int col);

//判斷誰贏,'X'表示玩家贏,'0'表示電腦贏,'p'表示平局
char IsWin(char map[][COLS], int row, int col);

2.主函數(shù)main.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

void menu()
{
 printf("***********************************************\n");
 printf("********  三子棋  *********\n");
 printf("***********************************************\n");
 printf("*************** 1.play **************\n");
 printf("*************** 0.exit **************\n");
 printf("***********************************************\n");
}

void game()
{
 char map[ROWS][COLS];
 char ret = ' ';//用來接收IsWin()的返回值
 InitMap(map, ROWS, COLS);//初始化棋盤
 DisplayMap(map, ROWS, COLS);//打印棋盤
 do
 {
 PlayerMove(map, ROWS, COLS);//玩家落子 
 ret = IsWin(map, ROWS, COLS);
 if (ret == 'X')
 {
 printf("玩家贏......\n");
 break;
 }
 else if (ret == 'p')
 {
 printf("平局......\n");
 break;
 }
 ComputerMove(map, ROWS, COLS);//電腦落子
 ret = IsWin(map, ROWS, COLS);
 if (ret == '0')
 {
 printf("電腦贏......\n");
 break;
 }
 }while (IsFull(map,ROWS,COLS));//棋盤已滿,結(jié)束循環(huán)
}

void test()
{
 int input = 0;
 srand((unsigned)time(NULL));
 do
 {
 menu();
 printf("請輸入操作代碼->");
 scanf("%d", &input);
 switch (input)
 {
 case 1:
 game();
 break;
 case 0:
 printf("退出游戲成功......\n");
 break;
 default:
 printf("選擇錯誤,請重新輸入->\n");
 break;
 }
 } while (input);
}

int main()
{
 test();
 return 0;
}

3.函數(shù)game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

void InitMap(char map[][COLS], int row, int col)
{
 int i = 0;
 int j = 0;
 for (i = 1; i < row; i++)
 {
 for (j = 1; j < col; j++)
 {
 map[i][j] = ' ';
 }
 }
}

void DisplayMap(char map[][COLS], int row, int col)
{
 int i = 0; 
 int j = 0;
 for (i = 1; i < row; i++)
 {
 for (j = 1; j <= col; j++)
 {
 printf("%3c",map[i][j]);
 if (j < col - 1)
 {
 printf(" | ");
 }
 }
 printf("\n");
 if (i < row - 1)
 {
 for (j = 1; j < col; j++)
 {
 printf(" --- ");
 }
 } 
 printf("\n");
 }
}

void PlayerMove(char map[][COLS], int row, int col)
{
 int x = 0;
 int y = 0;
 printf("玩家走->\n");
 while (1)
 {
 printf("請選擇落子坐標(biāo)->");
 scanf("%d %d", &x, &y);
 if (x >= 1 && x <= 3 && y >= 1 && y <= 3)
 {
 if (map[x][y] == ' ') 
 {
 map[x][y] = 'X';
 break;//落子成功就跳出循環(huán)
 }
 else
 {
 printf("該位置已被占用請重新輸入->\n");
 }
 }
 else
 {
 printf("坐標(biāo)非法,請重新輸入......\n");
 }
 }
 DisplayMap(map, ROWS, COLS);
}

void ComputerMove(char map[][COLS], int row, int col)
{
 int x = 0;
 int y = 0;
 printf("電腦走->\n");
 while (1)
 {
 x = rand() % 3 + 1;//1-3
 y = rand() % 3 + 1;//1-3
 if (map[x][y] == ' ')
 {
 map[x][y] = '0';
 break;
 }
 }
 DisplayMap(map, ROWS, COLS);
 }

//判斷棋盤是否滿,0表示滿,1表示未滿
int IsFull(char map[][COLS], int row, int col)
{
 int i = 0;
 int j = 0;
 int count = 0;//計算落子過的格子
 for (i = 1; i < row; i++)
 {
 for (j = 1; j < col; j++)
 {
 if (map[i][j] == 'X' || map[i][j] == '0')
 {
 count++;
 }
 }
 }
 if (count == ROW * COL)
 {
 return 0;//滿
 }
 else
 {
 return 1;
 }
}

//判斷誰贏,'X'表示玩家贏,'0'表示電腦贏,'p'表示平局
char IsWin(char map[ROWS][COLS], int row, int col)
{
 int i = 0;
 int j = 0;
 int ret = IsFull(map, ROWS, COLS);
 //判斷行
 for (i = 1; i < row; i++)
 {
 if (map[i][1] == map[i][2] && map[i][2] == map[i][3] && map[i][1] != ' ')
 {
 return map[i][1];
 }
 }
 //判斷列
 for (j = 1; j < col; j++)
 {
 if (map[1][j] == map[2][j] && map[2][j] == map[3][j] && map[1][j] != ' ')
 {
 return map[1][j];
 }
 }
 //判斷主對角線
 if (map[1][1] == map[2][2] && map[2][2] == map[3][3] && map[1][1] != ' ') 
 {
 return map[1][1];
 }
 //判斷次對角線
 if (map[1][3] == map[2][2] && map[2][2] == map[3][1] && map[1][3] != ' ')
 {
 return map[1][3];
 }
 //判斷是否為平局
 if (ret == 0)
 {
 return 'p';
 }
 else
 {
 return ' ';//防止編譯器報錯
 }
}

4、運行結(jié)果示例

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C實現(xiàn)與 uint64_t 相同功能的類

    C實現(xiàn)與 uint64_t 相同功能的類

    本文給大家分享的是筆者實現(xiàn)的仿uint64_t的類,可以用在不支持uint64_t的平臺上,雖然現(xiàn)在功能還不完善,但是還是分享給大家,也算是給大家一個思路吧。
    2015-12-12
  • C++中函數(shù)的用法小結(jié)

    C++中函數(shù)的用法小結(jié)

    這篇文章主要為大家分享下本人在閱讀《C++ Primer》函數(shù)一章時的讀書總結(jié),需要的朋友可以參考下
    2014-02-02
  • 詳解基于Matlab的空心散點檢測

    詳解基于Matlab的空心散點檢測

    這篇文章主要介紹了如何利用Matlab實現(xiàn)空心散點檢測,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Matlab有一定的幫助,感興趣的可以跟隨小編了解一下
    2022-02-02
  • Qt數(shù)據(jù)庫應(yīng)用之實現(xiàn)數(shù)據(jù)打印到紙張

    Qt數(shù)據(jù)庫應(yīng)用之實現(xiàn)數(shù)據(jù)打印到紙張

    關(guān)于Qt打印內(nèi)容到紙張,網(wǎng)上的辦法非常多,比如有些直接用painter繪制,逐步控制分頁打印。本文介紹的方法則是將內(nèi)容作為html設(shè)置到文檔對象,再調(diào)用文檔對象的print方法傳入QPrinter對象打印,感興趣的同學(xué)可以了解一下
    2022-01-01
  • C++實現(xiàn)LeetCode(39.組合之和)

    C++實現(xiàn)LeetCode(39.組合之和)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(39.組合之和),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++字符串拼接效率對比(+=、append、stringstream、sprintf)

    C++字符串拼接效率對比(+=、append、stringstream、sprintf)

    這篇文章主要介紹了C++字符串拼接效率對比(+=、append、stringstream、sprintf),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 簡單了解設(shè)計模式中的裝飾者模式及C++版代碼實現(xiàn)

    簡單了解設(shè)計模式中的裝飾者模式及C++版代碼實現(xiàn)

    這篇文章主要介紹了簡單了解設(shè)計模式中的裝飾者模式及C++版代碼實現(xiàn),ConcreteComponent的引用(指針)也可以達(dá)到修飾的功能,需要的朋友可以參考下
    2016-03-03
  • Opencv實現(xiàn)用于圖像分割分水嶺算法

    Opencv實現(xiàn)用于圖像分割分水嶺算法

    這篇文章主要為大家詳細(xì)介紹了Opencv實現(xiàn)用于圖像分割分水嶺算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Qt重寫QStackedWidget模擬實現(xiàn)home界面滑動效果

    Qt重寫QStackedWidget模擬實現(xiàn)home界面滑動效果

    這篇文章主要為大家詳細(xì)介紹了Qt如何通過重寫QStackedWidget模擬實現(xiàn)home界面滑動效果,文中的實現(xiàn)過程講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-11-11
  • C++實現(xiàn)掃雷游戲(控制臺版)

    C++實現(xiàn)掃雷游戲(控制臺版)

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)掃雷游戲,控制臺版的掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評論

施甸县| 长春市| 威宁| 义乌市| 福鼎市| 贞丰县| 贵阳市| 浪卡子县| SHOW| 德令哈市| 房产| 屏山县| 紫金县| 荣成市| 韶关市| 楚雄市| 海安县| 赣州市| 闻喜县| 柳江县| 潜江市| 乌鲁木齐县| 金门县| 西吉县| 长岛县| 杨浦区| 清新县| 鄂托克前旗| 道孚县| 巍山| 太和县| 南岸区| 新源县| 资溪县| 什邡市| 沙湾县| 平遥县| 临海市| 江孜县| 曲麻莱县| 阿巴嘎旗|