井字棋游戏的实现和注意细节

大家好,今天我们来写一个程序实现井字棋游戏

首先是主函数

#include<stdio.h>
#include<Windows.h>
include<time.h>
#define row 3
#define col 3
int main(){
	int choice;
	int board[row][col]={0};
	while(1){
		
		printf("**********************************\n");
		printf("          井字棋游戏              \n");
		printf("          1.游玩 2.退出           \n");
		printf("          请输入你的选择          \n");
	    printf("**********************************\n");
		scanf("%d",&choice);
		system("cls");
		
		if(choice==1){
			printf("start game\n");
			game();
			
			
			
		} 
		else if(choice==0){
			printf("爱玩不玩");
			break; 
		}
		else{
			printf("输入错误 请重新输入\n");
			Sleep(2);
			system("cls");
			
		} 
		
	}
	return 0; 
	
	
}

主函数不易包含过多的代码以便更好的理解程序,这里的主函数主要实现的是游戏的多次游玩选择和主页面的设计(不算太美观);

接下来是游戏的主体函数game();可以将他令放入game.c中,并用game.h声明他所使用到的构造函数实现代码的进一步简化;

void game(){
	initial_board(board);
	
	while(judge(board)){
		displayboard(board);
		playergo(board);
		if(judge(board)==0)
		break; 
		
		computergo(board);
	    	if(judge(board)==0)
		break; 
	
	}
	
	
	
}

这里不难看出,想要实现游戏功能,需要构造五个函数 最后再由game进行判断

目录

#1.棋盘的初始

#2.棋盘的展示

#3.玩家下棋

#4.电脑下棋

#5.判断输赢平局

#game函数对上述函数的调用

#1.棋盘的初始

棋盘的初始initial_board

void initial_board(char board[row][col]){
	for(int i=0;i<row;i++){
		for(int j=0;j<=col;j++){
			
			board[i][j]=' ';
		}
	}

这个没什么好说的,我们将board这个二维数组中的每个元素表示为稍后下棋时玩家和电脑的棋子

并把它的元素初始化为空格代表这里没有棋;为下一步搭建棋盘做准备

#2.棋盘的展示

棋盘的展示  displayboard

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

这里就是将棋盘一行行打印出来,使其可视化,方便玩家能够更好的下棋,值得注意的是,棋盘可以进行多次调试来达到竖线对齐与棋盘大小,棋子的形状,使棋盘更加美观.

#3.玩家下棋

玩家下棋 playergo

	void playergo(char board[row][col]){
		int x,y; 
		printf("轮到你下棋了\n");
		again:;
		printf("请输入你想下的坐标(1,1)~(3,3)\n");
		scanf("%d%d",&x,&y);
		if(x>3||y>3||x<1||y<1){
			printf("输入错误请重新输入");
			Sleep(1000);
			system("cls");
			goto again; 
		
		}
		
		
			if(board[x-1][y-1]!=' '){
			printf("该地方已经被下过棋了");
			Sleep(1000); 
			
			system("cls");
			goto again; 				
			}
			board[x-1][y-1]='*';
	}

玩家需要在一个3x3的格子中进行操作,执子*棋,所以需要进行判断,如果输出超过这个值则需要重新输入;并且已经下过的地方不允许再下棋,所以也需要进行判断.为了使游戏更加的可玩,玩家的印象中数值是从一开始而不是数组的零开始,所以需要进行设置.此外,为了使显示窗口更加简洁,输入完成后需要清屏,并且错误提示需要有sleep进行停留,使玩家能够看到.此程序中有goto语句 该语句破坏了c语言程序从上往下读的顺序,最好不要使用

#4.电脑下棋​​​​​​​

电脑下棋computergo

​​​​​​​电脑执#棋 这里的电脑由于作者能力有限,不会根据你下的步骤进行下棋,他下棋的地方是随机的,由rand()%2实现,rand()会随机生成一个数,%2以后取值刚刚好为0~2;所以将xy都写为随机值,并且判断棋盘上是否有棋,为了使得程序更加真实,好似对面坐着个人,你每一步棋他都会思索,所以也可以加上sleep函数

void computergo(char board[3][3]){
		int x,y;
		system("cls");
		printf("轮到电脑下棋\n");
		printf("电脑思索中\n");
		Sleep(2000);
		system("cls") ;
	
		again1:
       srand(time(0));
		x=rand()%2;
		y=rand()%2;
		
		if(board[x][y]!=' '){
		
			goto again1; 				
			}
		board[x][y]='#';
		 
		
		

#5.判断输赢平局

判断judge

这里通过遍历行.列.对角线判断输赢,如果棋盘全满了就输出平局 通过改变winner的符号进行判断和输出数值,值得注意的是,这个函数是既有返回值又有数值打印的,因此game调用时只需要用它做一次判断,不需要在单独执行一次,否则会打印出两个相同的结果

int  judge(char board[3][3]){
		char winner='x';
		int flag=0;
		for(int i=0;i<3;i++){
			for(int k=0;k<3;k++){
				if(board[i][k]==' ')
				flag++;
			}
		}
		if(flag==0)
		winner='p';
		else
		winner='x';
		if(board[0][0]==board[0][1]&&board[0][0]==board[0][2]&&board[0][0]!=' '){
			winner=board[0][0];
		}
		if(board[1][0]==board[1][1]&&board[1][0]==board[1][2]&&board[1][0]!=' '){
			winner=board[1][0];
			
		}
		if(board[2][0]==board[2][1]&&board[2][0]==board[2][2]&&board[2][0]!=' '){
			winner=board[2][0];
		}
		if(board[0][0]==board[1][0]&&board[0][0]==board[2][0]&&board[0][0]!=' '){
			winner=board[0][0];
		}
		if(board[0][2]==board[1][2]&&board[0][2]==board[2][2]&&board[0][2]!=' '){
			winner=board[0][2];
		}
		if(board[0][1]==board[1][1]&&board[0][1]==board[2][1]&&board[0][1]!=' '){
			winner=board[0][1];
		}
		if(board[0][0]==board[1][1]&&board[0][0]==board[2][2]&&board[0][0]!=' '){
			winner=board[0][0];
		}
		if(board[0][2]==board[1][1]&&board[0][2]==board[2][0]&&board[0][2]!=' '){
			winner=board[0][2];
		}
		
		if(winner=='#'){
			printf("电脑赢了  3秒后将选择是否重新游玩\n");
			Sleep(3000); 
			system("cls") ;
			return 0;
		}
		if(winner=='*'){
			printf("您赢了  3秒后将请选择是否重新游玩\n");
			Sleep(3000); 
			system("cls") ;
			return 0;
		}
		if(winner=='p'){
			printf("和棋了  3秒后将选择是否重新游玩\n");
			Sleep(3000); 
			system("cls") ;
			return 0;
		}
		if(winner=='x'){
			return 1; 
		}
		
		
		
		
		
	}

#game函数对上述函数的调用

game函数对上述函数的调用主要是通过while循环,进行生成棋盘,玩家下棋,电脑下棋,清空棋盘,并在玩家与电脑每次下棋后进行判断,若有一方获胜或平局则跳出循环并输出结果​​​​​​​

  • 24
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值