三子棋(c语言版)
游戏是在3*3的棋盘上输入坐标,其主要功能有:
(1),玩家走
(2),电脑走
(3),打印棋盘
(4),判断输赢
(5),判断是不是平局
头文件一个,game.h
源文件有2个,分别是test.c 和 game.c
代码如下:
game.h(头文件)
//三子棋游戏
void display_board (char arr[H][L], int h, int l);//打印棋盘
void player_move(char arr[H][L], int h, int l);//玩家走
void computer_move(char arr[H][L], int h, int l);//电脑走
char is_win (char arr[H][L], int h, int l);//判断输赢
test.c(主要是测试游戏功能)
#include <stdio.h>
#include "game.h"
void menu ()
{
printf ("*********************************\n");
printf ("****** 五子棋游戏 *******\n");
printf ("******** 1、开始游戏 ********\n");
printf ("******** 0、结束游戏 ********\n");
printf ("*********************************\n");
}
void empty (char arr[H][L], int h, int l)
{
int i = 0, j = 0;
for (i=0; i<H; i++)
{
for (j=0; j<L; j++)
{
arr[i][j] = ' ';
}
}
}
void game ()
{
int i = 0, j = 0;
char ret = '0';
char arr[H][L] = {'0'};
empty (arr, H, L);
display_board(arr, H, L);
while (1)
{
player_move(arr,H,L);
display_board(arr, H, L);
ret = is_win(arr, H, L);
if (ret == 'X')
{
printf ("玩家赢\n");
break;
}
else if (ret == 'P')
{
printf ("平局\n");
empty (arr, H, L);
break;
}
computer_move(arr, H, L);
display_board(arr, H, L);
ret = is_win(arr, H, L);
if (ret == '0')
{
printf("电脑赢\n");
break;
}
else if (ret == 'P')
{
printf ("平局\n");
empty (arr, H, L);
break;
}
}
}
int main()
{
int input = 0;
srand ((unsigned) time (NULL));
do
{
menu ();
printf ("请选择1(play)/0(exit):\n");
scanf ("%d",&input);
switch (input)
{
case 0:printf ("结束游戏\n");
break;
case 1:
game ();
break;
default :printf ("输入错误\n");
break;
}
} while(input);
system ("pause");
return 0;
}
game.c(游戏的主要代码)
#include "game.h"
void display_board (char arr[H][L],int h,int l)
{
int i, j;
for (i=0; i<h; ++i)
{
for (j=0; j<l; ++j)
{
printf (" %c ",arr[i][j]);
if (j<(l-1))
{
printf ("|");
}
}
printf ("\n");
if (i < (h-1))
{
for (j=0; j<h; ++j)
{
printf ("--- ");
}
printf ("\n");
}
}
}
void player_move(char arr[H][L], int h, int l)
{
int a = 0, b = 0;
printf ("请输入你要走的坐标:\n");
while (1)
{
scanf ("%d%d",&a,&b);
if ((a>0&&a<=h) && (b>0&&b<= l))
{
if(arr[a-1][b-1] == ' ')
{
arr[a-1][b-1] = 'X';
break;
}
else
{
printf ("该坐标已经被占用,请重新输入:\n");
}
}
else
{
printf ("非法坐标,请重新输入:\n");
}
}
}
void computer_move(char arr[H][L], int h, int l)
{
while (1)
{
int i = (rand ()) % 3;
int j = (rand ()) % 3;
if(arr[i][j] == ' ')
{
arr[i][j] = '0';
printf ("电脑走的坐标:%d %d\n",i+1,j+1);
break;
}
}
}
char is_win(char arr[H][L], int h, int l)
{
int i = 0, j = 0, count1, count2, count3, count4 ;
for (i=0;i<h;++i)
{
count1 = 0;
for (j=0; j<l-1; ++j)
{
if (arr[i][j] == arr[i][j+1])
{
count1 ++;
if (count1 == l-1)
{
return arr[i][j];
}
}
}
}
for (i=0;i<l;++i)
{
count2 = 0;
for (j=0; j<h-1; ++j)
{
if (arr[j][i] == arr[j+1][i])
{
count2 ++;
if (count2 == h-1)
{
return arr[j][i];
}
}
}
}
count3=0;
for (i=0; i<l-1;++i)
{
if (arr[i][i] == arr[i+1][i+1])
count3 ++;
if (count3 == l-1)
return arr[i][i];
}
i = l-1;
j = 0;
count4 = 0;
while (i>=0)
{
if (arr[i][j] == arr[i-1][j+1])
{
count4 ++;
}
if (count4 == l-1)
{
return arr[i][j];
}
i--;
j++;
}
for (i=0; i<h; ++i)
{
for (j=0; j<l; ++j)
{
if (arr[i][j] == ' ')
return '1';
}
}
return 'P';
}