您的位置:首页 > 编程语言 > C语言/C++

C语言实现三子棋

2017-07-22 00:23 363 查看
本次程序是三子棋的简单实现,首先我们要了解三子棋的游戏规则,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();
4000

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: