C语言—————三子棋游戏

Wesley13
• 阅读 644

三子棋游戏

问题描述
3*3的棋盘中,只要一条线上出现三个一样的棋子就获胜(玩家或电脑);如果棋盘已经放满还未出现三个棋子一条线则打成平手。
具体细节

  1. 初始化棋盘(用空格初始化)

    //初始化棋盘 void initChess(char chessbox[ROW][COL]){

    for (int row = 0; row < ROW; row++){
    
    
        for (int col = 0; col < COL; col++){
    
    
            chessbox[row][col] = ' ';
        }
    }
    

    }

  2. 打印棋盘

    //打印棋盘 void printChess(char chessbox[ROW][COL]){

    system("cls");
    printf("+---+---+---+\n");
    for (int row = 0; row < ROW; row++){
    
    
        printf("| %c | %c | %c |\n", 
            chessbox[row][0], chessbox[row][1],
            chessbox[row][2]);
        printf("+---+---+---+\n");
    }
    

    }

  3. 电脑落子(用o表示电脑落子)

    //电脑落子(用o表示) void computerMove(char chessbox[ROW][COL]){

    srand(time(0));
    while (1){
    
    
        int row = rand() % 3;
        int col = rand() % 3;
        if (chessbox[row][col] == ' '){
    
    
            chessbox[row][col] = 'o';
            break;
        }
    
    }
    

    }

  4. 玩家落子

    //玩家落子(用x表示) void playerMove(char chessbox[ROW][COL]){

    int row, col;
    while (1){
    
    
        printf("请输入您的落子地点:");
        scanf("%d %d", &row, &col);
        if (row >= 3 || col >= 3){
    
    
            printf("您输入的落子位置有误,请重新输入:");
            continue;
        }
        if (chessbox[row][col] == ' '){
    
    
            chessbox[row][col] = 'x';
            break;
        }
        printf("该位置已有棋子,请重新输入:");
    }
    

    }

  5. 三个棋子一条线

  • 在一行或一列实现三个棋子一条线

    //行 for (int row = 0; row < ROW; row++){ if (chessbox[row][0] != ' ' &&chessbox[row][0] == chessbox[row][1] && chessbox[row][0] == chessbox[row][2]){ return chessbox[row][0]; } } //列 for (int col = 0; col < COL; col++){ if (chessbox[0][col] != ' ' &&chessbox[0][col] == chessbox[1][col] && chessbox[0][col] == chessbox[2][col]){ return chessbox[0][col]; } }

  • 对角线实现三个棋子一条线

    if (chessbox[0][0] != ' ' &&chessbox[0][0] == chessbox[1][1] && chessbox[0][0] == chessbox[2][2]){ return chessbox[0][0]; } if (chessbox[2][0] != ' ' &&chessbox[2][0] == chessbox[1][1] && chessbox[2][0] == chessbox[0][2]){ return chessbox[2][0]; }

  1. 和棋
  • 棋盘放满还未获胜,则为和棋,打成了平手。

    在这里插入代码片 //和棋
    if(isFull(checkbox)){ return 'a'; }

  1. 输赢约定:
  • 返回x代表玩家获胜

    if (isWinner(chessbox) == 'x'){

            printf("恭喜您赢啦!\n");
            break;
        }
    
  • 返回o代表电脑获胜

    if (isWinner(chessbox) == 'o'){

            printf("很遗憾,您输了!\n");
            break;
        }
    
  • 返回a代表和棋(打成平手)

    if (isWinner(chessbox) == 'a'){

            printf("你和电脑同一水平呦!\n");
            break;
        }
    
  1. 判断棋盘是否放满:
  • 返回1代表棋盘已满

  • 返回0代表棋盘未满

    //判断棋盘是否摆满 //1表示满;0表示不满。 int isFullChess(char chessbox[ROW][COL]){

    for (int row = 0; row < ROW; row++){
    
    
        for (int col = 0; col < COL; col++){
    
    
            //找到空格,说明未满
            if (chessbox[row][col] == ' '){
    
    
                return 0;
            }
        }
    }
    return 1;
    

    }

源代码:

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define ROW 3
#define COL 3
//玩家落子(用x表示)
void playerMove(char chessbox[ROW][COL]){
   
   
    int row, col;
    while (1){
   
   
        printf("请输入您的落子地点:");
        scanf("%d %d", &row, &col);
        if (row >= 3 || col >= 3){
   
   
            printf("您输入的落子位置有误,请重新输入:");
            continue;
        }
        if (chessbox[row][col] == ' '){
   
   
            chessbox[row][col] = 'x';
            break;
        }
        printf("该位置已有棋子,请重新输入:");
    }
}
//电脑落子(用o表示)
void computerMove(char chessbox[ROW][COL]){
   
   
    srand(time(0));
    while (1){
   
   
        int row = rand() % 3;
        int col = rand() % 3;
        if (chessbox[row][col] == ' '){
   
   
            chessbox[row][col] = 'o';
            break;
        }

    }
}
//初始化棋盘
void initChess(char chessbox[ROW][COL]){
   
   
    for (int row = 0; row < ROW; row++){
   
   
        for (int col = 0; col < COL; col++){
   
   
            chessbox[row][col] = ' ';
        }
    }
}
//打印棋盘
void printChess(char chessbox[ROW][COL]){
   
   
    system("cls");
    printf("+---+---+---+\n");
    for (int row = 0; row < ROW; row++){
   
   
        printf("| %c | %c | %c |\n", 
            chessbox[row][0], chessbox[row][1],
            chessbox[row][2]);
        printf("+---+---+---+\n");
    }
}
//判断棋盘是否摆满,摆满返回1;未满返回0
int isFullChess(char chessbox[ROW][COL]){
   
   
    for (int row = 0; row < ROW; row++){
   
   
        for (int col = 0; col < COL; col++){
   
   
            //找到空格,说明未满
            if (chessbox[row][col] == ' '){
   
   
                return 0;
            }
        }
    }
    return 1;
}
//约定:返回x代表玩家赢了;返回o代表电脑赢了;返回a代表和棋
char isWinner(char chessbox[ROW][COL]){
   
   
    //行
    for (int row = 0; row < ROW; row++){
   
   
        if (chessbox[row][0] != ' '
            &&chessbox[row][0] == chessbox[row][1]
            && chessbox[row][0] == chessbox[row][2]){
   
   
            return chessbox[row][0];
        }
    }
    //列
    for (int col = 0; col < COL; col++){
   
   
        if (chessbox[0][col] != ' '
            &&chessbox[0][col] == chessbox[1][col]
            && chessbox[0][col] == chessbox[2][col]){
   
   
            return chessbox[0][col];
        }
    }
    //对角线
    if (chessbox[0][0] != ' '
        &&chessbox[0][0] == chessbox[1][1]
        && chessbox[0][0] == chessbox[2][2]){
   
   
        return chessbox[0][0];
    }
    if (chessbox[2][0] != ' '
        &&chessbox[2][0] == chessbox[1][1]
        && chessbox[2][0] == chessbox[0][2]){
   
   
        return chessbox[2][0];
    }
    //和棋
    if (isFullChess(chessbox)){
   
   
        return 'a';
    }
    return 0;
}
//开始一局游戏
void game(){
   
   

    char chessbox[ROW][COL] = {
   
    0 };
    initChess(chessbox);
    printf("游戏开始啦!\n");
    printChess(chessbox);
    while (1){
   
   
        //玩家落子
        playerMove(chessbox);
        //打印棋牌
        printChess(chessbox);
        //判断胜负
        if (isWinner(chessbox) == 'x'){
   
   
            printf("恭喜您赢啦!\n");
            break;
        }
        if (isWinner(chessbox) == 'a'){
   
   
            printf("你和电脑同一水平呦!\n");
            break;
        }
        //电脑落子
        computerMove(chessbox);
        //打印棋牌
        printChess(chessbox);
        //判断胜负
        if (isWinner(chessbox) == 'o'){
   
   
            printf("很遗憾,您输了!\n");
            break;
        }
        if (isWinner(chessbox) == 'a'){
   
   
            printf("你和电脑同一水平呦!\n");
            break;
        }
    }
}
int menu(){
   
   
    printf("===============\n");
    printf("1.开始游戏\n");
    printf("0.结束游戏\n");
    printf("===============\n");
    int choice;
    printf("请输入您的选择:");
    scanf("%d", &choice);
    return choice;
}

int main()
{
   
   

ile (1){
   
   
        int choice=menu();
        if (choice == 1){
   
   
            game();
            continue;
        }
        else if (choice == 0){
   
   
            break;
        }else{
   
   
            printf("输入有误,请您重新输入!\n");
            continue;
        }
    }
    system("pause");
    return 0;
}

运行结果:

C语言—————三子棋游戏
C语言—————三子棋游戏

C语言—————三子棋游戏
C语言—————三子棋游戏

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
2个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
2年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
2年前
C# Aspose.Cells导出xlsx格式Excel,打开文件报“Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃”
报错信息:最近打开下载的Excel,会报如下错误。(xls格式不受影响)!(https://oscimg.oschina.net/oscnet/2b6f0c8d7f97368d095d9f0c96bcb36d410.png)!(https://oscimg.oschina.net/oscnet/fe1a8000d00cec3c
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
2年前
Nginx反向代理upstream模块介绍
!(https://oscimg.oschina.net/oscnet/1e67c46e359a4d6c8f36b590a372961f.gif)!(https://oscimg.oschina.net/oscnet/819eda5e7de54c23b54b04cfc00d3206.jpg)1.Nginx反
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
8个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这