【C语言】简单实现三子棋
来源:互联网 发布:java数组调用方法 编辑:程序博客网 时间:2024/05/01 22:18
今天我们来完成一个三子棋的小游戏。
游戏要实现:
在3*3的棋盘上进行人机对弈,玩家输入棋盘坐标下棋,电脑通过产生随机数下棋。最终,谁先完成三子相连,就是赢家。
若在棋盘下满还未决出胜负,那就是平局。
为了完成这个游戏,我们要建立三个文件,分别为chessboard.h chessboard.c test.c
它们分别完成的任务是相关函数的声明,相关函数的实现,以及主函数。
我们先看chessboard.h完成的部分。
#define _CRT_SECURE_NO_WARNINGS 1#define rows 3//定义行数#define cols 3//定义列数void init_board(char board[rows][cols],int x,int y);//初始化棋盘void display_board(char board[rows][cols],int x,int y);//显示棋盘void player_move(char board[rows][cols],int x,int y);//玩家下棋void computer_move(char board[rows][cols]);//电脑下棋char check_win(char board[rows][cols],int x,int y);//判断输赢
再来看chessboard.c的部分。
#include "chessboard.h"#include<stdio.h>#include<stdlib.h>void init_board(char board[rows][cols],int x,int y)//初始化棋盘{int i=0;int j=0;for(i=0;i<x;i++){for(j=0;j<y;j++){board[i][j] = ' ';}}}void display_board(char board[rows][cols],int x,int y)//显示棋盘{int i;for(i=0;i<x;i++){printf("%c | %c | %c\n",board[i][0],board[i][1],board[i][2]);if(i<(x-1)){printf("---------\n");}}}void player_move(char board[rows][cols],int x,int y)//玩家下棋,玩家下‘x’{ int a = 0; int b = 0; while (1) { printf("玩家输入坐标:"); scanf("%d %d", &a, &b); if ((a > 0 && a <= x) && (b > 0 && b <= y)) //判断坐标是否合法,玩家输入的是坐标,而不是数组下标 { if (board[a - 1][b - 1] == ' ') //判断此处有没有被下棋 { board[a - 1][b - 1] = 'x'; break; } else { printf("此处已有棋子,不能下在此处.\n"); } } else { printf("坐标输入不合法\n"); } } }void computer_move(char board[rows][cols])//电脑下棋,电脑下‘0’{while (1) { int x = 0; int y = 0; x = rand() % 3;//让下标合法,取余后,能下的行数只能为0,1,2 y = rand() % 3;//取余后,能下的列数只能为0,1,2if (board[x][y] == ' ') { board[x][y] = '0'; break; } } }int board_full(char board[rows][cols],int x,int y)//检查棋盘是否有空位{int i=0,j=0;for(i=0;i<x;i++){for(j=0;j<y;j++){if(board[i][j]==' ')return 0;}}return 1;}char check_win(char board[rows][cols],int x,int y)//判断输赢{int i=0,j=0;//判断玩家的输赢,玩家下的是x, 赢得话就让它返回xint ret = board_full(board,rows,cols );for(i=0;i<x;i++){if ((board[i][0]==board[i][1]) && (board[i][1]==board[i][2]) && (board[i][0]=='x'))//判断一行的三个是否相等{return 'x';}}for(j=0;j<y;j++){if(( board[0][j]==board[1][j]) && (board[1][j]==board[2][j]) &&(board[0][j]=='x'))//判断一列的三个是否相等{return 'x';}}if((board[0][0]==board[1][1]) &&(board[1][1]==board[2][2]) &&(board[0][0]=='x'))//判断一条对角线的三个是否相等{return 'x';}if((board[0][2]==board[1][1]) && (board[1][1]==board[2][0]) &&(board[0][2]=='x'))//判断另一条对角线的三个是否相等{return 'x';}for(i=0;i<x;i++)//判断电脑的输赢,电脑下的是0, 赢得话就让它返回0,{if (( board[i][0]==board[i][1]) && (board[i][1]==board[i][2]) && (board[i][0]=='0')){return '0';}}for(j=0;j<y;j++){if(( board[0][j]==board[1][j]) && (board[1][j]==board[2][j]) &&(board[0][j]=='0')){return '0';}}if(( board[0][0]==board[1][1]) &&( board[1][1]==board[2][2]) &&(board[0][0]=='0')){return '0';}if(( board[0][2]==board[1][1]) && (board[1][1]==board[2][0]) &&(board[0][2]=='0')){return '0';}if(ret==1)//判断棋盘是否已下满{return 'm';}return ' ';}
最后我们来看test.c完成的部分。
#include "chessboard.h"#include<stdio.h>#include<stdlib.h>#include<windows.h>#include<time.h>void menu(){printf("********************************\n");printf("**********1->>开始游戏**********\n");printf("**********0->>游戏结束**********\n");printf("********************************\n");}void game(){int i=0,j=0;char rt = 0;char board[rows][cols]={ 0 } ;//rows 和 cols的值宏定义给出了srand((unsigned)time(NULL));//产生随机值的种子init_board(board,rows,cols);display_board( board,rows,cols);do{player_move(board,rows,cols);display_board( board,rows,cols);if((rt = check_win(board,rows,cols))!=' '){break;}printf("电脑正在下棋......\n");Sleep(1000);computer_move(board);display_board( board,rows,cols);rt = check_win(board,rows,cols);}while(rt==' ');if(rt=='0'){printf("电脑赢了!\n");}if(rt=='x'){printf("玩家赢了!\n");}if(rt=='m'){printf("这一场是平局!\n");}}int main(){int input = 0;do{menu();printf("请输入:");scanf("%d",&input);switch(input){case 1:game();break;case 0:printf("游戏结束!\n");break;default:printf("输入有误!!\n");break;}}while(input);return 0;}
以上就是三子棋的游戏全部程序。
其中有部分写的不是特别简介,还可以进一步优化。
如果您有什么更好的建议,可以给我留言。
0 0
- 【C语言】简单实现三子棋
- c语言简单实现三子棋
- c语言编程实现简单三子棋游戏
- c语言实现简单的三子棋
- c语言简单实现三子棋(五子棋)
- 用c语言实现简单三子棋游戏
- 用c语言简单实现三子棋游戏
- C语言三子棋的简单实现
- C语言实现简单的三子棋小游戏
- c语言编程实现简单三子棋游戏
- 简单五子棋----C语言实现
- C语言实现简单单链表
- C语言简单实现五子棋
- C语言简单实现接口
- c语言简单实现 扫雷
- C语言实现简单通讯录
- c语言简单实现队列
- c语言实现简单通讯录
- linux 查看内存
- 【web】模拟京东项目-demo01(广告栏、导航条)
- 动态自动匹配输入的控件AutoCompleteTextView和MultiAutoCompleteTextView
- redis异常记录
- "=="和equals()
- 【C语言】简单实现三子棋
- 【Light-oj】-1414 - February 29(容斥原理)
- 如何解决PHP里大量数据循环时内存耗尽的问题
- lnmp下安装phpmyadmin
- SSO单点登录之二:Yale CAS实现单点登录(服务器端)
- IntelliJ IDEA开发Spring mvc
- codeforces514c
- Yale CAS(耶鲁集中认证服务)简介
- 关于android屏幕适配的解决方案