C语言—三子棋

本文介绍了一个简单的3x3五子棋游戏的设计与实现过程,使用C语言编程,涉及VS2017环境下的游戏逻辑实现,包括玩家与电脑对弈的功能。文章详细展示了游戏的代码结构及主要功能模块。

使用工具:VS2017

代码分为三部分 game.h(函数声明) game.c(实现函数功能) test.c(main函数)

棋盘为3*3的矩阵

规则:
1.每回合玩家与电脑只能放置一枚棋子
2.已有棋子的位置不能再放置棋子
3.若有一方的三枚棋子可连城一条直线,则胜利
4.若棋盘棋子已经布满,但是双方没有一方胜利,则平局

注:1.此程序设计的电脑走的方式是产生一个随机值作为坐标,较为简单,可改进,让电脑更加智能
2.#define _CRT_SECURE_NO_WARNINGS 这句代码是为了不让scanf 报错
game.h部分

#ifndef __GAME_H__
#define __GAME_H__

#define ROL 3  //行
#define ROW 3  //列
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include <windows.h> 


void menu(void);//开始菜单
void init(char arr[ROL][ROW], int rol, int row);//初始化数组
void checkerboard(void);//游戏棋盘
void playermove(char arr[ROL][ROW],int rol,int row);  //玩家走
void comermove(char arr[ROL][ROW], int rol, int row);  //电脑走
int win(char arr[ROL][ROW], int rol, int row);   //判断胜利

#endif // __GAME_H__

game.c部分

#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void menu(void)//开始菜单
{
    printf("************************\n");
    printf("***  1.开始  0.退出  ***\n");
    printf("************************\n\n");
}

void init(char arr[ROL][ROW], int rol, int row)//初始化数组
{
    int i = 0;
    int j = 0;
    for (i = 0; i < rol; i++)
    {
        for (j = 0; j < row; j++)
        {
            arr[i][j] = ' ';//将数组的所有元素初始化为一个空格
        }
    }
}
 void checkerboard(char arr[ROL][ROW], int rol, int row)//打印游戏棋盘
{
    int i = 0;
    for (i = 0; i < rol; i++)
    {
        printf("************************\n");
        printf("*      |       |       *\n");
        printf("*   %c  |   %c   |   %c   *\n",arr[i][0],arr[i][1],arr[i][2]);
        printf("*      |       |       *\n");
        if (2 == i)
            printf("************************\n");
    }
}

 void playermove(char arr[ROL][ROW], int rol, int row)//玩家玩
 {
     int x = -1;
     int y = -1;
     while (1)
     {
         printf("玩家走\n请输入坐标:>");
         scanf("%d%d", &x, &y);
         if ((x - 1) < rol && (x - 1) >= 0 && (y - 1) < row && (y - 1) >= 0)
         {
             if (arr[x-1][y-1] == ' ')
             {
                 arr[x - 1][y - 1] = 'X';
                 break;
             }
             else
             {
                 printf("此坐标已有棋子,请重新选择坐标!\n");
             }
         }
         else
         {
             printf("输入坐标错误!\n");
         }
     }

 }

 void comermove(char arr[ROL][ROW], int rol, int row)//电脑走
 {
     int x = -1;
     int y = -1;

     printf("电脑走:>\n");
     while (1)
     {
         x = rand() % rol;
         y = rand() % row;  //取余数是为了保证x,y在棋盘的范围内 即 0 1 2
         if (x< rol && x >= 0 && y < row && y >= 0)
         {
             if (arr[x][y] == ' ')
             {
                 arr[x][y] = '@'; //电脑的棋子用@代替
                 break;
             }
         }
     }
 }


 //判断输赢
 int win(char arr[ROL][ROW], int rol, int row)
 {
     int i = 0;
     int j = 0;
     int execute = 1;

         for (i = 0; i < rol; i++)
         {
             for (j = 0; j < row; j++)
             {
                 if (arr[i][j] == 'X'&&arr[i + 1][j + 1] == 'X'&&arr[i + 2][j + 2] == 'X'&& i<(rol-2)&& i<(row - 2)
                     || arr[i][j] == 'X'&&arr[i][j + 1] == 'X'&&arr[i][j + 2] == 'X'&&j<(row-2)
                     || arr[i][j] == 'X'&&arr[i + 1][j] == 'X'&&arr[i + 2][j] == 'X'&&i<(rol-2)
                     || arr[i][j] == 'X'&&arr[i + 1][j - 1] == 'X'&&arr[i + 2][j - 2] == 'X'&&i<(rol-2)&&(j>=2))  // 判断玩家是否赢
                 {
                     printf("恭喜你赢了!\n");
                     return 1;
                 }
             }
         }
         for (i = 0; i < rol; i++)
         {
             for (j = 0; j < row; j++)
             {
                 if (arr[i][j] == '@'&&arr[i + 1][j + 1] == '@'&&arr[i + 2][j + 2] == '@'&& i<(rol - 2) && i<(row - 2)
                     || arr[i][j] == '@'&&arr[i][j + 1] == '@'&&arr[i][j + 2] == '@'&&j<(row - 2)
                     || arr[i][j] == '@'&&arr[i + 1][j] == '@'&&arr[i + 2][j] == '@'&&i<(rol - 2)
                     || arr[i][j] == '@'&&arr[i + 1][j - 1] == '@'&&arr[i + 2][j - 2] == '@' && i<(rol - 2) && (j >= 2))// 判断电脑是否赢
                 {
                     printf("电脑赢了!\n");
                     return 1;
                 }
             }
         }

         for (i = 0; i < rol; i++)
         {
             for (j = 0; j < row; j++)
             {
                 if (arr[i][j] == ' ')
                 {
                     execute = 0;
                 }
             }
         }
         if(1 == execute)
         { 
             printf("平局!\n");
             return 1;
         }
     return 0;
 }

test.c部分

#define _CRT_SECURE_NO_WARNINGS

#include"game.h"

int main()
{
    int start = 0;
    int i = 0;
    int w = -1;
    char arr[ROL][ROW] = { 0 };
    srand((unsigned int)time(NULL));

    while(1)
    {
        if (i == 0)
        {
            menu();
            init(arr, ROL, ROW);
            printf("请选择是否开始游戏(1/0):>");
        }
         i = 1;   //i用来控制   if (i == 0)中的语句是否进行
        scanf("%d", &start);

        switch (start)
        {
        //case 1: 表示游戏开始
        //case 0: 表示退出游戏
        // default: 表示输入错误
        case 1:
            checkerboard(arr, ROL, ROW);
            while (1)
            {
                playermove(arr, ROL, ROW);
                system("cls");

                checkerboard(arr, ROL, ROW);
                system("cls");
                if(win(arr, ROL, ROW)==1)
                    {
                        i = 0;
                        break;
                    }

                comermove(arr, ROL, ROW); 
                checkerboard(arr, ROL, ROW);
                if (win(arr, ROL, ROW) == 1)
                {
                    i = 0;
                    break;
                }
            }
            break;
        case 0:
            printf("游戏退出!\n");
            system("pause");
            return 0;
            break;
        default:
            printf("输入错误!请重新输入:");
            break;
        }
    }
     return 0;
}

游戏界面
这里写图片描述

开始游戏
这里写图片描述
这里写图片描述

游戏胜利,是否再次游戏
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值