C语言实现三子棋

本次程序是三子棋的简单实现,首先我们要了解三子棋的游戏规则,3X3的游戏格子里先,先连成一条线的获胜。

根据游戏规则,我们将其规则转换为编程,大致思路是棋盘的打印,电脑放置棋子,玩家放置棋子,对每次放置棋子进行胜负判断。棋盘为3X3,用到了我们C语言中的二维数组,还有其他的循环和判断语句,数组的合理布置和运用帮助我们很好的在一个棋盘上放置了棋子。

编写此次程序我们需要添加一个头文件来包含我们的头文件,标识符的定义,函数的声明(game.h);还需要的是两个源文件,一个负责对游戏程序的测试(test.h),一个为我们所写的游戏主程(game.h)。

首先编写我们的头文件(game.h)

#ifndef __GAME_H__           //判断头文件是否已经使用  if not define 如果没有则定义
#define __GAME_H__           //定义头文件

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

extern void meun();
extern void game();
extern int Judgement();
extern void Computer_Set();
extern void Person_Set();
extern void chessBorad();

#endif //__GAME_H__

然后写入我们的测试程序(test.c),需要注意的是我们在此需要引入我们的头文件,注意头文件引入不是<>而是”“,在此说明下”“是先检测当前目录搜索头文件,<>是从系统指定目录搜索,所以不要用错。
在此我们要实现的是用户选择1进行游戏,选择0退出,其他则不能识别重新选择,需要用到while语句嵌套switch case语句。

#include"game.h"

int main()
{
    int a;
    srand((unsigned)time(NULL));                //产生一个随机数
    do
    {
        meun();                                 //打印游戏菜单
        scanf_s("%d", &a);                      //进行游戏模式选择
        switch (a)
        {
        case 1:
            game();
            break;
        case 0:
            break;
        default:
            printf("输入错误请重新输入:");
            break;
        }
    } while (a);
    return 0;
}

这里开始写入游戏的主要程序(game.c),此部分需要对棋盘设置和将所需要的二维数组加入在棋盘中,原理是通过对数组的赋值来进行棋子的布置,坐标的x,y相当于二位数组确定的参数。
在此需要注意的是
1.作为程序员知道数组是从0,0开始,用户可能并不明白其原理,会输入1,1,要做到用户友好,在此我们需要对输入进行处理
2.我们需要对每次输入的值进行判断,如果输入重复,则需要提示重新输入。
3.对每次如果结果进行判断,最终结果分为三种,玩家胜,电脑胜,平局。

#include"game.h"

//游戏菜单设置
void meun()
{
    printf("************************************************\n");
    printf("**************     1.play     ******************\n");
    printf("**************     2.exits    ******************\n");
    printf("************************************************\n");
}
//游戏主程序
void game()
{
    printf("------------------welcome!!!--------------------\n");
    char arr[3][3];
    memset(arr, ' ', sizeof(arr));                      //对数组进行初始化
    chessBorad(arr);
    while (1)
    {
        Computer_Set(arr);
        int judge = Judgement(arr);                     //每次都要进行判断
        if (judge == 0)
        {
            system("cls");                              //清空屏幕进行下一次游戏
            break; 
        }
        Person_Set(arr);
        judge = Judgement(arr);
        if (judge == 0)
        {
            system("cls");
            break;
        }
    }
}

//游戏棋盘的设置,注意数组要安置在棋盘里
void chessBorad(char arr[3][3])
{
    for (int i = 0; i < 4; i++)
    {
        if (i == 0)
            printf("\n");
        if (i>0)
        for (int j = 0; j < 1; j++)
        {
            printf("              | %c | %c | %c |\n", arr[i - 1][j], arr[i - 1][j + 1], arr[i - 1][j + 2]);
        }
        printf("               --- --- ---\n");

    }
    printf("_________________________________________________\n");
}

//电脑安置棋子设置,用随机数的产生来设置
void Computer_Set(char arr[3][3])
{
    printf("computer seted:");
    while (1)
    {
        int a = rand() % 3;
        int b = rand() % 3;
        if (arr[a][b] == ' ')
        {
            arr[a][b] = 'O';
            break;
        }
    }
    chessBorad(arr);
}

//玩家放置棋子设置
void Person_Set(char arr[3][3]) 
{
    while (1)
    {
        printf("please input coordinate:");
        int a = 0;
        int b = 0;
        scanf("%d %d", &a, &b);
        a--;
        b--;
        if (((a >= 0) && (a<3)) && ((b >= 0) && (b < 3)) && (arr[a][b] == ' '))
        {
            arr[a][b] = 'X';
            chessBorad(arr);
            break;
        }
        else
        {
            printf("please try again;\n");
        }
    }
}

//胜负的判断条件
int Judgement(char arr[3][3])
{
    if (((arr[0][0] == arr[0][1]) && (arr[0][1] == arr[0][2]) && (arr[0][0] == 'X')) ||
        ((arr[1][0] == arr[1][1]) && (arr[1][1] == arr[1][2]) && (arr[1][1] == 'X')) ||
        ((arr[2][0] == arr[2][1]) && (arr[2][1] == arr[2][2]) && (arr[2][2] == 'X')) ||
        ((arr[0][0] == arr[1][0]) && (arr[1][0] == arr[2][0]) && (arr[2][0] == 'X')) ||
        ((arr[0][1] == arr[1][1]) && (arr[1][1] == arr[2][1]) && (arr[2][1] == 'X')) ||
        ((arr[0][2] == arr[1][2]) && (arr[1][2] == arr[2][2]) && (arr[2][2] == 'X')) ||
        ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[2][2] == 'X')) ||
        ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[2][0] == 'X')))
    {
        printf("you win this game.\n");
        return 0;
    }
    if (((arr[0][0] == arr[0][1]) && (arr[0][1] == arr[0][2]) && (arr[0][0] == 'O')) ||
        ((arr[1][0] == arr[1][1]) && (arr[1][1] == arr[1][2]) && (arr[1][1] == 'O')) ||
        ((arr[2][0] == arr[2][1]) && (arr[2][1] == arr[2][2]) && (arr[2][2] == 'O')) ||
        ((arr[0][0] == arr[1][0]) && (arr[1][0] == arr[2][0]) && (arr[2][0] == 'O')) ||
        ((arr[0][1] == arr[1][1]) && (arr[1][1] == arr[2][1]) && (arr[2][1] == 'O')) ||
        ((arr[0][2] == arr[1][2]) && (arr[1][2] == arr[2][2]) && (arr[2][2] == 'O')) ||
        ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[2][2] == 'O')) ||
        ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[2][0] == 'O')))
    {
        printf("you lose this game.\n");
        return 0;
    }
    if ((arr[1][1] != ' ') && (arr[1][2] != ' ') && (arr[1][3] != ' ')
        && (arr[2][1] != ' ') && (arr[2][2] != ' ') && (arr[2][3] != ' ')
        && (arr[3][1] != ' ') && (arr[3][2] != ' ') && (arr[3][3] != ' '))
    {
        printf("draw!\n");
        return 0;
    }
    return  1;
}

程序还可以进行部分优化,对电脑的放置进行判断,比如玩家快到三个或者电脑快到三个进行判断,选择放置。可以设置不同的模式,比如玩家vs玩家,也可以优化电脑,可以选择难度,不同的难度对应不同的函数。还有需要自己的开发和思考。
程序最重要的一点是一定要注重用户友好,好的界面,好的优化,程序的效率都是需要每个程序员注重的。

                                                         Author:yk
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,我可以回答这个问题。以下是一个简单的C语言实现单人三子棋游戏的代码: ```c #include <stdio.h> #include <stdlib.h> #define BOARD_SIZE 3 void init_board(char board[][BOARD_SIZE]); void print_board(char board[][BOARD_SIZE]); int make_move(char board[][BOARD_SIZE], int row, int col, char player_char); int check_win(char board[][BOARD_SIZE], char player_char); int main() { char board[BOARD_SIZE][BOARD_SIZE]; int row, col, win; char player_char = 'X'; init_board(board); print_board(board); while (1) { printf("\nPlayer %c's turn.\n", player_char); printf("Enter row number: "); scanf("%d", &row); printf("Enter column number: "); scanf("%d", &col); if (make_move(board, row, col, player_char)) { print_board(board); win = check_win(board, player_char); if (win) { printf("\nPlayer %c wins!\n", player_char); break; } player_char = (player_char == 'X') ? 'O' : 'X'; } else { printf("Invalid move. Try again.\n"); } } return 0; } void init_board(char board[][BOARD_SIZE]) { int i, j; for (i = 0; i < BOARD_SIZE; i++) { for (j = 0; j < BOARD_SIZE; j++) { board[i][j] = '-'; } } } void print_board(char board[][BOARD_SIZE]) { int i, j; printf("\n"); for (i = 0; i < BOARD_SIZE; i++) { for (j = 0; j < BOARD_SIZE; j++) { printf("%c ", board[i][j]); } printf("\n"); } } int make_move(char board[][BOARD_SIZE], int row, int col, char player_char) { if (row < 0 || row >= BOARD_SIZE || col < 0 || col >= BOARD_SIZE || board[row][col] != '-') { return 0; } board[row][col] = player_char; return 1; } int check_win(char board[][BOARD_SIZE], char player_char) { int i, j; int row_win, col_win, diag_win1, diag_win2; for (i = 0; i < BOARD_SIZE; i++) { row_win = 1; col_win = 1; for (j = 0; j < BOARD_SIZE; j++) { if (board[i][j] != player_char) { row_win = 0; } if (board[j][i] != player_char) { col_win = 0; } } if (row_win || col_win) { return 1; } } diag_win1 = 1; diag_win2 = 1; for (i = 0; i < BOARD_SIZE; i++) { if (board[i][i] != player_char) { diag_win1 = 0; } if (board[i][BOARD_SIZE-1-i] != player_char) { diag_win2 = 0; } } if (diag_win1 || diag_win2) { return 1; } return 0; } ``` 这个程序实现了基本的单人三子棋游戏,并且包括了判断胜负的函数。您可以根据需要修改和扩展此代码。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值