c语言自学简易3子棋代码书写赋逐行代码分析

1:了解3子棋

简单来说就是先连起3个棋子的话就赢,如果棋盘占满还未分出胜负就视为平局。

2:学前准备

如;函数的运用,2维数组的运用。

3:代码实现

      1:基本的游戏菜单的实现

#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void menu()//打印菜单函数
{
    printf("****************************\n");
    printf("********1.play**************\n");
    printf("********0,exit**************\n");
    printf("****************************\n");
}
int main()
{
    int input = 0;//输入
    do
    {
        menu();//打印菜单
        printf("请选择->");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            printf("游戏开始');//后面换为game()函数现在先测试简单的菜单打印
            break;
        case 0:
            printf("欢迎游玩退出游戏");
            break;
        default:
            printf("选择错误!\n");
            break;
        }
    } while (input);

    return 0;
}

        2:3子棋的3*3棋盘的定义与赋初值代码

代码实现

定义:char board[Row][Col] = { 0 };

赋初值:

void Init_Board(char board[Row][Col],int row, int col)
{
    int i = 0;
    int j = 0;
    for ( i = 0; i <row; i++)
    {
        
        for ( j = 0; j < col; j++)
        {
            board[i][j] = ' ';//3*3先赋值为空格(无)
        }
    }
}

       3:打印棋盘函数代码

void Display_Boarwd(char board[Row][Col], int row, int col)
{
    int i = 0;
    for ( i = 0; i < row; i++)
    {
        //打印数据 %c |;
        int j = 0;
        for  (j = 0; j < Col; j++)
        {
            printf(" %c ", board[i][j]);
            if (j < col - 1)//少打印一次
            {
                printf("|");
            }
        }
        printf("\n");
        //打印分割信息
        //printf(---|---|---)
        if (i < row - 1)//少打印一行
        {
            int j = 0;
            for ( j = 0; j < col; j++)
            {
                printf("---");
                if (j < col - 1)//少打印一次
                {
                    printf("|");
                }
            }
            printf("\n");
        }
    }
}

    4:玩家下棋与电脑下棋函数代码

 

1;玩家下棋函数逻辑代码

 void Play_Move(char board[Row][Col], int row, int col)//玩家下棋函数逻辑
{
    printf("请玩家下棋->\n");
    int x = 0;//行坐标初始化
    int y = 0;//列坐标初始化
    //玩家输入的坐标必须是在(1~3)这个范围里所以要进行判断
    //因为要重新输入所以是个循环
    while(1)
    {
        printf("请玩家输入坐标->");
        scanf("%d %d",&x, &y);//重复输入是个循环
        //坐标合法性判断先范围后看是否被下过棋
      if (x >= 1 && x <= row && y >= 1 && y <= row)
        {
            //玩家坐标范围(1~3),则数组中坐标范围(0~2)
            //判断坐标是否被占用(是否为' '(空格))未被占用玩家输入坐标
          if (board[x - 1][y - 1] == ' ')
          {
              board[x - 1][y - 1] = '*';//玩家下棋为*
              //跳出循环
              break;
          }
        }
        else
        {
            //提醒玩家重新输入坐标
            printf("请重新输入坐标");
            //因为要重新输入所以是个循环
        }
    }
}

 2;电脑下棋函数逻辑代码

void Computer_Move(char board[Row][Col], int row, int col)  //电脑下棋函数声明
{
    printf("电脑下棋->\n");
    int x = 0;
    int y = 0;
    //电脑下棋为随机产生随机数(0~2)
    while (1)
    {
        
      x = rand() % row;//膜上3便产生的是0~2的数
      y = rand() % col;
      //判断棋盘格是否被占用
      if (board[x][y] == ' ')
      {
          board[x][y] = '#';//电脑下棋表示为#
          //如果被占用重新生成坐标是个循环
          
          break;//退出否则死循环
      }

    }

}

5:输赢判断函数代码

分析 要通过返回值来判断

//玩家胜返回‘*’
//电脑胜返回'#'
//平局返回'd'
//继续返回'c'

char Is_Win(char board[Row][Col], int row, int col)
{
    //胜负是3个字符相同便胜出用for循环
    //先进行 ,行的判断
    int i = 0;
    for ( i = 0; i < row; i++)
    {
        if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
        {
            return board[i][1];//有返回行上的赢
        }
        
    }
    //在进行列的判断
    int j = 0;
    for (j= 0; j < col; j++)
    {
        if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
        {
            return board[1][j];//这里返回列上赢
        }
    }
    //看两个对角;
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
    {
        return board[1][1];
    }
    if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
    {
        return board[1][1];
    }
    //判断是否平局
    //定义一个遍历数组如果没有空格视为平局返回1 有空格返回
    if (Ergodic_Board(board, row, col))
    {
        return 'd';

    }
    //游戏继续
    return 'c';

4  game.h文件展示 

#pragma once

#include <stdio.h>

#include<stdlib.h> //srand rand 的头文件

#include<time.h>   //time 的头文件

#define Row  3    //行

#define Col  3   //列

void Init_Board(char board[Row][Col], int row, int col);//初始化棋盘函数声明

void Display_Boarwd(char board[Row][Col], int row, int col);//打印棋盘函数声明

void Play_Move(char board[Row][Col], int row, int col);//玩家下棋函数声明

void Computer_Move(char board[Row][Col], int row, int col);//电脑下棋函数声明
//玩家胜返回‘*’
//电脑胜返回'#'
//平局返回'd'
//还有空格并且没分出胜负继续返回'c'
char Is_Win(char board[Row][Col], int row, int col);//判断输赢函数

5:主函数; 

#define   _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()//打印菜单
{
    printf("****************************\n");
    printf("********1.play**************\n");
    printf("********0,exit**************\n");
    printf("****************************\n");
}
void game()
{
    char ret = 0;
    char board[Row][Col] = { 0 };//定义一个3*3的棋盘
    //初始化棋盘函数
    Init_Board(board, Row, Col);
    //打印棋盘函数
    Display_Boarwd(board, Row, Col);
    while (1)
    {
        
        Play_Move(board, Row, Col);//玩家下棋函数
        //判断输赢
         ret = Is_Win(board, Row, Col);
        if (ret != 'c')
        {
            break;
        }
        Display_Boarwd(board, Row, Col);//打印棋盘
        
        Computer_Move(board, Row, Col);//电脑下棋
        //判断输赢
        ret = Is_Win(board, Row, Col);
        if (ret != 'c')
        {
            break;
        }
        Display_Boarwd(board, Row, Col);//打印棋盘

    }
    if (ret == '*')
     {
        printf("玩家胜出\n");
     }
    else if (ret == '#')
     {
        printf("电脑胜出\n");
     }
    else 
     {
        printf("平局\n");
     }

     Display_Boarwd(board, Row, Col);//打印结局
}
int main()
{
    //电脑下棋srand()设置随机数的生成起点
    srand((unsigned int)time(NULL));//time函数返回值类型为time_t(时间戳(本质上也是整形))用unsigned强制转换成int 类型
    int input = 0;//输入
    do
    {
        menu();//打印菜单
        printf("请选择->");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("欢迎游玩退出游戏");
            break;
        default:
            printf("选择错误!\n");
            break;
        }
    } while (input);

    return 0;
}

6:总结 

完成了这个代码后更加对代码痴迷但同时也要更加细心才行否则在面对以后的大工程的代码恐怕会有更多bug。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值