❶ c語言編寫井字棋游戲 代碼已有半成品
你初始化一個字元數組,裡面都給他一樣的初始值 E
X 下了就改成X ,O 下了就改成 O,下完以後判斷橫豎斜三條線有沒有一樣的,
一共就九個格子,下一步就少一步 ,下之前判斷一下,如果等於E ,就是空的,可以放子。
下完一步總步數減一,你這樣不就能確定還有幾步可以走了。
九步都下完如果沒有橫豎斜都一樣的不就是平局嗎,所有數組元素的值都不等於E了不就結束了,或者九步完了也結束了
另外,少用GOTO ,變數定義最好有意義,寫點注釋
❷ c語言井字游戲的問題求助!
錯誤集中在下面這段語句,即輸入下棋位置的合理性判斷。
do
{
printf("Player %d,please enter where you want to put your %c:",player,(player==1)?'x':'o');
scanf("%d",&choice);
row=--choice/3;
column=--choice%3; // 第一處錯誤
}while(i<1||i>9||board[row][column]>'9'); // 第二處錯誤
第一處錯誤是:column=--choice%3;
原因:--運算符沒搞清楚。--運算符意思是先減一,再做別的運算。那麼,這句話就相當於 choice -= 1; coloumn = choice%3; 這樣就看出來, choice -= 1;這半句話是多餘的,只要出現在 row=--choice/3;這里就足夠了。
因為這里多運算了一次choice-1,所以輸入1的時候行運算正確而列運算少了1,要麼觸碰邊界,要麼遇到了其他格子。
由於--運算符很容易出錯,所以一般謹慎的程序員很少用,轉而用復雜的語句代替,至少意思比較明白。
第二處錯誤是: i<1||i>9
原因:i 這里應該是棋手的落子順序。第一手是0,判斷為棋手1。但是用在這個語句里明顯出錯。這個語句應當是判斷棋手落子的位置,即是不是下在棋盤外面,所以應當是choice<1 || choice>9,然而結合第一處錯誤,仍然是錯的,因為choice已經在計算row 和column的時候被改變了。
因為這處錯誤,第一手棋永遠無法走完,因為i初始值為0,滿足i<1這個條件,進而出現死循環
結合兩處錯誤,建議這樣改:
do
{
printf("Player %d,please enter where you want to put your %c:",player,(player==1)?'x':'o');
scanf("%d",&choice);
row=(choice-1)/3; // 修改
column=(choice-1)%3; // 修改
}while(choice<1||choice>9||board[row][column]>'9'); // 修改
❸ C語言 怎麼編程井字棋
一兩句話說不明白,你先做個簡單的流程規劃,把這個問題細化,然後再考慮每一步都需要怎麼做,比如需要建立幾個類,需要定義什麼變數,如何存貯等問題。這個必須一步步來,哪有你這樣解決問題的
❹ 用C語言,編程,求助大神
時間倉促,做得比較簡陋。
#include<stdio.h>
#include<windows.h>
#include<conio.h>
voidmenu();
voidgame();
intmain()
{
intn=0;
menu();
while(scanf("%d",&n))
{
system("cls");
menu();
switch(n)
{
case1:game();break;
case2:return0;
default:printf("請重新輸入:");
}
}
}
voidmenu()
{
printf("********** ");
printf("*井字棋小游戲* ");
printf("*按1開始游戲* ");
printf("*按2退出遊戲* ");
printf("********** ");
}
voidgame()
{
printf("請在小鍵盤輸入1-9");
intstep_number=1;
intboard[3][3]={0};
while(1)
{
charnum;
num=getch();
system("cls");
if(num=='1')board[2][0]+=step_number++;
if(num=='2')board[2][1]+=step_number++;
if(num=='3')board[2][2]+=step_number++;
if(num=='4')board[1][0]+=step_number++;
if(num=='5')board[1][1]+=step_number++;
if(num=='6')board[1][2]+=step_number++;
if(num=='7')board[0][0]+=step_number++;
if(num=='8')board[0][1]+=step_number++;
if(num=='9')board[0][2]+=step_number++;
for(inti=0;i<3;i++)//列印棋盤
{
printf(" ");
for(intj=0;j<3;j++)
{
if(board[i][j]==0)printf("_");
elseif(board[i][j]%2==1)printf("X");
elseif(board[i][j]%2==0)printf("O");
}
}
for(inti=0;i<3;i++)
{
if(board[i][0]!=0&&board[i][1]!=0&&board[i][2]!=0)
{
if(board[i][0]%2==1)
{
if(board[i][0]%2==board[i][1]%2&&board[i][0]%2==board[i][2]%2)
printf(" X方勝! ");
}
if(board[i][0]%2==0)
{
if(board[i][0]%2==board[i][1]%2&&board[i][0]%2==board[i][2]%2)
printf(" O方勝! ");
}
}
}
for(intj=0;j<3;j++)
{
if(board[0][j]!=0&&board[1][j]!=0&&board[2][j]!=0)
{
if(board[0][j]%2==1)
{
if(board[0][j]%2==board[1][j]%2&&board[0][j]%2==board[2][j]%2)
printf(" X方勝! ");
}
if(board[0][j]%2==0)
{
if(board[0][j]%2==board[1][j]%2&&board[0][j]%2==board[2][j]%2)
printf(" O方勝! ");
}
}
}
if(board[0][0]!=0&&board[1][1]!=0&&board[2][2]!=0)
{
if(board[0][0]%2==1)
{
if(board[0][0]%2==board[1][1]%2&&board[0][0]%2==board[2][2]%2)
printf(" X方勝! ");
}
if(board[0][0]%2==0)
{
if(board[0][0]%2==board[1][1]%2&&board[0][0]%2==board[2][2]%2)
printf(" O方勝! ");
}
}
if(board[0][2]!=0&&board[1][1]!=0&&board[2][0]!=0)
{
if(board[0][2]%2==1)
{
if(board[0][2]%2==board[1][1]%2&&board[0][2]%2==board[2][0]%2)
printf(" X方勝! ");
}
if(board[0][2]%2==0)
{
if(board[0][2]%2==board[1][1]%2&&board[0][2]%2==board[2][0]%2)
printf(" O方勝! ");
}
}
if(step_number>10)
{
printf("平局 ");
printf("按任意鍵回主菜單");
if(getchar())break;
}
}
}
❺ C++ 井字棋 (注釋) 一定要給注釋!!!
#include <stdio.h>
#include <stdlib.h>
#define SIZE 3
typedef enum {CBLANK, CBLACK, CWHITE} CHESS;
typedef enum {GM_WIN, GM_LOST, GM_UNKNOW, GM_ERROR} GAMEFLAG;
void init_board(CHESS board[SIZE][SIZE]) //初始化
{
int i, j;
for (i = 0; i < SIZE; i++)
{
for (j = 0; j < SIZE; j++)
{
board[i][j] = CBLANK;
}
}
}
void print_chess(CHESS board[SIZE][SIZE]) //列印棋盤
{
int i, j;
putchar(' ');
for (i=0; i < SIZE; i++)
{
printf("%2d", i+1);
}
putchar('\n');
for (i=0; i < SIZE; i++)
{
printf("%-2d", i+1);
for (j=0; j < SIZE; j++)
{
switch (board[i][j])
{
case CWHITE:
putchar('O');
break;
case CBLACK:
putchar('*');
break;
case CBLANK:
putchar('_');
break;
default:
putchar('?');
break;
}
putchar(' ');
}
putchar('\n');
}
}
void swc(CHESS chess, int *black, int *white, int *bmax, int *wmax) //判斷
{
switch (chess)
{
case CBLACK:
*white = 0;
(*black)++;
break;
case CWHITE:
*black = 0;
(*white)++;
break;
case CBLANK:
*black = 0;
*white = 0;
break;
default:
break;
}
if (*black > *bmax) *bmax = *black;
if (*white > *wmax) *wmax = *white;
}
GAMEFLAG res(CHESS board[SIZE][SIZE]) //判斷輸贏
{
int i, j;
int win[4] = {0, 0, 0, 0};
int rblack, rwhite, cblack, cwhite,
loblack = 0, lowhite = 0,
roblack = 0, rowhite = 0,
bmax = 0, wmax = 0;
for (i=0; i < SIZE; i++)
{
rblack = 0;
rwhite = 0;
cblack = 0;
cwhite = 0;
swc(board[i][i], &loblack, &lowhite, &bmax, &wmax);
swc(board[i][SIZE-i-1], &roblack, &rowhite, &bmax, &wmax);
for (j=0; j < SIZE; j++)
{
swc(board[i][j], &rblack, &rwhite, &bmax, &wmax);
swc(board[j][i], &cblack, &cwhite, &bmax, &wmax);
}
}
if (bmax >= 3)
{
if (wmax >= 3)
{
return GM_ERROR;
}
else
{
return GM_WIN;
}
}
else
{
if (wmax >= 3)
{
return GM_LOST;
}
else
{
return GM_UNKNOW;
}
}
}
int move(CHESS board[SIZE][SIZE], CHESS chs, int x, int y)
{
int bs = 1;
if (board[x][y])
bs = 0;
else if (y >= SIZE || y < 0 || x >= SIZE || x < 0)
bs = 0;
else
board[x][y] = chs;
return bs;
}
int main()
{
CHESS b[SIZE][SIZE];
char *msg[] = {"BLACK WIN!\n", "WHITE LOST!", "NOT YET", "ERROR!!"};
char *plr[] = {"NON", "BLACK", "WHITE"};
CHESS p = CBLACK;
GAMEFLAG flg;
init_board(b);
while ((flg = res(b)) == GM_UNKNOW)
{
int x, y, bmv = 1;
system("cls");
print_chess(b);
while (bmv)
{
printf("%s回合,輸入坐標:", plr[p]);
scanf("%d%d", &x, &y);
bmv = !move(b,p,x-1,y-1);
}
p = (CHESS)(CWHITE + CBLACK - p);
}
printf("%s", msg[flg]);
system("pause");
return 0;
}
有加分有注釋!!
❻ 用c語言寫井字棋游戲 求教一個問題
用char數組存棋盤,並記錄當前是玩家1還是玩家2。
如果用戶輸入0,首先判斷當前玩家是1還是2。如果是1,就board[0] = 'O';否則board[0] = 'X'。
偽代碼就類似於:
charboard[10]="";//初始為9個空格,並且多留一個位置放'