纯C版三子棋

今天,给大家带来一个好玩的小游戏,用纯C写的三子棋小游戏,开始之前呢,先理一下思路:

1.用二维数组定义一个棋盘,然后设计一个游戏面板。

2.为了更好的游戏体验,再加上一个菜单,供玩家进行选择是进行游戏还是选择退出。

3.游戏双方分为,玩家和电脑,然后游戏双方进行游戏操作,选择下棋的位置。

4.在游戏双方没进行一步操作的时候就要判断是否有胜出的一方或是是否是平局(棋盘满了,但无人胜利)或是否没人胜利也没平局(既无人胜利棋盘也没有满)。

下面就可以开始进行操作了。

第一步:是为了玩家更好的游戏体验,给玩家一个可以进行选择的菜单,看玩家是进行玩呢,还是选择退出。

此时用一个循环,是为了玩家在玩完一局之后可以选择继续玩(当然不可能继续玩)退出

现在进入游戏主体:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

进入游戏主体之后,第一步是为玩家显示大概的游戏面板(类似于下面,当然有些丑,将就看):

接下来,玩家首先进行移动:

此时用一个循环是保证玩家只有输入正确才可以继续进行下去。

游戏主体中然后判断是否有比赛结果(玩家是否获胜,平局,没人胜出也不是平局):

 

再就是电脑移动:

好了,整个代码的核心逻辑跟代码已经罗列出来了。下面看看完整的代码:

#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<time.h>
#define COL 3
#define ROW 3
void displayBoard(char board[][COL], int row)
{
    int i = 0;
    for (; i < row; i++){
        printf("%3c|%3c|%3c\n", board[i][0], board[i][1], board[i][2]);
        if (i < row - 1)
        {
            printf("---|---|---\n");
        }
    }
}
void playerMove(char board[][COL], int row)
{
    int x, y;
    do
    {
        printf("Please Enter: ");
        scanf_s("%d,%d", &x, &y);
        if (x >= 1 && x <= 3 && y >= 1 && y <= 3)//判断玩家输入坐标位置的合法性
        {
            if (board[x - 1][y - 1] == ' ')//当玩家选中的位置没有被占用过时
            {
                board[x - 1][y - 1] = 'X';//将玩家选中的地方标记为‘X’,表示玩家下了一步棋。
                break;
            }
            else{
                printf("该位置被占用,请换个地方\n");//当玩家选的地方被占用时
            }
        }
        else{
            printf("输入错误,请重新输入\n");//不合法,超出数组的界限时
        }
    } while (1);
    
}
void computerMove(char board[][COL], int row)
{
    srand((unsigned long)time(NULL));//随机数种子
    do
    {
        int x = rand() % COL;
        int y = rand() % row;
        if (board[x][y] == ' ')//判断电脑生成的位置是否被占用
        {
            board[x][y] = 'O';
            break;
        }
    } while (1);//一直循环到电脑生成合法位置为止

}
int isFull( char board[][COL], int row)//判断棋盘是否下满,循环遍历数组
{
    int i = 0;
    int j = 0;
    for (; i < COL; i++){
        for (; j < row; j++){
            if (board[i][j] == ' '){
                return 0;
            }
        }
    }
    return 1;
}
char isWin(char board[][COL], int row)
{
    int i = 0;
    for (; i < row; i++)
    {
        if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')//判断是否有一行是否一样
        {
            return board[i][0];
        }
    }
    for (i=0; i < COL; i++)
    {
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')//判断是否有一列是否一样
        {
            return board[0][i];
        }
    }
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')//判断对角线是否一样
    {
        return board[0][0];
    }
    else if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')//判断对角线是否一样
    {
        return board[0][2];
    }
    if (isFull(board,row)){//判断是否是可以继续走下去
        return 'Q';//如果棋盘满了,那么就是平局
    }
    return ' ';//继续走下去
}
void menu()
{
    printf("########################\n");
    printf("##1.play        2.exit##\n");
    printf("########################\n");
    printf("Plese Select");
}
void game()
{
    char board[ROW][COL];//棋盘用一个二维数组来进行定义
    memset(board, ' ', COL*ROW);//将二维数组中的所有元素初始化为‘ ’(空格)
    char ret;
    do
    {
        displayBoard(board, ROW);//展示的游戏面板
        playerMove(board, ROW);//玩家进行移动
        ret = isWin(board, ROW);//判断玩家是否赢了,取得结果ret
        if (ret!=' ')//当玩家移动一步之后,得到判断的结果ret不是为空格的时候,即有结果有否胜出方或是否是平局的时候就跳出循环
        {
            break;
        }
        computerMove(board, ROW);//结果是空格,那没有平局,也没有胜出方,电脑进行移动
        ret = isWin(board, ROW);//电脑移动一步之后,进行判断比赛结果
    } while (ret==' ');//只要棋盘还没有满,双方就会落子
    if (ret == 'X')//判断结果为‘X’的时候,玩家获胜
    {
        printf("了不起,了不起,你赢了\n");
    }
    else if (ret == 'O')//判断结果为‘O’时候,电脑获胜
    {
        printf("可惜可惜,你输了\n");
    }
    else
    {
        printf("恭喜了,平局,平局\n");//判断结果为双方平局
    }
}
int main()
{
    int select = 0;
    do
    {
        menu();//提供给用户选择的菜单
        scanf_s("%d",&select);//用户的选项
        switch (select)
        {
        case 1:
            game();//选择游戏
            break;
        case 2:
            exit(0);//选择退出
            break;
        default:
            break;
        }
    } while (1);
    system("pause");
    return 0;
}
这是一个简单却又很普遍的小游戏,在刚学习C语言的时候,大家可以没事儿的时候可以写写这些有趣又简单的小游戏,写完之后满足感满满,哈哈哈。

好了今天就到这,不说了,我又要去敲代码了,不对,还是先睡,明天再努力,哈哈哈。