C语言_三子棋小游戏

三子棋(c语言版)

游戏是在3*3的棋盘上输入坐标,其主要功能有:
(1),玩家走
(2),电脑走
(3),打印棋盘
(4),判断输赢
(5),判断是不是平局
头文件一个,game.h
源文件有2个,分别是test.c 和 game.c
代码如下:

game.h(头文件)

//三子棋游戏
# ifndef __GAME_H__
#define __GAME_H__

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

# define H 3
# define L 3

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);//判断输赢

#endif

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");
			//empty (arr, H, L);
			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';
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值