基于C語言實現井字棋游戲
井字棋游戲要求在3乘3棋盤上,每行都相同或者每列都相同再或者對角線相同,則勝出.因此我們可以使用一個二維數組來表示棋盤,判斷勝負只需要判斷數組元素是否相同即可.具體我們可以分為以下幾步來做:
1.創(chuàng)建維數組并進行初始化,如果僅僅是一個二維數組來表示棋盤,看起來不是很清楚,因此我們可以對棋盤邊框用符號打印出來進行優(yōu)化一下:
//初始化棋盤
void init(char board[max_row][max_col]) {
for (int row = 0; row < max_row; row++) {
for (int col = 0; col < max_col; col++) {
board[row][col] =' ';
}
}
srand((unsigned int)time(0));
}
//打印棋盤
void print(char board[max_row][max_col]) {
system("cls");//每次打印之前清除掉上一次的結果.
for (int a = 0; a < max_col; a++) {
printf("+---+---+---+\n");
for (int b = 0; b < max_row; b++) {
printf("| %c ", board[a][b]);
}
printf("| \n");
}
printf("+---+---+---+\n");
}
2.進行玩家落子,同樣是使用數組操作,讓玩家輸入相對應的坐標,在二維數組的該位置打印'x'來表示玩家下的棋子
void play(char board[max_row][max_col]) {
printf("玩家落子階段!\n");
int a;
int b;
while (1) {
printf("請輸入想要落子的坐標: ");
scanf("%d %d", &a, &b);
//判定玩家落子坐標是否在有效范圍內
if (a < 0 || b < 0 || a >= max_row || b >= max_col) {
printf("輸入坐標有誤請重新輸入!\n");
continue;
}
//判定落子處是否已經存在了棋子
if (board[b][a] != ' ') {
printf("此處已被落子無法再落子,請重新輸入!\n");
continue;
}
board[b][a] = 'x'; //用'x'表示玩家落子
break;
}
}
3.玩家落子結束后讓電腦在二維數組中隨機落子,使用rand函數產生0到2的隨機數進行賦值操作,進而實現電腦隨機落子
void computer(char board[max_row][max_col]) {
printf("電腦落子階段!\n");
while (1) {
int a = rand() % max_row; //產生0到2的隨機數
int b = rand() % max_col;
if (board[a][b] != ' ') { //判斷所下位置是否已經有子
continue;
}
board[a][b] = 'o';
break;
}
4.判斷勝負,當玩家落子結束,或者電腦落子結束后,判斷是否存在某行或某列或者對角線有相同的元素,如果有則直接判定結果,如果沒有則輪到下家落子
char check(char board[max_row][max_col]) {
//檢測所有行是否相等
for (int cow = 0; cow < max_row; cow++) {
if (board[cow][0] != ' ' && board[cow][0] == board[cow][1] && board[cow][0]==board[cow][2] ) {
return board[cow][0];
}
}
//檢測所有列是否相等
for (int col = 0; col < max_col; col++) {
if (board[0][col] != ' ' && board[0][col] == board[1][col] && board[0][col]==board[2][col] ) {
return board[0][col];
}
}
//檢測對角線是否相等
if (board[0][0] != ' ' && board[0][0] == board[1][1] && board[0][0] == board[2][2]) {
return board[0][0];
}
if (board[0][2] != ' ' && board[0][2] == board[1][1] && board[0][2] == board[2][0]) {
return board[0][2];
}
if (pingju(board)) {
return 'q'; //棋子已滿和棋
}
return 'a'; //棋盤未滿
}
//判斷棋盤是否棋子已滿,如果滿了返回1,未滿返回0.
int pingju(char board[max_row][max_col]) {
for (int row = 0; row < max_row; row++) {
for (int col = 0; col < max_col; col++) {
if (board[row][col] == ' ') {
return 0;
}
}
}
return 1;
}
5.在主函數中調用以上函數,進行操作:
int main() {
char board[max_row][max_col] = {0};//數組初始化為0
char winner = 'n';
init(board); //將棋盤中元素初始化為空格
while (1) {
print(board); //打印棋盤
play(board); //玩家落子
winner = check(board); //判斷勝負
if (winner != 'a') {
break;
}
computer(board); //電腦落子
winner = check(board); //判斷勝負
if (winner != 'a') {
break;
}
}
if (winner == 'x') {
print(board);
printf("你贏了!");
}
else if (winner == 'o') {
print(board);
printf("你輸了!");
}
else if (winner == 'q') {
print(board);
printf("和棋!");
}
return 0;
在主函數中利用while循環(huán)來實現玩家與電腦的輪流落子,如果當一方落子之后勝負已出,則跳出循環(huán)直接打印最終結果.
完整代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define max_row 3
#define max_col 3
//初始化棋盤
void init(char board[max_row][max_col]) {
for (int row = 0; row < max_row; row++) {
for (int col = 0; col < max_col; col++) {
board[row][col] =' ';
}
}
srand((unsigned int)time(0));
}
//打印棋盤
void print(char board[max_row][max_col]) {
system("cls");//每次打印之前清除掉上一次的結果.
for (int a = 0; a < max_col; a++) {
printf("+---+---+---+\n");
for (int b = 0; b < max_row; b++) {
printf("| %c ", board[a][b]);
}
printf("| \n");
}
printf("+---+---+---+\n");
}
//玩家落子
void play(char board[max_row][max_col]) {
printf("玩家落子階段!\n");
int a;
int b;
while (1) {
printf("請輸入想要落子的坐標: ");
scanf("%d %d", &a, &b);
//判定玩家落子坐標是否在有效范圍內
if (a < 0 || b < 0 || a >= max_row || b >= max_col) {
printf("輸入坐標有誤請重新輸入!\n");
continue;
}
//判定落子處是否已經存在了棋子
if (board[a][b] != ' ') {
printf("此處已被落子無法再落子,請重新輸入!\n");
continue;
}
board[a][b] = 'x'; //用'x'表示玩家落子
break;
}
}
//
void computer(char board[max_row][max_col]) {
printf("電腦落子階段!\n");
while (1) {
int a = rand() % max_row; //產生0到2的隨機數
int b = rand() % max_col;
if (board[a][b] != ' ') { //判斷所下位置是否已經有子
continue;
}
board[a][b] = 'o';
break;
}
//
}
//
char check(char board[max_row][max_col]) {
//檢測所有行是否相等
for (int cow = 0; cow < max_row; cow++) {
if (board[cow][0] != ' ' && board[cow][0] == board[cow][1] && board[cow][0]==board[cow][2] ) {
return board[cow][0];
}
}
//檢測所有列是否相等
for (int col = 0; col < max_col; col++) {
if (board[0][col] != ' ' && board[0][col] == board[1][col] && board[0][col]==board[2][col] ) {
return board[0][col];
}
}
//檢測對角線是否相等
if (board[0][0] != ' ' && board[0][0] == board[1][1] && board[0][0] == board[2][2]) {
return board[0][0];
}
if (board[0][2] != ' ' && board[0][2] == board[1][1] && board[0][2] == board[2][0]) {
return board[0][2];
}
if (pingju(board)) {
return 'q';
}
return 'a';
}
//判斷棋盤是否棋子已滿,如果滿了返回1,未滿返回0.
int pingju(char board[max_row][max_col]) {
for (int row = 0; row < max_row; row++) {
for (int col = 0; col < max_col; col++) {
if (board[row][col] == ' ') {
return 0;
}
}
}
return 1;
}
int main() {
char board[max_row][max_col] = {0};//數組初始化為0
char winner = 'n';
init(board); //將棋盤中元素初始化為空格
while (1) {
print(board); //打印棋盤
play(board); //玩家落子
winner = check(board); //判斷勝負
if (winner != 'a') {
break;
}
computer(board); //電腦落子
winner = check(board); //判斷勝負
if (winner != 'a') {
break;
}
}
if (winner == 'x') {
print(board);
printf("你贏了!");
}
else if (winner == 'o') {
print(board);
printf("你輸了!");
}
else if (winner == 'q') {
print(board);
printf("和棋!");
}
return 0;
}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
delete[] p->elems和free(p->elems)區(qū)別介紹
delete[]和free()都是釋放內存的函數,但它們具有不同的使用方法和適用情況,這篇文章主要介紹了delete[] p->elems和free(p->elems)有什么區(qū)別,需要的朋友可以參考下2023-04-04

