C语言实现三子棋

来源:互联网 发布:淘宝网代理加盟 编辑:程序博客网 时间:2024/05/05 23:14
本次程序是三子棋的简单实现,首先我们要了解三子棋的游戏规则,3X3的游戏格子里先,先连成一条线的获胜。

根据游戏规则,我们将其规则转换为编程,大致思路是棋盘的打印,电脑放置棋子,玩家放置棋子,对每次放置棋子进行胜负判断。棋盘为3X3,用到了我们C语言中的二维数组,还有其他的循环和判断语句,数组的合理布置和运用帮助我们很好的在一个棋盘上放置了棋子。

编写此次程序我们需要添加一个头文件来包含我们的头文件,标识符的定义,函数的声明(game.h);还需要的是两个源文件,一个负责对游戏程序的测试(test.h),一个为我们所写的游戏主程(game.h)。

首先编写我们的头文件(game.h)

#ifndef __GAME_H__           //判断头文件是否已经使用  if not define 如果没有则定义#define __GAME_H__           //定义头文件#include <stdio.h>#include <stdlib.h>#include <time.h>#include<string.h>extern void meun();extern void game();extern int Judgement();extern void Computer_Set();extern void Person_Set();extern void chessBorad();#endif //__GAME_H__

然后写入我们的测试程序(test.c),需要注意的是我们在此需要引入我们的头文件,注意头文件引入不是<>而是”“,在此说明下”“是先检测当前目录搜索头文件,<>是从系统指定目录搜索,所以不要用错。
在此我们要实现的是用户选择1进行游戏,选择0退出,其他则不能识别重新选择,需要用到while语句嵌套switch case语句。

#include"game.h"int main(){    int a;    srand((unsigned)time(NULL));                //产生一个随机数    do    {        meun();                                 //打印游戏菜单        scanf_s("%d", &a);                      //进行游戏模式选择        switch (a)        {        case 1:            game();            break;        case 0:            break;        default:            printf("输入错误请重新输入:");            break;        }    } while (a);    return 0;}

这里开始写入游戏的主要程序(game.c),此部分需要对棋盘设置和将所需要的二维数组加入在棋盘中,原理是通过对数组的赋值来进行棋子的布置,坐标的x,y相当于二位数组确定的参数。
在此需要注意的是
1.作为程序员知道数组是从0,0开始,用户可能并不明白其原理,会输入1,1,要做到用户友好,在此我们需要对输入进行处理
2.我们需要对每次输入的值进行判断,如果输入重复,则需要提示重新输入。
3.对每次如果结果进行判断,最终结果分为三种,玩家胜,电脑胜,平局。

#include"game.h"//游戏菜单设置void meun(){    printf("************************************************\n");    printf("**************     1.play     ******************\n");    printf("**************     2.exits    ******************\n");    printf("************************************************\n");}//游戏主程序void game(){    printf("------------------welcome!!!--------------------\n");    char arr[3][3];    memset(arr, ' ', sizeof(arr));                      //对数组进行初始化    chessBorad(arr);    while (1)    {        Computer_Set(arr);        int judge = Judgement(arr);                     //每次都要进行判断        if (judge == 0)        {            system("cls");                              //清空屏幕进行下一次游戏            break;         }        Person_Set(arr);        judge = Judgement(arr);        if (judge == 0)        {            system("cls");            break;        }    }}//游戏棋盘的设置,注意数组要安置在棋盘里void chessBorad(char arr[3][3]){    for (int i = 0; i < 4; i++)    {        if (i == 0)            printf("\n");        if (i>0)        for (int j = 0; j < 1; j++)        {            printf("              | %c | %c | %c |\n", arr[i - 1][j], arr[i - 1][j + 1], arr[i - 1][j + 2]);        }        printf("               --- --- ---\n");    }    printf("_________________________________________________\n");}//电脑安置棋子设置,用随机数的产生来设置void Computer_Set(char arr[3][3]){    printf("computer seted:");    while (1)    {        int a = rand() % 3;        int b = rand() % 3;        if (arr[a][b] == ' ')        {            arr[a][b] = 'O';            break;        }    }    chessBorad(arr);}//玩家放置棋子设置void Person_Set(char arr[3][3]) {    while (1)    {        printf("please input coordinate:");        int a = 0;        int b = 0;        scanf("%d %d", &a, &b);        a--;        b--;        if (((a >= 0) && (a<3)) && ((b >= 0) && (b < 3)) && (arr[a][b] == ' '))        {            arr[a][b] = 'X';            chessBorad(arr);            break;        }        else        {            printf("please try again;\n");        }    }}//胜负的判断条件int Judgement(char arr[3][3]){    if (((arr[0][0] == arr[0][1]) && (arr[0][1] == arr[0][2]) && (arr[0][0] == 'X')) ||        ((arr[1][0] == arr[1][1]) && (arr[1][1] == arr[1][2]) && (arr[1][1] == 'X')) ||        ((arr[2][0] == arr[2][1]) && (arr[2][1] == arr[2][2]) && (arr[2][2] == 'X')) ||        ((arr[0][0] == arr[1][0]) && (arr[1][0] == arr[2][0]) && (arr[2][0] == 'X')) ||        ((arr[0][1] == arr[1][1]) && (arr[1][1] == arr[2][1]) && (arr[2][1] == 'X')) ||        ((arr[0][2] == arr[1][2]) && (arr[1][2] == arr[2][2]) && (arr[2][2] == 'X')) ||        ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[2][2] == 'X')) ||        ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[2][0] == 'X')))    {        printf("you win this game.\n");        return 0;    }    if (((arr[0][0] == arr[0][1]) && (arr[0][1] == arr[0][2]) && (arr[0][0] == 'O')) ||        ((arr[1][0] == arr[1][1]) && (arr[1][1] == arr[1][2]) && (arr[1][1] == 'O')) ||        ((arr[2][0] == arr[2][1]) && (arr[2][1] == arr[2][2]) && (arr[2][2] == 'O')) ||        ((arr[0][0] == arr[1][0]) && (arr[1][0] == arr[2][0]) && (arr[2][0] == 'O')) ||        ((arr[0][1] == arr[1][1]) && (arr[1][1] == arr[2][1]) && (arr[2][1] == 'O')) ||        ((arr[0][2] == arr[1][2]) && (arr[1][2] == arr[2][2]) && (arr[2][2] == 'O')) ||        ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[2][2] == 'O')) ||        ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[2][0] == 'O')))    {        printf("you lose this game.\n");        return 0;    }    if ((arr[1][1] != ' ') && (arr[1][2] != ' ') && (arr[1][3] != ' ')        && (arr[2][1] != ' ') && (arr[2][2] != ' ') && (arr[2][3] != ' ')        && (arr[3][1] != ' ') && (arr[3][2] != ' ') && (arr[3][3] != ' '))    {        printf("draw!\n");        return 0;    }    return  1;}

程序还可以进行部分优化,对电脑的放置进行判断,比如玩家快到三个或者电脑快到三个进行判断,选择放置。可以设置不同的模式,比如玩家vs玩家,也可以优化电脑,可以选择难度,不同的难度对应不同的函数。还有需要自己的开发和思考。
程序最重要的一点是一定要注重用户友好,好的界面,好的优化,程序的效率都是需要每个程序员注重的。

                                                         Author:yk