三子棋代码实现(C语言版本)

三子棋是一个非常简单的小游戏,类似于上学时期我们无聊时画在纸上的一个”井“字格,如何和同桌下棋的游戏。棋盘呈横三行列,纵三列分布,为九宫格样式。因为棋盘结构简单,所以在没有制式棋盘时,我们甚至可以随手拿笔画一个简易棋盘来进行游戏,而这最大的好处就是随便找个地方就可以玩这个简单而有趣的游戏了。现在,我们用电脑程序来实现一下吧。

一.整体思路

我们设计了玩家与电脑分别下棋,谁的棋子先连到三个,谁就获胜的机制。

1.设计主函数test.c

这里面包括对游戏的整体设计及其游戏开始的界面(就是与玩家交互的部分)。

(1)开始的界面

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"
void menu()
{
	printf("*********************\n");
	printf("******  1.play  ******\n");
	printf("******  0.exit  ******\n");
	printf("*********************\n");

}

实现的结果如下

当玩家选择1时进入名为game的函数。

(2)游戏整体设计在名为test的函数中,并且main函数主要实现此函数。

void game()
{
	char board[ROW][COL], ret;
	init_board(board, ROW, COL);
	print_board(board, ROW, COL);
	while (1)
	{
		player_move(board, ROW, COL);
		print_board(board, ROW, COL);
		//判断输赢
		ret = is_win(board, ROW, COL);
		if (ret != 'C') { break; }
		computer_board(board, ROW, COL);
		print_board(board, ROW, COL);
		//判断:电脑?玩家?平局?继续?
		ret = is_win(board, ROW, COL);
		if (ret != 'C') { break; }
	}

	if (ret == '*') {
		printf("恭喜玩家赢了!");
	}
	else if (ret == '+') {
		printf("恭喜电脑赢了!");
	}
	else	if (ret == 'Q') {
		printf("平局!");
	}
}

void test() {
	srand(time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game(); break;
		case 0:
			printf("退出!\n"); break;
		default:
			printf("错误\n");
		}
	} while (input);
}

int main()
{
	test();      
	return 0;
}

2. 具体游戏的实现game.c

游戏部分主要分为初始化数组、打印棋盘、玩家下棋、电脑下棋、判断输赢这几个板块。我们设计了几个具体函数来实现。

(1).函数的声明我们放在了头文件game.h中。

game.h

#pragma once
#define ROW 3
#define COL 3

void print_board(char board[ROW][COL], int row, int col);
void init_board(char board[ROW][COL], int row, int col);
void player_move(char board[ROW][COL], int row, int col);
void computer_board(char board[ROW][COL], int row, int col);
char is_win(char board[ROW][COL], int row, int col);

(2)初始化一个数组用来确定下棋的位置

game .c文件中

void init_board(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++)
     {
 			board[i][j] = ' ';
     }
   }
}

(3)打印棋盘

void print_board(char board[ROW][COL], int row, int col) 
	{
		int i = 0;
		for (i = 0; i < row; i++)
		{
			//printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
			int j = 0;
			for (j = 0; j < col; j++)
			{
				printf(" %c ", board[i][j]);
				printf("|");
			}
			printf("\n");

			if (i < row - 1)
				//printf("---|---|---\n");
			{
				for (j = 0; j < col; j++)
				{
					printf("---");
					if (j < col - 1)printf("|");
				}
				printf("\n");
			}
		}
	}

(4)玩家下棋

void player_move(char board[ROW][COL], int row, int col)
{
	printf("下棋\n请输入你要下的位置\n");
	int x = 0, y = 0;
	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] = '*';
		}
		else
		{
			printf("坐标被占用,请重新输入\n");
		}
	}
	else
		printf("坐标非法,超出范围");
}

(5)电脑下棋

void computer_board(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;
			}
		}
	
}

(6)判断输赢

char is_win(char board[ROW][COL], int row, int col)
{
	//1,判断输赢
	//2,判断平局
	//3,游戏继续
	int i = 0;
	//行
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
		{
			return board[i][0];
		}
	}
	//列
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != ' ')
		{
			return board[0][i];
		}
	}
	//对角线
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
		return board[1][1];
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
		return board[1][1];

	//判断平局
	if (Is_full(board, row, col) == 1)
	{
		return 'Q';
	}
	//继续
	return 'C';
}
int Is_full(char board[ROW][COL], int row, int col) {
	int i, j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				return 0;     //棋盘未满
		}
	}
	return 1;   //棋盘满


}
		

二.实现结果

总而言之,大概就是做了一个控制台的小游戏,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以回答这个问题。以下是一个简单的C语言实现单人三子棋游戏的代码: ```c #include <stdio.h> #include <stdlib.h> #define BOARD_SIZE 3 void init_board(char board[][BOARD_SIZE]); void print_board(char board[][BOARD_SIZE]); int make_move(char board[][BOARD_SIZE], int row, int col, char player_char); int check_win(char board[][BOARD_SIZE], char player_char); int main() { char board[BOARD_SIZE][BOARD_SIZE]; int row, col, win; char player_char = 'X'; init_board(board); print_board(board); while (1) { printf("\nPlayer %c's turn.\n", player_char); printf("Enter row number: "); scanf("%d", &row); printf("Enter column number: "); scanf("%d", &col); if (make_move(board, row, col, player_char)) { print_board(board); win = check_win(board, player_char); if (win) { printf("\nPlayer %c wins!\n", player_char); break; } player_char = (player_char == 'X') ? 'O' : 'X'; } else { printf("Invalid move. Try again.\n"); } } return 0; } void init_board(char board[][BOARD_SIZE]) { int i, j; for (i = 0; i < BOARD_SIZE; i++) { for (j = 0; j < BOARD_SIZE; j++) { board[i][j] = '-'; } } } void print_board(char board[][BOARD_SIZE]) { int i, j; printf("\n"); for (i = 0; i < BOARD_SIZE; i++) { for (j = 0; j < BOARD_SIZE; j++) { printf("%c ", board[i][j]); } printf("\n"); } } int make_move(char board[][BOARD_SIZE], int row, int col, char player_char) { if (row < 0 || row >= BOARD_SIZE || col < 0 || col >= BOARD_SIZE || board[row][col] != '-') { return 0; } board[row][col] = player_char; return 1; } int check_win(char board[][BOARD_SIZE], char player_char) { int i, j; int row_win, col_win, diag_win1, diag_win2; for (i = 0; i < BOARD_SIZE; i++) { row_win = 1; col_win = 1; for (j = 0; j < BOARD_SIZE; j++) { if (board[i][j] != player_char) { row_win = 0; } if (board[j][i] != player_char) { col_win = 0; } } if (row_win || col_win) { return 1; } } diag_win1 = 1; diag_win2 = 1; for (i = 0; i < BOARD_SIZE; i++) { if (board[i][i] != player_char) { diag_win1 = 0; } if (board[i][BOARD_SIZE-1-i] != player_char) { diag_win2 = 0; } } if (diag_win1 || diag_win2) { return 1; } return 0; } ``` 这个程序实现了基本的单人三子棋游戏,并且包括了判断胜负的函数。您可以根据需要修改和扩展此代码

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值