## C语言——三子棋小游戏 ##
在编写三子棋这个游戏的时候,需要两个文件,分别为头文件与定义文件。这里有几个地方需要拓展:
1、为了打印出来的棋盘可以随意改变,只需要用到define定义的标识符常量,在头文件中改变这两个量,就会打印出你想要的棋盘;
2、在开始游戏以后,应该选择电脑与玩家谁先开始游戏;
3、及时打印的棋盘为5*5,依旧是三子棋的玩法。
注意:电脑走的是字符0,玩家走的是*。
头文件(起名字为game.h)如下:
#ifndef __GAME_H__
#define __GAME_H__
#include <stdio.h>
#include <string.h>
#include<time.h>
#include<stdlib.h>
#define ROW 5
#define COL 5
void InitBoard(char board[ROW][COL], int row, int col);//初始化棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);//打印棋盘
void ComputerMove(char board[ROW][COL], int row, int col);//电脑走
void PlayerMove(char board[ROW][COL], int row, int col);//玩家走
char IsWin(char board[ROW][COL], int row, int col);//判断有没有赢
#endif //__GAME_H__
定义文件(起名字为game.c)如下:
#include "game.h"
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
/*for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
board[i][j] = ' ';
}
}*/
memset(board, ' ', row*col*sizeof(board[0][0]));//memset()清空数组
}//初始化数组,使全部都是空格。
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for(i=0; i<row; i++)
{
int j = 0;
for(j=0; j<col; j++)
{
printf(" %c ",board[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 ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑走:>\n");
while(1)
{
x = rand()%row;//电脑生成的随机数(横坐标)
y = rand()%col;//(纵坐标)
if(board[x][y] == ' ')
{
board[x][y] = '0';//电脑走‘0’
break;
}
}
}
static int IsFull(char board[ROW][COL], int row, int col)//static修饰一个函数时,函数失去了外部链接属性,只能在当前源文件内部使用,减小了命名冲突
{
int i = 0;
int j = 0;
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
if(board[i][j] == ' ')
return 0;//没有满
}
}
return 1;//满了
}
void PlayerMove(char board[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(board[x-1][y-1] == ' ')
{
board[x-1][y-1] = 'X';//玩家走‘X’
break;
}
else
{
printf("坐标已被占用,请重新走\n");
}
}
else
{
printf("坐标非法\n");
}
}
}
char IsWin(char board[ROW][COL], int row, int col)//输赢的判断
{
int i = 0;
int j = 0;
for(i=0; i<row; i++)
{
for(j=1; j<col-1; j++)
{
if((board[i][j-1] == board[i][j]) && (board[i][j] == board[i][j+1]) && board[i][j] != ' ')
{
return board[i][j];
}
}
}
for(i=1; i<row-1; i++)
{
for(j=1; j<col-1; j++)
{
if((board[i][j] == board[i-1][j-1]) && (board[i][j] == board[i+1][j+1]) && board[i][j] != ' ')
{
return board[i][j];
}
}
}
for(j=0; j<col; j++)
{
for(i=0; i<row-2; i++)
{
if((board[i][j] == board[i+1][j]) && (board[i][j] == board[i+2][j]) && board[i][j] != ' ')
{
return board[i][j];
}
}
}
for(i=1; i<row-1; i++)
{
for(j=1; j<col-1; j++)
{
if((board[i][j] == board[i-1][j+1]) && (board[i][j] == board[i+1][j-1]) && board[i][j] != ' ')
{
return board[i][j];
}
}
}
//判断是否平局
if(IsFull(board, row, col))
{
return 'P';
}
//如果没有返回,则游戏继续
return ' ';
}
重新建立一个头文件叫test.c,用于测试游戏,代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{
printf("***********************************\n");
printf("********* 1. play *********\n");
printf("********* 0. exit *********\n");
printf("***********************************\n");
}
void game()
{
char ret = '0';
char board[ROW][COL] = {0};
int input = 0;
printf("请选择谁先走:>\n");
printf("1.电脑先走 2.玩家先走\n");
scanf("%d", &input);
InitBoard(board, ROW, COL);//初始化棋盘
switch(input)
{
case 1:
while(1)
{
ComputerMove(board, ROW, COL);
//走完一步判断输赢
ret = IsWin(board, ROW, COL);//玩家赢'X',电脑赢'0',平局'P',游戏继续' '
if(ret != ' ')
{
//break;
}
DisplayBoard(board, ROW, COL);
PlayerMove(board, ROW, COL);
//走完一步判断输赢
ret = IsWin(board, ROW, COL);
if(ret != ' ')
{
//break;
}
DisplayBoard(board, ROW, COL);
}
break;
case 2:
while(1)
{
PlayerMove(board, ROW, COL);
//走完一步判断输赢
ret = IsWin(board, ROW, COL);
if(ret != ' ')
{
break;
}
DisplayBoard(board, ROW, COL);
ComputerMove(board, ROW, COL);
//走完一步判断输赢
ret = IsWin(board, ROW, COL);//玩家赢'X',电脑赢'0',平局'P',游戏继续' '
if(ret != ' ')
{
break;
}
DisplayBoard(board, ROW, COL);
}
break;
default:
break;
}
if(ret == 'P')
{
printf("平局!\n");
DisplayBoard(board, ROW, COL);
}
else if(ret == 'X')
{
printf("玩家赢!\n");
DisplayBoard(board, ROW, COL);
}
else if(ret == '0')
{
printf("电脑赢!\n");
DisplayBoard(board, ROW, COL);
}
}
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:> ");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
}while(input);
}
int main()
{
test();
return 0;
}
这样三子棋就写好了,可以试玩一下!