用C语言编写三子棋小游戏

一.前言

代码中运用多文件编码方式,调用函数,运用数组进行传参。加深对多文件编码和对数组的理解。

二.实现功能

首先给出菜单,通过用户输入指定玩游戏或者退出。当用户选择退出时,程序运行结束。当用过户选择玩游戏时,输出棋盘,用户需要输入要落子的坐标,然后电脑会随机在棋盘上落子。显示棋盘,直到棋盘上有三子连成一条线或者棋盘上下完,没有一子,三子连成一条线。输出赢家或和棋。

三.代码编写

在编写程序时,首先我们要进行主函数的编写,确定主要逻辑。代码块如下:

#include"threechess.h"

int main(){
	int quit = 0;//是否结束标志 
	while (!quit){
		Menu();
		int select = 0;
		printf("Please Enter Your Select#");
		scanf("%d", &select);
		switch (select){
		case 1:
			Game();
			break;
		case 2:
			quit = 1;
			break;
		default:
			printf("Enter error!\n");
			break;

		}


	}
	printf("Byebye!\n");
	system("pause");
	return 0;
}

在主函数中首先我们要编写一个菜单函数Menu(),供用户选择是否玩游戏。

void Menu(){
	printf("+--------------------+\n");
	printf("|-1.Play      2.Exit-|\n");
	printf("+--------------------+\n");

}

当用户选择玩游戏时,我们要进行对Game()函数的编写来确定游戏函数的编写逻辑。

首先我们要确定三子棋中棋子保存在一个二维数值中。然后要将棋盘显示并且将棋盘中的棋子初始化。当用户确定落子坐标时,我们要考虑 1.落子位置是否已经有子了,2.是否超过了棋盘。然后要进行判断,是否有三子连线,当电脑落子后也要进行这一判断。直到有人胜出或者和棋。

void Game(){
	srand((unsigned long)time(NULL));//生成随机数种子
	char board[ROW][COL];
	char result = 0;
	memset(board, INIT, sizeof(board));//将数组初始化为INIT
	while (1){
		Showboard(board, ROW, COL);
		Playmove(board, ROW, COL);
		result = Judgeboard(board, ROW, COL);
		if (result != NEXT){
			break;
		}
		Showboard(board, ROW, COL);
		Computermove(board, ROW, COL);
		result = Judgeboard(board, ROW, COL);
		if (result != NEXT){
			break;
		}

	}
	Showboard(board, ROW, COL);
	switch (result){
	case COM:
		printf("You Lose!\n");
		break;
	case PLAY:
		printf("You Win!\n");
		break;
	case DRAW:
		printf("Tie Game!\n");
		break;
	default:
		printf("BUG!\n");
		break;
	}

}

在游戏函数中
用的memset函数初始化棋盘,注意是按字节初始化的。

memset(board, INIT, sizeof(board));//将数组初始化为INIT

 void Showboard;用来展示棋盘。

static void DrawLine(int col){  //棋盘画线函数
	for (int i = 0; i < col; i++){
		printf("----");
	}
	printf("\n");
}
static void Showboard(char board[][COL],int row,int col){ //画棋盘
	system("cls");        //清屏
	printf("  ");
	for (int i = 1; i < row + 1; i++){
		printf("|%d ", i);
	}
	printf("\n");
	DrawLine(col);
	for (int i = 1; i < row + 1; i++){
		printf("%-2d", i);
		for (int j = 1; j < col+1; j++){
			printf("|%c ", board[i-1][j-1]);
		}
		printf("\n");
		DrawLine(col);
	}


}

void Computermove;函数用来电脑落子,通过电脑产生随机数对3取模,形成坐标。

static void Computermove(char board[][COL], int row, int col){//电脑下棋
	int x = 0;
	int y = 0;
	while (1){
		x = rand() % row;  //时间随机数 余3,只可能为0 1 2 
		y = rand() % col;
		if (board[x][y] == INIT){ //判断是否未落子
			break;
		}
	}
	board[x][y] = COM;
}

 char Judgeboard;此函数用来进行判断是否有三子连线,是否棋盘被下满了。若有三子相同返回对应的棋子,和棋返回‘DRAW',继续往下下返回‘NEXT’。注意相同时要去除 ‘ ’ 情况。

static char Judgeboard(char board[][COL], int row, int col){//判断情况,行 列 对角线是否有三子连线
	for (int i = 0; i < row; i++){
		if (board[i][0] == board[i][1] && \
			board[i][0] == 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[0][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[2][0] == board[1][1] && \
		board[1][1] == board[0][2] && \
		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;
}

由于运用多文件编码的方法,还需要对头文件,函数变量进行声明。

#ifndef __THREECHESS_H__//防止头文件被重复包含
#define __THREECHESS_H__

#include<stdio.h>
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#pragma warning(disable:4996)

#define ROW 3//行数
#define COL 3//列数

#define INIT ' '//棋盘初始值
#define DRAW 'P' //和局
#define COM 'X' //电脑棋子,电脑赢
#define PLAY 'O'//玩家棋子,玩家赢
#define NEXT 'N'//棋盘未下完,继续往下下

extern void Menu();
extern void Game();

#endif

如需使用直接将上面代码复制即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值