**
用C语言写 三子棋游戏
**
首先,采用分文件形式编写游戏,可以使程序结构更加清晰;
代码编写思路如下:
第一在main.c中写出游戏的主要框架,包括有初始界面的菜单项和main函数:
//游戏主框架
#include "game.h"
void Menu()
{
printf("*****************************\n");
printf("**** 欢迎来到三子棋 ***\n");
printf("*****************************\n");
printf("**** 1.play 2.exit ****\n");
printf("*****************************\n");
printf("请选择:> ");
}
int main()
{
int quit = 0;
while (!quit){
Menu();
int select = 0;
scanf("%d", select);
switch (select){
case 1:
Game();
break;
case 2:
quit = 1;
break;
default:
printf("你输错了,请重新输入!\n");
break;
}
}
printf("ByeBye!\n");
system("pause");
}
第二在game.h文件中编写所有的声明,其中包含有五个需要实现的主要函数:
//所有声明
#ifndef _GAME_H_
#define _GAME_H_
#include<stdio.h>
#include<time.h>
#include<windows.h>
#pragma warning(disable:4996)
#define ROW 3
#define COL 3
#define P_COLOR 'X'
#define C_COLOR 'O'
#define INIT ' '
//初始化棋盘
void InitBoard(char board[][COL], int row, int col);
//打印棋盘
void ShowBoard(char board[][COL], int row, int col);
//电脑移动
void ComputerMove(char board[][COL], int row, int col);
//判断
char Judge(char board[][COL], int row, int col);
void Game();
#endif
第三在game.c中写所有函数的实现:
//所有实现
#include "game.h"
int true = 1;
//初始化棋盘
void InitBoard(char board[][COL], int row, int col)
{
int i = 0;
for (; i < row; i++)
{
int j = 0;
for (; j < col; j++)
{
board[i][j] = INIT; //初始化为空格
}
}
}
//打印棋盘
void ShowBoard(char board[][COL], int row, int col)
{
printf(" 1 | 2 | 3\n");
printf("--------------\n");
int i = 1;
for (; i <= row; i++){
printf("%d |", i);
int j = 0;
for (; j < col; j++){
printf("%c |", board[i - 1][j]);
}
printf("\n");
printf("--------------\n");
}
}
//电脑移动
void ComputerMove(char board[][COL], int row, int col)
{
while (1){
//随机两坐标
int x = rand() % row;
int y = rand() % col;
//检测坐标是否被占用
if (board[x][y] == ' '){
board[x][y] = C_COLOR;
break;
}
}
}
//判断——采用穷举方案 (三子棋改五子棋的核心点)
char Judge(char board[][COL], int row, int col)
{
int i = 0;
for (; i < row; i++){
if (board[i][0] != ' '&&\
board[i][0] == board[i][1] && \
board[i][1] == board[i][2]){
return board[i][0];
}
}
for (i = 0; i < row; i++){
if (board[0][i] != ' '&&\
board[0][i] == board[1][i] && \
board[1][i] == board[2][i]){
return board[0][i];
}
}
if (board[1][1] != ' '&&\
board[0][0] == board[1][1] && \
board[1][1] == board[2][2]){
return board[1][1];
}
if (board[1][1] != ' '&&\
board[0][2] == board[1][1] && \
board[1][1] == board[2][0]){
return board[1][1];
}
for (i = 0; i < row; i++){
int j = 0;
for (; j < col; j++){
if (board[i][j] == INIT){
return 'N';
}
}
}
return 'F';
}
void Game()
{
srand((unsigned long)time(NULL));
char board[ROW][COL];
InitBoard(board, ROW, COL); //初始化游戏面板
char result = 0;
do{
ShowBoard(board, ROW, COL); //显示游戏面板
printf("请落子:> ");
int x = 0;
int y = 0;
scanf("%d %d", &x, &y);
//检测落子是否越界
if (x <= 0 || x > 3 || y <= 0 || y > 3){
printf("你输入的位置有误,请重新输入!\n");
continue;
}
//检测落子合法性
if (board[x - 1][y - 1] != ' '){
printf("该位置已经被占用,请重新输入!\n");
continue;
}
board[x - 1][y - 1] = P_COLOR; //落子
result = Judge(board, ROW, COL); //判断结果
if (result != 'N'){//'N'->next,'F'->FULL,'X','O'
break;
}
ComputerMove(board, ROW, COL);
result = Judge(board, ROW, COL);
if (result != 'N'){//'N'->next,'F'->FULL,'X','O'
break;
}
} while (1);
if (result == P_COLOR){
printf("恭喜你,你赢了!\n");
}
else if (result == C_COLOR){
printf("不好意思,你输了!\n");
}
else{
printf("还不错,平局!\n");
}
printf("你玩的还不错,要不要再来一把!\n");
}
基本上的代码编写思路就是这样,细节的在代码中也标有注释,相信大家应该可以看懂。
编写过程中,重要的几个点是:(1)用C语言编写的三子棋游戏主要就是使用数组,三子棋棋盘就是运用一个二维数组表示的,通过这个游戏的编写我对数组有了更深的认识。(2)ShowBoard函数需要我们多次的运行调整,使编译出的界面更加美观;(3)Judge函数采用穷举方案 编写,同时也是三子棋改五子棋的核心点,每个棋子都有8个方向的延伸,所以五子棋的编写就是根据五子棋的游戏输赢判断规则来写,和三子棋很类似;(4)当然游戏的编写过程中自然不可避免的使用到了随机数,也是需要多加练习。(5)还有就是在落子时的判断,判断落子是否越界或者落子的地方是否已经被占用,即判断落子的合法性。