c语言—三子棋

使用工具:VS 2012
要如何实现三子棋?

1.用什么来实现三子棋的棋盘??

2.如何将三子棋的棋盘打印出来??

3.如何实现玩家和电脑的每一步棋??

4.如何检测哪一方的输赢??

5.打印菜单

1.用一个二维数组来实现三子棋的棋盘

char arr[ROW][COL] = { 0 };

2.打印棋盘
在这里插入图片描述
打印一个3×3棋盘,实现代码:

void checkerboard(char arr[ROW][COL], int row, int col)//游戏棋盘
{
	int i = 0;
	for (i = 0; i < row; 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");
	}
}

3.实现玩家出棋:(A)

(1.)在出棋时我们必须考虑两种情况:

a.棋子是否出界

b.棋子是否重复已经有的位置

(2.)玩家出棋的思维和程序员不一样必须考虑到是从下标1开始而不是0

实现电脑出棋:(B)
(1.)电脑出棋必须是随机的(这里我们用rand函数来实现)

srand((unsigned int)time(NULL));

(2.)在出棋时我们必须考虑两种情况:

a.棋子是否出界

b.棋子是否重复已经有的位值

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

 }

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

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

4.判断输赢
(1)判断玩家是否赢
(2)判断电脑是否赢
(3)平局

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

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

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

5.菜单

void menu(void)
{
     printf("---------------------------\n");
	 printf("丨    三 子 棋 游 戏     丨\n");
	 printf("\n");
	 printf("丨     1. 开始游戏       丨\n");
	 printf("\n");
	 printf("丨     0. 退出游戏       丨\n");
	 printf("---------------------------\n");
}

在这里插入图片描述
完整代码分为三部分 game.h(函数声明) game.c(实现函数功能) test.c(main函数)
game.h

#ifndef __GAME_H__
#define __GAME_H__

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3

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

#endif 

game.c

#include "game.h"
void menu(void)
{
     printf("---------------------------\n");
	 printf("丨    三 子 棋 游 戏     丨\n");
	 printf("\n");
	 printf("丨     1. 开始游戏       丨\n");
	 printf("\n");
	 printf("丨     0. 退出游戏       丨\n");
	 printf("---------------------------\n");
}

void init(char arr[ROW][COL], int row, int col)//初始化数组
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            arr[i][j] = ' ';//将数组的所有元素初始化为一个空格
        }
    }
}

void checkerboard(char arr[ROW][COL], int row, int col)//游戏棋盘
{
	int i = 0;
	for (i = 0; i < row; 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[ROW][COL], int row, int col)//玩家走
 {
     int x = -1;
     int y = -1;
     while (1)
     {
         printf("玩家走\n请输入坐标:>");
         scanf("%d%d", &x, &y);
         if ((x - 1) < row && (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[ROW][COL], int row, int col)//电脑走
 {
     int x = -1;
     int y = -1;

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

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

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

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

test.c

#include "game.h"
int main()
{
	int i = 0;
	int start = 0;
    char arr[ROW][COL] = { 0 };
    srand((unsigned int)time(NULL));

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

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

                checkerboard(arr, ROW, COL);
                if(win(arr, ROW, COL)==1)
                    {
                        i = 0;
                        break;
                    }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值