用C语言实现三子棋小游戏。

 

 

今天我们用C语言来实现一个小游戏 ———三子棋。

 

三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。

 

  首先,我们应该设置一个简单的菜单界面,用来实现我们进入游戏或者退出游戏。

  在这里我们用一个menu函数和printf语句来实现,如下:

void menu()
  {
            printf("*****************************\n");
            printf("****   1.play   0.exit   ****\n");
            printf("*****************************\n");
}

  接下来我们需要设计一个变量来接受玩家的选择。因为这个游戏是可以反复进行玩耍的,所以在主函数中我们要用一个do-while循环来实现:

  int  main ()
{
     int input = 0;
  do
{
    menu();
    printf("请输入一个数\n")
    scanf("%d",&input);
    switch (input)
{
    case 1:
        game();
      break;
    case 0;
        printf("退出游戏。\n");
      break;
    default;
        printf("选择错误,请重新选择。\n");
      break;   
        } 
    } while (input)
}

在这里 ,我们用了一个switch语句,当用户选择1时启动游戏。

当用户想要退出游戏时 ,即可选择0 来跳出循环结束循环。

当用户输入1,0 以外的数字时,我们应该想用户报错,所以用default来输出报错信息。

     接下来就是游戏本身了,先创建一个 game 函数 用来实现游戏的每一步,接下来我一一道来。

void game()
{
    }

首先我们需要建立一个3*3的二维字符数组,为了不限制于只在3*3的数组中玩游戏,可以有4*4  5*5 等等,我们用宏定义的方式,创建一个 game .h 的头文件 定义数组的长和宽。

#define   ROW  3
#define   COL  3

然后在game 函数中创建数组 并且画出棋盘:

​
void DisplayBoard(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++)
		{
			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");
		}
		
		
	}

​

棋盘如下图所示:

 下来我们就要让电脑和用户进行下棋设计了。

我们用’X‘来表示用户走的地方,并且不能在同一个位置重复走,这里同时也用一个while循环,代码如下:

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 <= 3 && y >= 1 && y <= 3)
		 {
			 if (board[x - 1][y - 1] == ' ')
			 {
				 board[x - 1][y - 1] = 'X';
				 break;
			 }
			 else
			 {
				 printf("坐标被占用,请重新输入:\n");
			 }

			 
		 }
		 else
		 {
			 printf("坐标有误,请重新输入:\n");
		 }
	 }
 }

电脑随机产生一个坐标,我们用 '*' 来表示。因为随机生成要用rand()函数,所以在主函数中我们要加一串srand代码。需要注意的是这里要用一个 game.h 头文件声明。

srand ((unsigned int )time (NULL))
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] = '*';
			 break;
		 }

	 }
 }

在双方都走了之后,我们需要一个IsWin()函数和一个IsFull()函数来判断谁获胜或者是否是平局。

int IsFull(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++)
			 {
				 if (board[i][j] == ' ')
					 return 0;
			 }
		 }
		 return 1;
	 }
 }
 char IsWin(char board[ROW][COL], int row, int col)
 {
	 int i = 0;
	 for (i = 0; i < row; i++)
	 {
		 if (board[i][col-1] == board[i][col-2] && board[i][col-2] == board[i][col - 3] && board[i][col - 1] != ' ')
		 {
			 return board[i][col - 1];
		 }
	 }
	 for (i = 0; i < col; i++)
	 {
		 if (board[row - 1][i] == board[row - 2][i] && board[row - 2][i] == board[row - 3][i] && board[row - 1][i] != ' ')
		 {
			 return board[row - 1][i];
		 }
	 }
	 if (board[row - 3][col - 3] == board[row - 2][col - 2] && board[row - 2][col - 2] == board[row - 1][col - 1] && board[row - 1][col - 1] != ' ')
	 {
		 return board[row - 2][col - 2];
	 }
	 else if (board[row - 1][col - 3] == board[row - 2][col - 2] && board[row - 2][col - 2] == board[row - 3][col - 1] && board[row - 3][col - 1] != ' ')
	 {
		 return  board[2][ 2];

	 }
 
	 if (IsFull(board, row, col) == 1)
	 {
		 return 'Q';
	 }
	 return ' ';
 }

这个时候程序已经基本完成了,接下来我们只需要完善 game()函数就可以了,代码如下:

void game()
{
	
	char ret = 0;
	char board[ROW][COL] = { 0 };
	InitBoard(board, ROW, COL);
	DisplayBoard(board,ROW,COL);
	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);
		if (ret != ' ')
			break;

		DisplayBoard(board, ROW, COL);

	}
	if (ret == 'X')
		printf("玩家赢。\n");
	else if (ret == '*')
		printf("电脑赢。\n");
	else if (ret == 'Q');
	    printf("平局。\n");
	DisplayBoard(board, ROW, COL);

}

到此为止,我们的三子棋小游戏已经基本完成啦,第一次写程序博客,有错误的地方请多多指教。

最后放下我自己写的三子棋代码。

第一部分  game.h头文件:

#ifndef __GAME_H__
#define __GAME_H__
#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>


#define ROW 3
#define COL 3


void InitBoard(char board[ROW][COL], int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
void PlayerMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
char IsWin(char board[ROW][COL], int row, int col);
//"x"-->玩家赢。
//"y"-->电脑赢。
// 平局。

#endif

第二部分 源文件函数部分game.h:

#include "game.h"

void InitBoard(char board[ROW][COL], int row, int col)
{
	memset(&board[0][0],' ',col*row*sizeof(board[0][0]));
}
 void DisplayBoard(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++)
		{
			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 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 <= 3 && y >= 1 && y <= 3)
		 {
			 if (board[x - 1][y - 1] == ' ')
			 {
				 board[x - 1][y - 1] = 'X';
				 break;
			 }
			 else
			 {
				 printf("坐标被占用,请重新输入:\n");
			 }

			 
		 }
		 else
		 {
			 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] = '*';
			 break;
		 }

	 }
 }
 int IsFull(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++)
			 {
				 if (board[i][j] == ' ')
					 return 0;
			 }
		 }
		 return 1;
	 }
 }
 char IsWin(char board[ROW][COL], int row, int col)
 {
	 int i = 0;
	 for (i = 0; i < row; i++)
	 {
		 if (board[i][col-1] == board[i][col-2] && board[i][col-2] == board[i][col - 3] && board[i][col - 1] != ' ')
		 {
			 return board[i][col - 1];
		 }
	 }
	 for (i = 0; i < col; i++)
	 {
		 if (board[row - 1][i] == board[row - 2][i] && board[row - 2][i] == board[row - 3][i] && board[row - 1][i] != ' ')
		 {
			 return board[row - 1][i];
		 }
	 }
	 if (board[row - 3][col - 3] == board[row - 2][col - 2] && board[row - 2][col - 2] == board[row - 1][col - 1] && board[row - 1][col - 1] != ' ')
	 {
		 return board[row - 2][col - 2];
	 }
	 else if (board[row - 1][col - 3] == board[row - 2][col - 2] && board[row - 2][col - 2] == board[row - 3][col - 1] && board[row - 3][col - 1] != ' ')
	 {
		 return  board[2][ 2];

	 }
 
	 if (IsFull(board, row, col) == 1)
	 {
		 return 'Q';
	 }
	 return ' ';
 }

第三部分  测试部分 test.h :

#include "game.h"
#include <time.h>

void meun()
{
	printf("**************************\n");
	printf("*** 1. play   0. exit ****\n");
	printf("**************************\n");
}
void game()
{
	
	char ret = 0;
	char board[ROW][COL] = { 0 };
	InitBoard(board, ROW, COL);
	DisplayBoard(board,ROW,COL);
	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);
		if (ret != ' ')
			break;

		DisplayBoard(board, ROW, COL);

	}
	if (ret == 'X')
		printf("玩家赢。\n");
	else if (ret == '*')
		printf("电脑赢。\n");
	else if (ret == 'Q');
	    printf("平局。\n");
	DisplayBoard(board, ROW, COL);

}

void test()
{ 
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		meun();
			printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0 :
			printf("退出游戏。\n");
			break;
		default:
			printf("选择错误,请重新输入:");
			break;
		}
	} while (input);
}
int main()
{
	test();
	return 0;
}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值