用C语言实现三字棋,其根本就是在一个二维数组里的各种操作,在这个项目里面,我们要自己定义一个头文件:
#ifndef __GAME_H__
#define __GAME_H__
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3//设置行
#define COL 3//设置列
void InitBoard(char arr[ROW][COL], int row, int col);
void Dispiay(char arr[ROW][COL], int row, int col);
void PiayerMove(char arr[ROW][COL], int row, int col);
void ComputerMove(char arr[ROW][COL], int row, int col);
char IsWin(char arr[ROW][COL], int row, int col);
#endif
项目框架:
#include"game.h"
void menu()//声明菜单
{
printf("***************************\n");
printf("***** 0. exit *****\n");
printf("***** 1. piay *****\n");
printf("***************************\n");
}
void game()
{
int ret = 0;
char arr[ROW][COL] = {0};//定义棋盘,即二维数组
InitBoard(arr, ROW, COL);//初始化棋盘
Dispiay(arr, ROW, COL);//打印棋盘
while(1)//循环下棋过程
{
PiayerMove(arr, ROW, COL);//玩家走
ret = IsWin(arr, ROW, COL);//判断输赢
Dispiay(arr, ROW, COL);//打印移动之后的棋盘
if(ret != 'j')
break;
ComputerMove(arr, ROW, COL);//电脑走
ret = IsWin(arr, ROW, COL);//判断输赢
Dispiay(arr, ROW, COL);
if(ret != 'j')
break;
}
if(ret == 'x')
printf("玩家赢\n");
else if(ret == '0')
printf("电脑赢\n");
else
printf("平局\n");
}
//1.玩家赢 'x'
//2.电脑赢 '0'
//3.平局 'p'
//4.继续游戏 'j'
int main()
{
int input = 0;
srand((unsigned)time(NULL));
do
{
menu();
printf("请选择:->");
scanf("%d", &input);
switch(input)
{
case 0:
printf("退出游戏\n");
break;
case 1:
game();
break;
default:
printf("输入错误,请重新输入\n");
break;
}
}while(input);
return 0;
}
具体实现:
#include"game.h"
void InitBoard(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 Dispiay(char arr[ROW][COL], int row, int col)//打印棋盘
{
int i = 0;
int j = 0;
for(i = 0; i < row; i++)
{
int j = 0;
for(j = 0; j < col; j++)
{
printf(" %c ",arr[i][j]);
if(j < col-1)
printf("|");
}
printf("\n");
if(i < row-1)
for(j = 0; j < col; j++)
{
printf("---");
if(j < col-1)
printf("|");
}
printf("\n");
}
}
void PiayerMove(char arr[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家走->\n");
while(1)
{
printf("请输入坐标:");
scanf("%d%d", &x, &y);
if(x>=1 && x<=row && y>=1 && y<=col)
{
if(arr[x-1][y-1] == ' ')
{
arr[x-1][y-1] = 'X';
break;
}
else
{
printf("坐标被占用\n");
}
}
else
{
printf("坐标不合法,请重新输入:\n");
}
}
}
void ComputerMove(char arr[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑走->\n");
while(1)
{
x = rand()%ROW;
y = rand()%COL;
if(arr[x][y] == ' ')
{
arr[x][y] = '0';
break;
}
}
}
static int IsFull(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++)
{
if (arr[i][j] == ' ')
return 0;
}
}
return 1;
}
char IsWin(char arr[ROW][COL], int row, int col)//判断输赢
{
int i = 0;
for(i = 0; i < row; i++)
{
if(arr[i][0]==arr[i][1] && arr[i][0] == arr[i][2] && arr[i][0] != ' ')
return arr[i][0];
}
for(i = 0; i < col; i++)
{
if(arr[0][i]==arr[1][i] && arr[0][i] == arr[2][i] && arr[0][i] != ' ')
return arr[0][i];
}
if(arr[0][0]==arr[1][1] && arr[1][1]==arr[2][2] && arr[0][0] != ' ')
return arr[1][1];
if(arr[0][2]==arr[1][1] && arr[1][1]==arr[2][0] && arr[1][1] != ' ')
return arr[1][1];
if(IsFull(arr, row, col))
return 'p';//平局
return 'j';//继续
}