三子棋程序的编写

Posted 木木林Violet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三子棋程序的编写相关的知识,希望对你有一定的参考价值。

三子棋程序的编写

三子棋是我们每个人在小的时候,和朋友休闲娱乐时,必不可少的一项,本文将会介绍三子棋代码详细的编写过程,但因博主水平有限,暂时还无法实现通过鼠标点击的方式来实现,则暂时使用键盘输入的方式,来实现下棋点位的确定。

大致框架

在正式写程序钱,我们要有一个大概的框架,先编写功能函数,再编写主程序来调用功能函数来实现目标。

首先,我们需要有一个目录,玩家通过输入目录所显示的数字,来实现不同的功能。然后需要显示棋盘,玩家通过输入相应的坐标,来定位到相应的位置,然后计算机判断玩家是否胜利,若玩家胜利,则告诉玩家胜利,接着显示目录,让玩家判断其是否要继续游玩。若并未判断出玩家胜利,则让电脑输出一个随机坐标,后判断电脑是否胜利,若电脑胜利,则输出电脑胜利,后面的操作同玩家胜利。若直到无空位可下时,仍未判断出胜负,则判为平局,后面的操作同玩家胜利。

因此,我们目前判断出需要的功能函数有:执行游戏的函数Game,显示目录的函数Menu,显示棋盘的函数ShowBoard,执行玩家输入操作的函数PlayerMove,执行电脑输入操作的函数ComputerMove,判断是否胜利的函数IsEnd,基本需要的函数就是这些。但若想多次游玩游戏,则需要一个函数InitBoard来初始化所有数据。到此,所有我们需要的函数则构思完毕,现在则将所有函数具体实现,因Game函数需要调用其他的函数模块,所最后编写。

功能函数

显示目录的函数Menu

在目录中,需要提供玩家选项来让玩家选择,是游玩游戏,还是直接退出。

static void Menu()

	printf("+-------------------------------+\\n");
	printf("| 1. Play              0. Exit  |\\n");
	printf("+-------------------------------+\\n");

显示棋盘的函数ShowBoard

在每次显示棋盘时,先执行一次清屏操作,去除掉之前显示的棋盘。再通过遍历数组的方式,显示棋盘及棋盘不同位置相应的坐标。同时,定义宏定义,INIT代表空白,WHITE代表玩家所下的棋,BLACK代表电脑下的棋。

#define ROW 3
#define COL 3
#define INIT ' '//空白
#define WHITE 'X' //玩家
#define BLACK 'O' //电脑

static void ShowBoard(char board[][COL], int row, int col)

	system("cls");//清屏操作
	printf(" ");
	for (int i = 0; i < col; i++)
		printf("%4d", i+1);//输出坐标的横坐标
	
	printf("\\n--------------\\n");
	for (int i = 0; i < row; i++)
		printf("%-2d", i+1);// 输出坐标的纵坐标
		for (int j = 0; j < col; j++)
			printf("| %c ", board[i][j]); //棋盘每个点位的占用情况
		
		printf("\\n--------------\\n");
	

执行玩家输入操作的函数PlayerMove

在玩家输入相应的坐标后,判断玩家输入的坐标是否合法,即判断玩家输入的坐标是否在正确的范围内,再判断玩家输入的坐标是否已被占用,若输入的坐标没有问题,则存储玩家输入的数据。

#define ROW 3
#define COL 3
#define INIT ' '//空白
#define WHITE 'X' //玩家
#define BLACK 'O' //电脑

static void PlayerMove(char board[][COL], int row, int col)

	int x = 0;
	int y = 0;
	while (1)
		printf("Please Enter Postion<x,y># ");
		scanf("%d %d", &x, &y);
		if (x < 1 || y < 1 || x > 3 || y > 3)//判断玩家输入的坐标是否合法
			printf("Enter Postion Error!\\n");
			continue;
		
		if (board[x - 1][y - 1] == INIT)//判断玩家输入的坐标是否已被占用
			board[x - 1][y - 1] = WHITE;//存入玩家数据
			break;
		
		else
			printf("Postion Is Not Empty!\\n");
		
	

执行电脑输入操作的函数ComputerMove

电脑的数据来自随机数,判断随机数所指向的位置是否被占用即可。

#define ROW 3
#define COL 3
#define INIT ' '//空白
#define WHITE 'X' //玩家
#define BLACK 'O' //电脑

static void ComputerMove(char board[][COL], int row, int col)

	while (1)
		int x = rand() % row;
		int y = rand() % col;//将行和列赋予随机数
		if (board[x][y] == INIT)//判断所指向的位置是否被占用
			board[x][y] = BLACK;
			break;
		
	

判断是否胜利的函数IsEnd

遍历所有胜利的情况,即每行,每列及对角线三子连珠的情况。

#define ROW 3
#define COL 3
#define INIT ' '//空白
#define WHITE 'X' //玩家
#define BLACK 'O' //电脑
#define DRAW 'D'//胜利
#define NEXT 'N'//继续

static char IsEnd(char board[][COL], int row, int col)

	for (int i = 0; i < row; i++)
		if (board[i][0] == board[i][1] && \\
			board[i][1] == board[i][2] && \\
			board[i][0] != INIT)
			return board[i][0];
		
	

	for (int j = 0; j < COL; j++)
		if (board[0][j] == board[1][j] && \\
			board[1][j] == board[2][j] && \\
			board[0][j] != INIT)
			return board[0][j];
		
	
	if (board[0][0] == board[1][1] && \\
		board[1][1] == board[2][2] && \\
		board[1][1] != INIT)
		return board[1][1];
	
	if (board[0][2] == board[1][1] && \\
		board[1][1] == board[2][0] && \\
		board[1][1] != INIT)
		return board[1][1];
	
	for (int i = 0; i < row; i++)
		for (int j = 0; j < col; j++)
			if (board[i][j] == INIT)
				return NEXT;//继续
			
		
	
	return DRAW;//已判断出胜利

初始化数据的函数InitBoard

遍历数组,将数组中所有数据存为空白。

#define ROW 3
#define COL 3
#define INIT ' '//空白
#define WHITE 'X' //玩家
#define BLACK 'O' //电脑

static void InitBoard(char board[][COL], int row, int col)

	for (int i = 0; i < row; i++)
		for (int j = 0; j < col; j++)
			board[i][j] = INIT;//将数组中数据清空
		
	

执行游戏的函数Game

首先需要创建一个函数来记录每个位置的情况,并初始化,后进入循环反复执行游戏游玩的相关程序。先显示键盘,后让玩家输入,判断是否胜利,若胜利,则退出循环,若并未胜利,则继续显示棋盘,电脑进行输入,判断电脑是否胜利,若胜利,则退出循环,若并未胜利,则继续执行循环。若因为玩家胜利或者电脑胜利,再或者平局,退出了循环,则判断退出循环的原因,并执行相关显示结束循环的输出程序。

#define ROW 3
#define COL 3
#define INIT ' '//空白
#define WHITE 'X' //玩家
#define BLACK 'O' //电脑
#define DRAW 'D'//胜利
#define NEXT 'N'//继续

void Game()

	char board[ROW][COL];
	InitBoard(board, ROW, COL);

	srand((unsigned long)time(NULL));
	char result = 0;
	while (1)
		ShowBoard(board, ROW, COL);
		PlayerMove(board, ROW, COL);
		result = IsEnd(board, ROW, COL);
		if (result != NEXT)
			break;
		
		ShowBoard(board, ROW, COL);
		ComputerMove(board, ROW, COL);
		result = IsEnd(board, ROW, COL);
		if (result != NEXT)
			break;
		
	
	ShowBoard(board, ROW, COL);
	switch (result)
	case WHITE:
		printf("You Win!\\n");
		break;
	case BLACK:
		printf("You Lose!\\n");
		break;
	case DRAW:
		printf("You == Computer!\\n");
		break;
	default:
		printf("BUG!\\n"); //Do Nothing!
		break;
	

主调函数main函数

到此,所有需要的功能都编写完成,再继续在main函数中编写进入游戏前的程序。

int main()

	int select = 0;
	int quit = 0;
	while (!quit)
		Menu();
		printf("Please Select# ");
		scanf("%d", &select);
		switch (select)
		case 1:

			Game();
			break;
		case 0:
			quit = 1;
			break;
		default:
			printf("Enter Error, Try Again!\\n");
			break;
		
	
	printf("ByeBye!\\n");
	system("pause");
	return 0;

至此,所有三子棋的程序都已经编写完毕,后面为将前面所有代码合在一起的结果。其中game.h文件中,主要为宏定义和函数的声明;game.c文件中为所有功能函数的编写;main.c文件中为主调函数的编写。

合集

game.c文件

#ifndef __GAME_H__
#define __GAME_H__

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

#define ROW 3
#define COL 3
#define INIT ' '
#define WHITE 'X' //Player
#define BLACK 'O' //Computer
#define DRAW 'D'
#define NEXT 'N'

#pragma warning(disable:4996)

extern void Game();

#endif

game.c文件


#include "game.h"

void Menu()

	printf("+-------------------------------+\\n");
	printf("| 1. Play              0. Exit  |\\n");
	printf("+-------------------------------+\\n");


static void ShowBoard(char board[][COL], int row, int col)

	system("cls");
	printf(" ");
	for (int i = 0; i < col; i++)
		printf("%4d", i+1);
	
	printf("\\n--------------\\n");
	for (int i = 0; i < row; i++)
		printf("%-2d", i+1); //2
		for (int j = 0; j < col; j++)
			printf("| %c ", board[i][j]); //12
		
		printf("\\n--------------\\n");
	


static void PlayerMove(char board[][COL], int row, int col)

	int x = 0;
	int y = 0;
	while (1)
		printf("Please Enter Postion<x,y># ");
		scanf("%d %d", &x, &y);
		if (x < 1 || y < 1 || x > 3 || y > 3)
			printf("Enter Postion Error!\\n");
			continue;
		
		if (board[x - 1][y - 1] == INIT)
			board[x - 1][y - 1] = WHITE;
			break;
		
		else
			printf("Postion Is Not Empty!\\n");
		
	


static void ComputerMove(char board[][COL], int row, int col)

	while (1)
		int x = rand() % row;
		int y = rand() % col;
		if (board[x][y] == INIT)
			board[x][y] = BLACK;
			break;
		
	


static char IsEnd(char board[][COL], int row,以上是关于三子棋程序的编写的主要内容,如果未能解决你的问题,请参考以下文章

三子棋初稿

童年回忆《三子棋》

三子棋游戏

C语言初阶《三子棋》

C语言初阶《三子棋》

P1838 三子棋I