C语言—三子棋

来源:互联网 发布:网络销售的工资待遇 编辑:程序博客网 时间:2024/06/17 13:38

使用工具: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;}

游戏界面
这里写图片描述

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

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

原创粉丝点击